将 telecomManager 与我们的自定义协议一起使用
Using telecomManager with our custom protocol
我正在尝试使用本指南实现与电信服务的互连:https://developer.android.com/guide/topics/connectivity/telecom/
我已经可以在没有电信服务的情况下显示我自己的全屏来电 UI,拨打和接听视频电话。所有,我想用 Telecomservice 做的,只是告诉 Android OS,我们的应用程序在特定时刻是 starting/stopping 视频通话,并接收来自其他人的通话 holded/unholded 事件调用应用程序。
主要问题是:
1) addNewIncomingCall 在传入呼叫的情况下不执行任何操作:onCreateIncomingConnection 回调未触发(甚至我的 ConnectionService 的 onCreate 回调根本未触发)。为什么连接服务没有启动?
2) 在拨出电话的情况下,placeCall 会尝试使用我们的用户 ID 打开系统呼叫应用程序,将其称为 phone 或 SIP 号码。我可以在没有系统的情况下使用 placeCall UI?
或者,如果我只想通知系统有关视频通话的信息,我可以使用除 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
}
您似乎想使用 self-managed connection service 来实现该应用。
检查您是否有权限:
- MANAGE_OWN_CALLS
- READ_CALL_LOG
- READ_PHONE_STATE
使用 CAPABILITY_SELF_MANAGED 注册 phone 帐户。
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 https://whosebug.com/users/4466771/prankstern1 发布了这个示例,它有效,但我仍然找不到,我的代码有什么问题:)
额外的服务,例如示例中的 CallService 仅用于连接监听,可以用 GreenRobot 的 eventbus 或 Rx 代替以简化
我正在尝试使用本指南实现与电信服务的互连:https://developer.android.com/guide/topics/connectivity/telecom/
我已经可以在没有电信服务的情况下显示我自己的全屏来电 UI,拨打和接听视频电话。所有,我想用 Telecomservice 做的,只是告诉 Android OS,我们的应用程序在特定时刻是 starting/stopping 视频通话,并接收来自其他人的通话 holded/unholded 事件调用应用程序。
主要问题是:
1) addNewIncomingCall 在传入呼叫的情况下不执行任何操作:onCreateIncomingConnection 回调未触发(甚至我的 ConnectionService 的 onCreate 回调根本未触发)。为什么连接服务没有启动?
2) 在拨出电话的情况下,placeCall 会尝试使用我们的用户 ID 打开系统呼叫应用程序,将其称为 phone 或 SIP 号码。我可以在没有系统的情况下使用 placeCall UI?
或者,如果我只想通知系统有关视频通话的信息,我可以使用除 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
}
您似乎想使用 self-managed connection service 来实现该应用。
检查您是否有权限:
- MANAGE_OWN_CALLS
- READ_CALL_LOG
- READ_PHONE_STATE
使用 CAPABILITY_SELF_MANAGED 注册 phone 帐户。
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 https://whosebug.com/users/4466771/prankstern1 发布了这个示例,它有效,但我仍然找不到,我的代码有什么问题:) 额外的服务,例如示例中的 CallService 仅用于连接监听,可以用 GreenRobot 的 eventbus 或 Rx 代替以简化