Замена в приложении вызова
Фон
Я пытаюсь разработать действительно простое приложение для вызовов, чтобы заменить стандартную версию. По сути, я просто хочу отвечать на входящие вызовы и предоставлять пользователю действительно простой пользовательский интерфейс. Там нет необходимости для исходящих звонков или каких-либо модных вещей.
Поиск в сети я нашел пакет android.telecom.incallservice
(доступно в API 23). Этот сервис реализуется любым приложением, которое хочет предоставить пользовательский интерфейс для управления телефонными звонками.
Это кажется многообещающим, но у меня проблемы с тем, чтобы заставить его работать. Я создал простой сервис, расширяющий InCallService, и объявил его в своем манифесте, как описано в документации. Тем не менее, я ожидал, что смогу изменить приложение телефона по умолчанию в настройках на свое собственное, но я могу найти только стандартное приложение телефона.
Код
Это декларация манифеста из документов. Я заменил BIND_IN_CALL_SERVICE
с BIND_INCALL_SERVICE
так как я предполагаю, что это опечатка.
<service android:name="your.package.YourInCallServiceImplementation" android:permission="android.permission.BIND_INCALL_SERVICE">
<meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" />
<intent-filter>
<action android:name="android.telecom.InCallService"/>
</intent-filter>
</service>
Вопросы
Возможно ли даже стороннему приложению заменить приложение по умолчанию в приложении вызовов?
Есть ли примеры реализаций, использующие этот API, которые я могу использовать в качестве ссылки? Я нашел реализацию Google, но это системное приложение, которое использует некоторые разрешения, которые недоступны для других приложений (например:
android.permission.MODIFY_PHONE_STATE
).Я прав в предположении, что после предоставления правильного
InCallService
регистрация манифеста и реализация заглушки, я мог ожидать найти мое приложение подDefault Apps -> Phone
? Нужно ли декларировать что-то еще?
Благодарю.
1 ответ
В соответствии с документами и когда вы сами комментируете, вам нужно добавить это в свой манифест:
<service android:name="your.package.YourInCallServiceImplementation"
android:permission="android.permission.BIND_INCALL_SERVICE">
<meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" />
<intent-filter>
<action android:name="android.telecom.InCallService"/>
</intent-filter>
</service>
android:name
должен быть заменен классом, который реализует этот сервис.
<activity android:name="your.package.YourDialerActivity">
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
android:name
должен быть заменен классом, который реализует основное действие для вашей собственной реализации номеронабирателя.
Здесь вы можете найти больше информации об этом: https://developer.android.com/guide/topics/connectivity/telecom/selfManaged
А вот пример проекта, который вы можете использовать в качестве руководства: https://github.com/arekolek/simple-phone
- Возможно ли даже стороннему приложению заменить приложение по умолчанию в приложении вызовов?
Да, начиная с API 23 это возможно.
- Есть ли примеры реализаций, использующие этот API, которые я могу использовать в качестве ссылки? Я нашел реализацию Google, но это системное приложение, которое использует некоторые разрешения, которые недоступны для других приложений (например:
android.permission.MODIFY_PHONE_STATE
).
Единственный известный мне пример - это созданный мной пример https://github.com/arekolek/simple-phone который уже упоминался в другом ответе.
- Я прав в предположении, что после предоставления правильного
InCallService
регистрация манифеста и реализация заглушки, я мог ожидать найти мое приложение подDefault Apps -> Phone
? Нужно ли декларировать что-то еще?
Вообще-то, нет.
Как упомянуто в другом ответе по теме, вам не нужно InCallService
вообще, чтобы появиться в этом списке.
Тем не менее, вам нужно зарегистрировать действие с двумя фильтрами намерений, один с tel
Схема Uri и схема с пустой схемой (недостаточно иметь только одну из них):
<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>
Это смутно упомянуто в документации и явно указано в коде AOSP.
Этого достаточно, чтобы появиться в этом списке. Только тогда, чтобы предоставить пользовательский интерфейс для вызова, вам действительно понадобится InCallService
,