Android:为电信注册新的PhoneAccount

时间:2016-04-12 14:56:13

标签: android android-6.0-marshmallow telecommunication android-7.0-nougat

我正在尝试创建一个新的PhoneAccount来使用ConnectionService的实现。它在文档中说我需要在TelecomManager中注册一个新的PhoneAccount,然后在我的手机应用程序设置中选择它。

这是我的代码:

SplitContainer.SplitterDistance

如您所见,它创建了一个新的ComponentName,指向我的ConnectionService实现,然后创建一个新的PhoneAccountHandle,我提供ComponentName和一个唯一的帐户名。然后我在PhoneAccount构建中提供PhoneAccountHandle,以及标签(名称?),以创建新的PhoneAccount。最后,我在telecomManager中注册了帐户。

当我打开手机应用程序时,一切都没有改变。我看不到我可以改变PhoneAccount的地方......有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

我有一些信息,我将在这里留给后人。

构建PhoneAccount时,如果您自己拨打和接听电话,则必须添加CAPABILITY_CALL_PROVIDER;如果您想使用内置电话拨打或接听电话,则必须CAPABILITY_CONNECTION_MANAGER PhoneAccount }}。如果没有,您将无法在UI中显示。

据我所知,没有用于检查用户是否已启用PhoneAccount的专用API。但是,您可以使用TelecomManageraddNewIncomingCall来实现此目的。只需提供一个Bundle包含一个布尔额外(命名为你想要的任何东西),如果你真的接到一个电话就设置那个布尔值为true,如果你只是想做一个允许就设置false检查(反之亦然)。然后,您ConnectionServiceonCreateIncomingConnection的实施可以检查您的额外内容并返回ConnectioncreateCanceledConnection,如果您只是进行权限检查。这不会在通话记录中注册为呼叫,并且铃声永远不会播放。如果您的addNewIncomingCall未启用,PhoneAccount会抛出,如果是{。}}则会成功。

如上面的评论中所述,您可以提示用户使用PhoneAccountTelecomManager启用ACTION_CHANGE_PHONE_ACCOUNTS。由于用户可以随时启用或停用PhoneAccount,因此所有需要启用PhoneAccount的操作(如addNewIncomingCall)都应放在try块中。

答案 1 :(得分:2)

这是一些可能对其他人有帮助的信息。配置好手机帐户后,用户需要为您的应用启用权限。让用户访问该屏幕应该更容易。我只看到了TelecomManager.ACTION_CHANGE_PHONE_ACCOUNTS操作,但它没有带你到正确的屏幕来启用权限。启动该活动后,您必须选择“所有呼叫帐户”。

如果您想将用户直接带到“致电帐户”屏幕,我发现此意图会将您带到那里。

Intent intent = new Intent();
intent.setComponent(new ComponentName("com.android.server.telecom","com.android.server.telecom.settings.EnableAccountPreferenceActivity"));
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);

我已经使用摩托罗拉G5S Plus对其进行了测试,它也适用于Nexus和Pixel设备等大多数库存设备。我不确定它是否适用于三星设备。

答案 2 :(得分:1)

作为j__m答案的附录:我找到了一种方法来检查电话帐户是否在未拨打电话的情况下被激活:

private boolean checkAccountConnection(Context context) {
    boolean isConnected = false;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
            final List<PhoneAccountHandle> enabledAccounts = telecomManager.getCallCapablePhoneAccounts();
            for (PhoneAccountHandle account : enabledAccounts) {
                if (account.getComponentName().getClassName().equals(MyConnectionService.class.getCanonicalName())) {
                    isConnected = true;
                    break;
                }
            }
        }

    }
    return isConnected;
}

如Javadoc中所述到android.telecom.TelecomManager.getCallCapablePhoneAccounts()

  

返回{@link PhoneAccountHandle}的列表,可用于拨打和接听电话。返回的列表仅包括用户已明确启用的帐户。