Использование telecomManager с нашим пользовательским протоколом - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь установить соединение с услугой связи с помощью этого руководства: https://developer.android.com/guide/topics/connectivity/telecom/

Я уже могу показать свой собственный полноэкранный интерфейс входящего вызова без службы связи, сделать и получить видеозвонки.Все, что я хочу сделать с Telecomservice, это просто сообщить ОС Android, что наше приложение запускает / останавливает видеовызов в определенный момент и получает события удержания / удержания вызова от других вызывающих приложений.

Основные проблемы:

1) addNewIncomingCall в случае входящего вызова ничего не делает: обратный вызов onCreateIncomingConnection не сработал (даже обратный вызов onCreate моего ConnectionService вообще не сработал).Почему услуга подключения не запускается?

2) в случае исходящего звонка placeCall пытается открыть приложение системного вызова с нашим идентификатором пользователя, вызвать его как телефон или номер SIP.Могу ли я использовать placeCall без системного интерфейса?

Или, если я просто хочу сообщить системе о видеовызове, я могу использовать другую опцию, кроме TelecomService?

Соединение создано следующим образом:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        connection?.connectionProperties = Connection.PROPERTY_SELF_MANAGED
    }
    connection?.connectionCapabilities = Connection.CAPABILITY_HOLD and Connection.CAPABILITY_SUPPORT_HOLD
    connection?.setVideoState(VideoProfile.STATE_BIDIRECTIONAL)

Звонок:

val telecomService = context.getSystemService(Context.TELECOM_SERVICE) as TelecomManager
                    try {
                        val uri = Uri.fromParts(PhoneAccount.SCHEME_SIP, teacherInfo.name, null)
                        telecomService.placeCall(uri, Bundle.EMPTY)
                    } catch (e: Throwable) {
                        e.printStackTrace()
                    }

Прием звонка:

val telecomService = applicationContext.getSystemService(Context.TELECOM_SERVICE) as TelecomManager
                      try {
                          Log.d("VideoCOnnection", "addNewIncomingCall")
                          telecomService.addNewIncomingCall(CallUtils.getAccountConnection(telecomService), Bundle.EMPTY)
                      } catch (e: Throwable) {
                          Log.d("VideoCOnnection", "crash")
                          e.printStackTrace()
                      }


@SuppressLint("MissingPermission")
fun getAccountConnection(teleconManager: TelecomManager) : PhoneAccountHandle? {
    return if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        val enabledAccounts = teleconManager.callCapablePhoneAccounts
        for(account in enabledAccounts) {
            if(account.componentName.className.equals(BindTelecomService::class.java.canonicalName)) {
                return account
            }
        }
        return null
    } else
        null
}

Ответы [ 2 ]

0 голосов
/ 25 июля 2019

https://github.com/pranksterN1/TComTest https://stackoverflow.com/users/4466771/prankstern1 опубликовал этот пример, который сработал, но я до сих пор не могу найти, что не так с моим кодом :) Дополнительные службы, такие как CallService из примера, используются только для прослушивания соединения, и может быть заменен на EventRus GreenRobot или Rx для упрощения

0 голосов
/ 30 апреля 2019

Похоже, что вы хотите реализовать приложение с службой самоуправляемых соединений .

Проверьте, есть ли у вас разрешения:

  • MANAGE_OWN_CALLS
  • READ_CALL_LOG
  • READ_PHONE_STATE

Зарегистрируйте учетную запись телефона с помощью CAPABILITY_SELF_MANAGED.

final String phoneAccountLabel = "myPhoneApp";

ComponentName connectionServiceName = new ComponentName(context.getApplicationContext(), TcService.class);
accountHandle = new PhoneAccountHandle(connectionServiceName, phoneAccountLabel);

PhoneAccount phoneAccount = telecom.getPhoneAccount(accountHandle);
if (phoneAccount == null) {
    PhoneAccount.Builder builder = PhoneAccount.builder(accountHandle, phoneAccountLabel);
    builder.setCapabilities(PhoneAccount.CAPABILITY_SELF_MANAGED);
    phoneAccount = builder.build();
    telecom.registerPhoneAccount(phoneAccount);
}

Когда вы добавляете новые входящие или исходящие звонки, вы должны добавить дополнительные EXTRA_PHONE_ACCOUNT_HANDLE.

Uri uri = generateCallUri();
extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, accountHandle);
telecom.addNewIncomingCall(accountHandle, extras);

Обновление : есть пример

...