如何解决使用 TelecomManager.placeCall 进行自定义呼叫
我正在尝试使用 TelecomManager 在已在其设备上安装我的应用的两个用户之间自定义实现呼叫
在this guide之后,我实现了连接服务,Connection的子类,添加了权限,注册了一个PhoneAccount等等......
第三周我一直在努力理解如何在不使用电话号码但使用用户名或 userId 的情况下在我的应用程序的用户之间拨打电话。
下面的代码开始从我的设备拨打电话,但此电话从未到达最终用户设备
b
需要提及的是,在我的 broadcastReceiver 实现中,我可以检测到来自其他应用程序的来电,因此似乎我处理的呼叫检测是正确的,并且来自上述代码的呼叫从未真正发送到它打算发送给用户的设备。
现在是问题。我觉得我错过了一些重要的东西。具有相同应用程序的设备如何在没有电话号码的情况下相互通信?仅仅将用户名传递给 TelecomManager.placeCall 真的就足够了吗,它应该设法找到安装了应用程序的正确设备并调用它吗?电信管理器如何区分拨打电话的位置?
抱歉,我的问题不清楚,这是我第一次做与电话相关的事情,我觉得我很幸运能理解这个主题,很难让问题更具体,因为我不知道我错过了什么。
我会在下面放一些我现在正在使用的代码
开始拨出电话
telecomManager.placeCall(Uri.fromParts(/*tried also with PhoneAccount.SCHEME_SIP and PhoneAccount.SCHEME_TEL*/
TripmateConnectionService.SCHEME_AG,"userId",null),extras)
在连接服务中
private fun placeSystemCall(myUid: String,peerUid: String,channel: String,role: Int) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val extras = Bundle()
extras.putInt(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE,VideoProfile.STATE_BIDIRECTIONAL)
val extraBundle = Bundle()
extraBundle.putString(Constants.CS_KEY_UID,myUid)
extraBundle.putString(Constants.CS_KEY_SUBSCRIBER,peerUid)
extraBundle.putString(Constants.CS_KEY_CHANNEL,channel)
extraBundle.putInt(Constants.CS_KEY_ROLE,Constants.CALL_ID_OUT)
extras.putBundle(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS,extraBundle)
try {
val telecomManager = applicationContext.getSystemService(TELECOM_SERVICE) as TelecomManager
val pa: PhoneAccount = telecomManager.getPhoneAccount(
config().phoneAccountOut?.accountHandle)
extras.putBoolean(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE,true);
extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,pa.accountHandle)
telecomManager.placeCall(Uri.fromParts(
TripmateConnectionService.SCHEME_AG,peerUid,extras)
} catch (e: SecurityException) {
e.printstacktrace()
}
}
}
创建电话帐户
override fun onCreateOutgoingConnection(phoneAccount: PhoneAccountHandle?,request: ConnectionRequest): Connection {
Log.i(TAG,"onCreateOutgoingConnection: called. $phoneAccount $request")
val extras = request.extras
val uid = extras.getString(Constants.CS_KEY_UID) ?: "0"
val channel = extras.getString(Constants.CS_KEY_CHANNEL) ?: "0"
val subscriber = extras.getString(Constants.CS_KEY_SUBSCRIBER) ?: "0"
val role = extras.getInt(Constants.CS_KEY_ROLE)
val videoState = extras.getInt(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE)
val connection = TripmateConnection(applicationContext,uid,channel,subscriber,role)
connection.setVideoState(videoState)
connection.setAddress(Uri.fromParts(SCHEME_AG,TelecomManager.PRESENTATION_ALLOWED)
connection.setCallerdisplayName(subscriber,TelecomManager.PRESENTATION_ALLOWED)
connection.setRinging()
TMApplication.getInstance().config().setConnection(connection)
return connection
}
感谢您的时间!任何可以帮助我了解更多信息的建议和链接将不胜感激!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。