我有一个应用程序,使通话使用WiFi和我想使用自我管理呼叫,以更好地管理之间的互操作性,从我的应用程序和其他人,除了更好地管理音频通话。
所以,我选择了https://developer.android.com/guide/topics/connectivity/telecom/selfManaged。
一切都工作得很好,对来电,当我接到一个电话,我看到应用程序处理事件,从连接服务和连接。我正在使用:
(...)
bundle.putParcelable(TelecomManager.EXTRA_INCOMING_CALL_ADDRESS, uri)
bundle.putParcelable(TelecomManager.EXTRA_INCOMING_CALL_EXTRAS, extraBundle)
telecomManager.addNewIncomingCall(phoneAccountHandle, bundle)
但是,当我尝试在某些设备上创建placeCall()
时,它会显示本机拨号程序,但我可以在到达ConnectionService后看到一些事件
在其他设备(如oppo)中,它会向我显示一个对话框,上面写着“呼叫失败无法连接到移动的网络”,并带有以下警告:
Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1175 android.content.ContextWrapper.sendBroadcast:489 com.android.server.telecom.oplus.OplusTelecomUtils.sendBroadCastToOcarForCallFailedType:1963 com.android.server.telecom.oplus.OplusTelecomUtils.startOplusErrorDialogActivity:326 com.android.server.telecom.oplus.OplusUserCallIntentProcessor.canGoOnPlaceCall:379
这就是我调用placeCall()的方式
val uri: Uri = Uri.fromParts(PhoneAccount.SCHEME_TEL, number, "")
val phoneAccountHandle = PhoneAccountHandle(ComponentName(context, MyConnectionService::class.java), number)
registrationPhoneAccountHandle(phoneAccountHandle, uri)
val bundle = Bundle()
val extraBundle = Bundle()
bundle.putBoolean(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, false)
bundle.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle)
bundle.putParcelable(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS, extraBundle)
telecomManager.placeCall(uri, bundle)
为了注册我正在做的电话账号
private fun registrationPhoneAccountHandle(phoneAccountHandle: PhoneAccountHandle, uri: Uri) {
val callAccountFlags = PhoneAccount.CAPABILITY_SELF_MANAGED
val phoneAccount = PhoneAccount.builder(phoneAccountHandle, "someId")
.setSupportedUriSchemes(listOf(PhoneAccount.SCHEME_TEL))
.setShortDescription("description")
.setAddress(uri)
.setCapabilities(callAccountFlags)
val extra = Bundle()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
extra.putBoolean(PhoneAccount.EXTRA_LOG_SELF_MANAGED_CALLS, false)
}
phoneAccount.setExtras(extra)
val accountBuild = phoneAccount.build()
telecomManager.registerPhoneAccount(accountBuild)
}
关于清单权限,我有以下权限:
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
我错过了什么?
[编辑]
使用以下标志bundle.putInt(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, VideoProfile.STATE_BIDIRECTIONAL)
和自定义方案时,本机拨号器不再显示。然而,在Oppo X3 Lite上,它仍然显示一个对话框,就像图中一样,但带有消息“无法放置调用”和堆栈上的消息。有没有什么方法可以检查Oppo是否不允许打电话?
Calling a method in the system process without a qualified user
1条答案
按热度按时间wxclj1h51#
试试这个:在PhoneAccount初始化中更改2以下行: