Информировать Android OS о видеозвонках и получать такие события от других приложений - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь использовать TelecomService для этой цели, но не могу совершать и принимать звонки с нашим строковым идентификатором пользователя.Я не хочу показывать интерфейс системного вызова, не хочу взаимодействовать с телефонной адресной книгой, просто хочу сообщить системе о начале / остановке видеовызова и получать события о вызовах из других приложений.Прежде всего, я создаю учетную запись пользователя в телекоммуникационном сервисе (согласно ответу prankstern1 на предыдущую тему: https://stackoverflow.com/a/55917774/1778879):

fun registerAccount(applicationContext: Context, label: String) {
        val telecomService = applicationContext.getSystemService(Context.TELECOM_SERVICE) as TelecomManager
        val accountHandle = getSavedAccount(applicationContext)
        var phoneAccount = telecomService.getPhoneAccount(accountHandle)
        if(phoneAccount == null) {
            val builder = PhoneAccount.builder(accountHandle, label)
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                builder.setCapabilities(PhoneAccount.CAPABILITY_SELF_MANAGED)
            }
            phoneAccount = builder.build()
            telecomService.registerPhoneAccount(phoneAccount)
        }
    }

    fun getSavedAccount(applicationContext: Context) : PhoneAccountHandle {
        val phoneAccountLabel = BuildConfig.APPLICATION_ID
        val componentName = ComponentName(applicationContext, TalkoutTelecomService::class.java)
        return PhoneAccountHandle(componentName, phoneAccountLabel)
    }

Реализация ConnectionService (согласно этому руководству: https://developer.android.com/guide/topics/connectivity/telecom/selfManaged):

override fun onCreateOutgoingConnection(connectionManagerPhoneAccount: PhoneAccountHandle?, request: ConnectionRequest?): Connection {
    val telecomService = applicationContext.getSystemService(Context.TELECOM_SERVICE) as TelecomManager
    val phoneAccount = telecomService.getPhoneAccount(connectionManagerPhoneAccount)
    val connection = TalkoutConnection()
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        connection.connectionProperties = PROPERTY_SELF_MANAGED
    }
    connection.setCallerDisplayName(phoneAccount.label.toString(), PRESENTATION_ALLOWED)
    if(request != null) {
        connection.setVideoState(request.videoState)
    }
    connection.setIncominCallExtras(request?.extras)
    return connection
}

override fun onCreateOutgoingConnectionFailed(connectionManagerPhoneAccount: PhoneAccountHandle?, request: ConnectionRequest?) {
    //TODO: implement
}

override fun onCreateIncomingConnection(connectionManagerPhoneAccount: PhoneAccountHandle?, request: ConnectionRequest?): Connection {
    val connection = TalkoutConnection()
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        connection.connectionProperties = PROPERTY_SELF_MANAGED
    }
    if(request != null) {
        val telecomService = applicationContext.getSystemService(Context.TELECOM_SERVICE) as TelecomManager
        val phoneAccount = telecomService.getPhoneAccount(request.accountHandle)
        connection.setCallerDisplayName(phoneAccount.label.toString(), PRESENTATION_ALLOWED)
    }
    if(request != null) {
        connection.setVideoState(request.videoState)
    }
    return connection
}

override fun onCreateIncomingConnectionFailed(connectionManagerPhoneAccount: PhoneAccountHandle?, request: ConnectionRequest?) {
    //TODO: implement
}

Выполнение исходящего вызова:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    val telecomService = context.getSystemService(Context.TELECOM_SERVICE) as TelecomManager
                    try {
                        val uri = Uri.parse(String.format("myapp://%s", teacherInfo.name))
                        val accountHandle = TalkoutTelecomService.getSavedAccount(context)
                        val callBundle = Bundle()
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                            callBundle.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, accountHandle)
                            try {
                                telecomService.placeCall(uri, callBundle)
                            } catch (e: Throwable) {
                                e.printStackTrace()
                            }
                        }
                    } catch (e: Throwable) {
                        e.printStackTrace()
                    }
                }
            }

Когда я пытаюсь выполнить вызов, я вижу диалоговое окно «Неверный номер» и ничего более: нет вызова onCreateOutgoingConnection в моем ConnectionService, нетВызов onShowIncomingCallUi в подклассе Connection.

Получение вызова:

val telecomService = getSystemService(Context.TELECOM_SERVICE) as TelecomManager
                              val accountHandle = TalkoutTelecomService.getSavedAccount(applicationContext)
                              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                  bundle.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, accountHandle)
                                  telecomService.addNewIncomingCall(accountHandle, bundle)
                              }

Или, может быть, есть другой способ перехватить вызовы других приложений, запущенные с помощью уведомлений? TelecomManager, кажется, не работает. Возможно ли этоиспользовать его без телефонных номеров, но с строковыми идентификаторами пользователей нашего приложения?

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