Intent Action_dial 在 android 11 中不起作用

Ash*_*sha 5 java android android-studio

我目前正在开发一个 Android 应用程序,需要一个启动电话的功能,所以我添加了这段代码。

 public void dialPhoneNumber(String phoneNumber) {
        Intent intent = new Intent(Intent.ACTION_DIAL);
            intent.setData(Uri.parse("tel:" + phoneNumber));
            if (intent.resolveActivity(getPackageManager()) != null) {
                startActivity(intent);
            }
        }
Run Code Online (Sandbox Code Playgroud)

..它似乎在旧的 Android 版本中完美工作,但是当我在 Android 11 中测试它时,它根本不起作用我尝试action_call并添加了权限<uses-permission android:name="android.permission.CALL_PHONE" />仍然不起作用。

Dươ*_*inh 22

你的问题出在代码行上intent.resolveActivity(getPackageManager())。当您调用resolveActivity时,您将收到如下警告:

调用此方法时,请考虑在清单中添加声明;有关详细信息,请参阅https://g.co/dev/packagevisibility

查看PackageManager下的文档,你会看到这样的注释:

注意:如果您的应用面向 Android 11(API 级别 30)或更高版本,则此类中的每个方法都会返回经过筛选的应用列表。详细了解如何管理包可见性。

那么这是什么意思呢?

在 Android 11 中,Google 添加了包可见性策略。应用程序现在可以更严格地控​​制查看其他应用程序。您的应用程序将无法查看或访问您的应用程序之外的应用程序。

你需要做什么?

您需要做的就是添加以下代码行AndroidManifest.xml

<manifest>
    <queries>
        <!-- Specific intents you query for -->
        <intent>
            <action android:name="android.intent.action.DIAL" />
        </intent>
    </queries>
</manifest>
Run Code Online (Sandbox Code Playgroud)

更多信息:

  1. Android 11 中的包可见性
  2. Android 上的包可见性过滤