将我的应用设置为默认拨号器而不询问 Android 10 (Q) 中的选项?

Irf*_*ram 2 android android-intent telephonymanager android-permissions android-10.0

我目前无法让我的应用程序向用户发送对话以在 API 29 上设置默认拨号器,但相同的代码在 Android 10 (Q) 下运行良好。

我测试了这个“无响应”意图提示用户设置短信示例的默认处理程序,但不适用于我的。然后我按照https://developer.android.com/guide/topics/permissions/default-handlers但没有解决我的问题。API 级别 29 或更高版本是否有任何特殊更改可以让用户设置默认应用程序?

这是我的工作代码(适用于 Android 10 以下)

TelecomManager telecomManager = (TelecomManager) getSystemService(TELECOM_SERVICE);
        if (!getPackageName().equals(telecomManager.getDefaultDialerPackage())) {
            Intent intent = new Intent(ACTION_CHANGE_DEFAULT_DIALER)
                    .putExtra(EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, getPackageName());
            startActivity(intent);
        }
Run Code Online (Sandbox Code Playgroud)

我在 logcat 中得到的内容在这里

在此输入图像描述

mar*_*mor 5

是的,API 已更改,请参阅此处之前 API 中的注释: https: //developer.android.com/reference/android/telecom/TelecomManager#ACTION_CHANGE_DEFAULT_DIALER

请参阅此处了解新 API: https ://developer.android.com/reference/android/app/role/RoleManager

基本上,你需要做类似的事情:

RoleManager roleManager = (RoleManager) getSystemService(Context.ROLE_SERVICE);
Intent intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_DIALER);
startActivityForResult(Intent, CHANGE_DEFAULT_DIALER_CODE); // you need to define CHANGE_DEFAULT_DIALER as a static final int
Run Code Online (Sandbox Code Playgroud)

然后你通过在你的活动中实施来捕捉响应onActivityResult