Замена стандартного приложения 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, чтобы узнать, что вам нужно сделать, чтобы обрабатывать сами вызовы.

Вот код для приложения, которое реализует минимум, необходимый для обработки набора номера и принятия / отклонения / завершения вызовов в своем собственном пользовательском интерфейсе:

https://github.com/arekolek/simple-phone