Я пытаюсь использовать 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, кажется, не работает. Возможно ли этоиспользовать его без телефонных номеров, но с строковыми идентификаторами пользователей нашего приложения?