Использование telecomManager с нашим пользовательским протоколом
Я пытаюсь реализовать соединение с телекоммуникационным сервисом с помощью этого руководства: https://developer.android.com/guide/topics/connectivity/telecom/
Я уже могу показать свой собственный полноэкранный интерфейс входящего вызова без услуги Телеком, совершать и принимать видеозвонки. Все, что я хочу сделать с Telecom service, это просто сообщить ОС 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
}
0 ответов
Похоже, вы хотите реализовать приложение со службой подключения, управляемой самостоятельно.
Проверьте, что у вас есть разрешения:
- 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);
https://github.com/pranksterN1/TComTest pranksterN1 опубликовал этот пример, который сработал, но я до сих пор не могу найти, что не так с моим кодом:) Дополнительные сервисы, такие как CallService из примера используется только для прослушивания соединения и может быть заменен на шину событий GreenRobot или Rx для упрощения