在 Android 11 中打开 Google 地图的 Android Intent 无法正常工作。

9

Android 11中打开Google地图的Intent不再起作用,但在较低的API上可以正常工作。

我们有这个函数:

Intent mapIntent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("google.navigation:q=" + PICK_LATITUDE + "," + PICK_LONGITUDE ));
                mapIntent.setPackage("com.google.android.apps.maps");
                if (mapIntent.resolveActivity(getPackageManager()) != null) {
                    startActivity(mapIntent);
                }else{
                    Snackbar.make(root, "Google apps is not installed" , Snackbar.LENGTH_SHORT).show();

                }

Android Studio 提示:

在调用此方法时,考虑向您的清单添加声明;有关详情,请参见https://g.co/dev/packagevisibility


您需要在清单文件中添加查询。 - Ridha Rezzag
对于其他在权限/清单方面遇到困难的人,可以通过URL启动地图的替代方法。请参阅Google文章 - Paul G
3个回答

15

将此添加到您的清单中

<manifest package="com.example.game">

    <queries>
             <package android:name="com.google.android.apps.maps" />
    </queries>
    ...

</manifest>
如果您的应用程序针对Android 11或更高版本,并且需要与除自动可见的应用程序之外的应用程序进行交互,请在应用程序的清单文件中添加 <queries> 元素。在 <queries> 元素内,通过包名称、意图签名或提供程序权限指定其他应用程序。
更多详细信息请参见声明包可见性需要

1
如何将此内容添加到没有可直接编辑的<manifest>的Cordova / Ionic项目中?我的config.xml文件中有<platform name="android">和<edit-config>元素,但在<edit-config>元素中添加上述<queries>元素并未在该文件上起作用。 - Paul G

5

您的问题出在这一行代码:intent.resolveActivity(getPackageManager())。当您调用resolveActivity时,您会得到以下警告:

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

检查位于PackageManager下的文档,您将看到以下注意事项:

注意:如果您的应用针对 Android 11(API 级别 30)或更高版本,则该类中的每个方法都会返回经过筛选的应用列表。了解有关如何管理包可见性的更多信息。

那是什么意思?

在 Android 11 中,谷歌添加了包可见性政策。应用现在对查看其他应用程序有更严格的控制权。您的应用程序将无法查看或访问应用程序外部的应用程序。

您需要做什么?

您只需在AndroidManifest.xml中添加以下代码即可:

<manifest>
    <queries>
        <!-- Specific intents you query for -->
        <package android:name="com.google.android.apps.maps" />
    </queries>
</manifest>

更多信息:

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

谢谢你的回答。我在提问之前进行了搜索,看到了这个答案:https://dev59.com/A8Hqa4cB1Zd3GeqP4qkO#68659891。但是那个答案对我没有用,所以我认为你的答案只是复制粘贴。我尝试了Ridha的答案,它确实有效。后来我发现你的新答案有正确的包,并且也有效。再次感谢! - Zeone line
1
@Zeoneline 因为在那个问题的情况下,他们使用 intent 来打开而不是设置包。在你的情况下,你正在将项目发送到包 com.google.android.apps.maps,所以你需要用 package 替换 intent - Dương Minh

-1

如果您指定了“QUERY_ALL_PACKAGES”,则无需指定“queries”标签。但是,如果您指定了“QUERY_ALL_PACKAGES”,除非符合某些特定的排除条件,否则您的应用程序很可能会被Play商店阻止。 - Adam Burley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接