4

Я пытаюсь создать новый PhoneAccount, чтобы использовать мою реализацию ConnectionService. В документации говорится, что мне нужно зарегистрировать новый PhoneAccount с TelecomManager, а затем выбрать его в настройках моего телефона-приложения.Android: зарегистрируйтесь новый PhoneAccount для телекоммуникации

Вот мой код:

TelecomManager telecomManager = (TelecomManager) getSystemService(Context.TELECOM_SERVICE); 

ComponentName componentName = newComponentName("se.example.connectionservicestandalonetest", "se.example.connectionservicestandalonetest.MyConnectionService"); 
PhoneAccountHandle phoneAccountHandle = new PhoneAccountHandle(componentName, "Admin"); 
PhoneAccount phoneAccount = PhoneAccount.builder(phoneAccountHandle, "Admin").build(); 

telecomManager.registerPhoneAccount(phoneAccount); 

Как вы можете видеть, он создает новый ComponentName, который указывает в направлении моей реализации ConnectionService, а затем создает новый PhoneAccountHandle где я поставку ComponentName и уникальный имя аккаунта. Затем я создаю PhoneAccountHandle в сборках PhoneAccount, а также метку (имя?) Для создания нового PhoneAccount. Наконец, я зарегистрирую учетную запись в telecomManager.

Когда я открываю приложение для телефона, ничего не изменилось. Я не вижу, где бы я мог изменить PhoneAccount ... Любые идеи?

Спасибо!

+1

И, наконец, получил его на работу. Похоже, что эмулятор не предоставляет способ использования учетной записи телефона. Используя Xperia Z3, я смог найти его в разделе «Настройки»> «Вызов»> «Учетные записи».Обратите внимание, что вам необходимо предоставить возможность (поскольку по умолчанию это ни один, и учетная запись не будет отображаться) в построителе. – ProfessorChaos

+0

Обновление: в эмуляторе можно также изменить намерение TelecomManager.ACTION_CHANGE_PHONE_ACCOUNTS. – ProfessorChaos

+1

Какие возможности необходимы для работы телефона? –

ответ

3

У меня есть информация, что я просто оставлю здесь для потомков.

При создании вашего PhoneAccount, вы должны добавить CAPABILITY_CALL_PROVIDER, если делать и принимать звонки на свой собственный, или CAPABILITY_CONNECTION_MANAGER, если вы хотите сделать или принимать звонки, используя встроенный PhoneAccount. Без этого вы не будете отображаться в пользовательском интерфейсе.

Насколько я могу судить, нет специального API для проверки того, разрешил ли пользователь PhoneAccount. Однако вы можете использовать TelecomManager. addNewIncomingCall для этой цели. Просто укажите Bundle, содержащий булевский дополнительный (названный как угодно) и установите значение boolean на true, если вы действительно получаете звонок или false, если хотите просто выполнить проверку разрешения (или наоборот). Тогда ваша реализация ConnectionService. onCreateIncomingConnection может проверить вашу дополнительную сумму и вернуть Connection. createCanceledConnection, если вы просто выполняете проверку разрешения. Это не регистрируется как вызов в журнале вызовов, и мелодия звонка никогда не воспроизводится. addNewIncomingCall будет выбрасывать, если ваш PhoneAccount не включен и успешно, если он есть.

Как указано в комментариях выше, вы можете предложить пользователю включить PhoneAccount с помощью TelecomManager. ACTION_CHANGE_PHONE_ACCOUNTS. Поскольку пользователь может включить или отключить ваш PhoneAccount в любое время, все операции, требующие активированного PhoneAccount (например, addNewIncomingCall), должны быть размещены в блоке try.

+0

спасибо, что поделились этим. Я не был уверен, как проверить, включен ли PhoneAccount или нет, но ваш метод - отличное решение. –

0

В качестве дополнения к ответу j__m; я нашел способ проверить, если телефон учетная запись будет активирована без установки вызова:

private boolean checkAccountConnection(Context context) { 
    boolean isConnected = false; 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { 
      final List<PhoneAccountHandle> enabledAccounts = telecomManager.getCallCapablePhoneAccounts(); 
      for (PhoneAccountHandle account : enabledAccounts) { 
       if (account.getComponentName().getClassName().equals(MyConnectionService.class.getCanonicalName())) { 
        isConnected = true; 
        break; 
       } 
      } 
     } 

    } 
    return isConnected; 
} 

Как указано в Javadoc для android.telecom.TelecomManager.getCallCapablePhoneAccounts ()

Возвращает список {@link PhoneAccountHandle}, который может использоваться для совершения и получения телефонных звонков. Возвращенный список включает только те учетные записи, которые явно разрешены пользователем.

+0

PermissionHelper - не найдено –

+0

Это хороший способ пойти, если вам уже нужно разрешение READ_PHONE_STATE, хотя я надеюсь, что никто не требует этого разрешения, просто чтобы сделать эту проверку. –

+0

@VineeshTP: Я заменил класс утилиты PermissionHelper фактическим кодом, который он выполняет. Теперь образец кода должен быть последовательным. – FightingDragon