Android Twilio视频通话,唤醒应用程序并进入前台

时间:2018-07-27 14:40:14

标签: android video twilio call voip-android

我正在尝试通过Twilio视频通话提供本地视频通话体验。这是场景:

  1. 个人AAA呼叫个人BBB。
  2. 人员BBB没有打开应用程序,在后台或前景中,应用程序处于终止状态,甚至可能已锁定电话。
  3. 当来自AAA的呼叫到达时,将使用带有应答按钮的视频ui打开该应用程序。就像在WhatsApp,Google Duo,Skype中一样...

我们有FCM,并且正在收到推送通知。尝试在通话到达时立即打开视频通话接听按钮,而不单击通知,就像在Whatsapp,Google Duo ...(在Android手机中)

我们试图在后台运行一个带有套接字的服务。当向套接字发出传入呼叫事件时,套接字将监听传入的呼叫并打开VideoCallActivity。

这是我们最好的选择,但到目前为止没有成功。您将如何实现此功能?

1 个答案:

答案 0 :(得分:4)

所以我们已经找到了解决方案(当收到通知时,将应用程序置于前台),即使已经有一段时间了,我也要发布它:

  1. FCM通知(firebase云消息传递通知)仅需要在通知中发送“数据”。因此,通知的JSON结构中没有Notification对象,只有数据。这样,通知便由您应用的FirebaseMessagingService.java类处理。请详细阅读以下内容,以了解如何处理两种FCM通知类型。 https://firebase.google.com/docs/cloud-messaging/android/receive https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages

  2. 在FirebaseMessagingService.java类中,使用Intent启动VideoCall活动。不要忘记将此服务添加到Manifest.xml

            Intent intent = new Intent(this, VideoCallActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            getApplicationContext().startActivity(intent);
    
  3. 在VideoCall活动中,确保在onCreate()的开头具有以下代码:

    // These flags ensure that the activity can be launched when the screen is locked.
    Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    
    // to wake up screen
    PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TAG");
    wakeLock.acquire();
    
    // to release screen lock
    KeyguardManager keyguardManager = (KeyguardManager) getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE);
    KeyguardManager.KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("TAG");
    keyguardLock.disableKeyguard();
    
  4. 使用适当的意图过滤器将VideoCallActivity添加到Manifest.xml中:

    <!-- Video Call --> <activity android:name=".ui.activities.video_call.VideoCallActivity" android:launchMode="singleTop" android:screenOrientation="portrait" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <!-- Note: these actions are notification actions --> <action android:name="VIDEO_CALLING" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>

可选: 要使手机响起并振动:

// For Incoming Call
// 1. declare
private MediaPlayer incomingCallMediaPlayer;
// .2 in onCreate, if I'm the person that's calling, ring the phone 
incomingCallMediaPlayer = MediaPlayer.create(this, R.raw.incoming);
incomingCallMediaPlayer.setLooping(true);
incomingCallMediaPlayer.start();
// 3. when I pick up, stop the player
incomingCallMediaPlayer.stop();

// I play R.raw.incoming if I'm being called.
// I play R.raw.outgoing when I'm calling.
// I understand if I'm the one calling from the number of participants in the "room" (this is a video call terminology) and by passing in a variable through the intent

// For Outgoing Call
// 1. declare
private MediaPlayer callingMediaPlayer;
// 2. in onCreate, if I'm being called, ring the phone
callingMediaPlayer = MediaPlayer.create(this, R.raw.outgoing);
callingMediaPlayer.setLooping(true);
callingMediaPlayer.start();
// 3. when another "participant" (this is a video call terminology) joins the "room" I stop playing the sound
callingMediaPlayer.stop();

// to Vibrate, add the code with the media players and stop vibrate with media players
//https://stackoverflow.com/questions/13950338/how-to-make-an-android-device-vibrate