Android Twilio Video Call, проснись приложение и вывести на передний план
Я пытаюсь обеспечить удобство работы с видеозвонками с помощью Twilio Video Call. Вот сценарий:
- Человек ААА звонит человеку ВВВ.
- Человек BBB не имеет открытого приложения, в фоновом режиме или на переднем плане, приложение находится в отключенном состоянии, телефон может быть даже заблокирован.
- Когда приходит звонок от AAA, приложение открывается с помощью видеоинтерфейса с кнопкой ответа. Так же, как в WhatsApp, Google Duo, Skype...
У нас есть FCM, и мы получаем push-уведомление. Попытка открыть кнопку ответа на видеозвонок в момент поступления звонка, не нажимая на уведомление, как в Whatsapp, Google Duo... (в телефонах Android)
Мы попытались запустить службу в фоновом режиме с открытым сокетом. Сокет будет прослушивать входящие вызовы и открывать VideoCallActivity, когда в сокет отправляется событие входящего вызова.
Это была наша лучшая ставка, но пока безуспешно. Как бы вы достигли этой функциональности?
1 ответ
Итак, мы разобрались с этим решением (когда приходит уведомление, выведите приложение на передний план), и я выкладываю его, хотя это было давно:
Уведомление FCM (уведомление об отправке сообщений в облачной базе Firebase) должно отправлять только "данные" в уведомлении. Поэтому в структуре JSON уведомления нет объекта Notification, только данные. Таким образом, уведомление обрабатывается классом FirebaseMessagingService.java вашего приложения. Пожалуйста, прочитайте подробно ниже, чтобы понять, как обрабатываются 2 типа уведомлений FCM. https://firebase.google.com/docs/cloud-messaging/android/receive https://firebase.google.com/docs/cloud-messaging/concept-options
В классе FirebaseMessagingService.java запустите действие 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);
В действии 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();