将 teleManager 与我们的自定义协议一起使用
Posted
技术标签:
【中文标题】将 teleManager 与我们的自定义协议一起使用【英文标题】:Using telecomManager with our custom protocol 【发布时间】:2019-05-20 23:04:42 【问题描述】:我正在尝试通过本指南实现与电信服务的互连:https://developer.android.com/guide/topics/connectivity/telecom/
我已经可以在没有电信服务的情况下显示我自己的全屏来电 UI,拨打和接听视频电话。所有,我想用 Telecomservice 做的,只是告诉 Android 操作系统,我们的应用程序正在特定时刻开始/停止视频通话,并接收来自其他呼叫应用程序的呼叫保持/未保持事件。
主要问题有:
1) addNewIncomingCall 在来电的情况下什么都不做:onCreateIncomingConnection 回调没有被触发(甚至我的 ConnectionService 的 onCreate 回调根本没有被触发)。为什么连接服务没有启动?
2) 在拨出电话的情况下,placeCall 尝试使用我们的用户 ID 打开系统调用应用程序,将其称为电话或 SIP 号码。我可以在没有系统 UI 的情况下使用 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
【问题讨论】:
【参考方案1】:https://github.com/pranksterN1/TComTesthttps://***.com/users/4466771/prankstern1 发布了这个例子,它有效,但我仍然找不到,我的代码有什么问题:) 附加服务,例如示例中的 CallService 仅用于连接侦听,可以替换为 GreenRobot 的事件总线或 Rx 以简化
【讨论】:
【参考方案2】:您似乎想使用self-managed connection service 实现该应用。
检查您是否有权限:
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);
更新:there is an example
【讨论】:
谢谢,现在它至少不显示系统的呼叫 UI,但我仍然无法使用我们的十六进制用户 ID 拨打电话:系统显示“号码错误”对话框。如何正确创建呼叫 URI? 类似 Uri.parse("tel:12345") 但我认为这并不重要。我注意到不同的手机型号对这个 API 有不同的行为。看起来他们中的一些人没有正确实现它。例如,我无法让我的应用在三星设备上正常运行,但使用 Nexus 或 Pixel 时我不会遇到任何问题。 另外,如果您需要将数据添加到调用中,最好将其放在 extras 中,然后在 ConnectionService 中获取。 在 Nexus 6P 上仍然没有效果:在我的 ConnectionService 实现中没有调用回调,并且日志中没有错误:( AccountHandle 创建相同:pastebin.com/tb88c6ch 我给你做了一个例子,check it out以上是关于将 teleManager 与我们的自定义协议一起使用的主要内容,如果未能解决你的问题,请参考以下文章
将 UITableViewDataSource 与具有子视图的自定义单元格一起使用
将 DelegatingHandler 与 HttpClient 上的自定义数据一起使用
如何将 UICollectionViewController 的自定义初始化程序与 UICollectionViewCompositionalLayout 一起使用?