android TelecomManager PlaceCall在到达ConnectionService之前正在调用本机拨号程序

hrirmatl  于 2023-05-05  发布在  Android
关注(0)|答案(1)|浏览(217)

我有一个应用程序,使通话使用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
wxclj1h5

wxclj1h51#

试试这个:在PhoneAccount初始化中更改2以下行:

.setCapabilities(PhoneAccount.CAPABILITY_SELF_MANAGED)
        .addSupportedUriScheme("sip")

相关问题