Замена в приложении вызова

Фон

Я пытаюсь разработать действительно простое приложение для вызовов, чтобы заменить стандартную версию. По сути, я просто хочу отвечать на входящие вызовы и предоставлять пользователю действительно простой пользовательский интерфейс. Там нет необходимости для исходящих звонков или каких-либо модных вещей.

Поиск в сети я нашел пакет 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>

Вопросы

  1. Возможно ли даже стороннему приложению заменить приложение по умолчанию в приложении вызовов?

  2. Есть ли примеры реализаций, использующие этот API, которые я могу использовать в качестве ссылки? Я нашел реализацию Google, но это системное приложение, которое использует некоторые разрешения, которые недоступны для других приложений (например: android.permission.MODIFY_PHONE_STATE).

  3. Я прав в предположении, что после предоставления правильного 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

И это: /questions/46908617/zamena-standartnogo-prilozheniya-phone-na-android-6-i-7-s-incallservice/46908641#46908641

  1. Возможно ли даже стороннему приложению заменить приложение по умолчанию в приложении вызовов?

Да, начиная с API 23 это возможно.

  1. Есть ли примеры реализаций, использующие этот API, которые я могу использовать в качестве ссылки? Я нашел реализацию Google, но это системное приложение, которое использует некоторые разрешения, которые недоступны для других приложений (например: android.permission.MODIFY_PHONE_STATE).

Единственный известный мне пример - это созданный мной пример https://github.com/arekolek/simple-phone который уже упоминался в другом ответе.

  1. Я прав в предположении, что после предоставления правильного 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,

Другие вопросы по тегам