Как я могу открыть новый дисплей, когда исходящий вызов сделан в Android?
Я пытаюсь открыть намерение при исходящем звонке. Но приложение вылетает. Я что-то упустил или это нельзя сделать? Или есть ли способ открыть другой экран (действие / фрагмент) между событием создания вызова и событием получения вызова получателем?
1 ответ
Из блога разработчиков Android:
Прослушивание исходящих вызовов
Приложения, предоставляющие услуги телефонных звонков (например, VOIP или управление номерами), могут настраивать фильтры Intent для обработки запросов на исходящие вызовы, например, из набора номера или других установленных приложений. Это обеспечивает плавную интеграцию для пользователя, который может перейти непосредственно к вызывающей службе без повторного набора или запуска другого приложения.
Когда пользователь инициирует вызов, система уведомляет заинтересованные приложения, отправляя упорядоченную трансляцию
NEW_OUTGOING_CALL
Намерение, прикрепление исходного номера телефона, URI и другой информации в качестве дополнений. Это дает приложениям, таким как Google Voice и другим, возможность изменять, перенаправлять или отменять вызов до его передачи в телефонное приложение системы по умолчанию.Если вы хотите, чтобы приложение для телефонных вызовов могло обрабатывать запросы на исходящие вызовы, внедрите широковещательный приемник, который получает
NEW_OUTGOING_CALL
Намерение, обработка номера и инициирование вызова по мере необходимости. Убедитесь, что объявили фильтр намерений дляNEW_OUTGOING_CALL
в приемнике, чтобы система знала, что ваше приложение заинтересовано в трансляции. Вам также нужно будет запроситьPROCESS_OUTGOING_CALLS
разрешение на получение намерения.Обратите внимание, что система вещает
NEW_OUTGOING_CALL
только для номеров, которые не связаны с основными функциями набора, такими как номера экстренных служб. Это означает, чтоNEW_OUTGOING_CALL
не может препятствовать доступу к службам экстренной помощи, как вы используетеCALL_PRIVILEGED
может быть.Вот пример широковещательного приемника, объявленного в файле манифеста приложения:
<manifest> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <application> ... <receiver android:name=MyOutgoingCallHandler"> <intent-filter> <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> ... </application> </manifest>
Реализация соответствующего широковещательного приемника будет выглядеть примерно так:
public class MyOutgoingCallHandler extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Extract phone number reformatted by previous receivers String phoneNumber = getResultData(); if (phoneNumber == null) { // No reformatted number, use the original phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); } // My app will bring up the call, so cancel the broadcast setResultData(null); // Start my app to bring up the call ... } }
Поскольку
NEW_OUTGOING_CALL
При заказе широковещательной рассылки ваше приложение может выбрать, использовать ли сам запрос на вызов или просто обработать номер и передать полученные данные другим заинтересованным приложениям. В этом примере получатель широковещательной передачи вызывает телефонный звонок в своей собственной службе и устанавливает нулевые данные результата. Это препятствует тому, чтобы запрос вызова достиг телефонного приложения по умолчанию.