Замена стандартного приложения Phone на Android 6 и 7 с InCallService
Android API уровня 23 добавлен InCallService
предоставить пользовательский интерфейс для управления телефонными звонками. В документации приведен пример регистрации манифеста, но я не смог заставить его работать. Приложение компилируется нормально, но приложение по умолчанию в настройках не показывает мое приложение.
Единственное место, где я нашел какую-либо информацию о предмете, был вопрос Stackru, который был закрыт год назад. Комментарий к этому вопросу предлагается добавить android.intent.action.DIAL
активность, но это также не помогло мне. Я пробовал различные комбинации других намерений тоже (android.intent.action.CALL_DIAL
а также android.intent.action.ANSWER
) в моей деятельности.
Есть ли рабочие примеры кода, необходимого для замены приложения телефона? Должны ли классы предоставлять некоторые рабочие методы для показа приложения?
1 ответ
Приложение компилируется нормально, но приложение по умолчанию в настройках не показывает мое приложение.
Чтобы ваше приложение было указано в качестве приложения "Телефон", вы должны выполнить действие, по крайней мере, с этими фильтрами намерений (для обработки обоих случаев, упомянутых в документации по ACTION_DIAL, также упомянутой в скрытом классе DefaultDialerManager):
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<data android:scheme="tel" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.DIAL" />
</intent-filter>
И, честно говоря, это немного нелогично, поскольку настройка приложения "Телефон" по умолчанию отделена от настройки "Звонилки" по умолчанию - первый контролирует только интерфейс текущего вызова, а второй - только интерфейс набора номера.
Вышеупомянутый минимум может быть немного улучшен, чтобы разрешить установку вашей звонилки по умолчанию и запуск из веб-браузера, используя вместо этого следующие фильтры намерений:
<intent-filter>
<!-- Handle links from other applications -->
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.DIAL" />
<!-- Populate the system chooser -->
<category android:name="android.intent.category.DEFAULT" />
<!-- Handle links in browsers -->
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tel" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
В приложении Dialer в AOSP заявлено еще больше фильтров.
Вы можете упростить пользователю установку приложения в качестве приложения для телефона по умолчанию с помощью TelecomManager
:
if (getSystemService(TelecomManager::class.java).defaultDialerPackage != packageName) {
Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER)
.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName)
.let(::startActivity)
}
Это покажет диалог, подобный этому:
Обратитесь к разделу "Ответ на входящий вызов" с помощью android.telecom и InCallService, чтобы узнать, что вам нужно сделать, чтобы обрабатывать сами вызовы.
Вот код для приложения, которое реализует минимум, необходимый для обработки набора номера и принятия / отклонения / завершения вызовов в своем собственном пользовательском интерфейсе: