You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms Android检测Google Maps安装在Android11返回false如何解决

问题原因

Android 11(API 级别 30)引入了包可见性过滤机制,默认情况下应用无法直接查询到设备上安装的所有第三方应用,未在清单中声明可见性的应用会被PackageManager视为未安装,所以你之前的代码返回false。

解决步骤

1. 配置AndroidManifest.xml清单

在你的Android项目的Properties/AndroidManifest.xml文件中,添加和<application>节点平级的<queries>节点,声明你需要查询的谷歌地图包名:

<manifest ...>
    <application ...>
        <!-- 原有配置保持不变 -->
    </application>
    <!-- 新增包可见性声明 -->
    <queries>
        <package android:name="com.google.android.apps.maps" />
    </queries>
</manifest>

注意:如果你的应用需要查询更多第三方应用,可以在<queries>节点下新增多个<package>子节点分别声明包名即可,不需要申请额外权限。如果有特殊场景需要查询所有已安装应用,可以申请QUERY_ALL_PACKAGES权限,但谷歌应用商店对该权限的审核非常严格,非必要不建议使用。

2. 适配后的检测代码

原有代码逻辑基本可用,仅需要做小版本兼容优化,适配不同API级别的参数要求:

public static bool IsAppInstalled(string packageName)
{
    PackageManager pm = MainActivity.AppInstance.PackageManager;
    bool installed;
    try
    {
        // 适配API 33及以上的参数规范,低版本也可兼容
        if (Build.VERSION.SdkInt >= BuildVersionCodes.Tiramisu)
        {
            pm.GetPackageInfo(packageName, PackageManager.PackageInfoFlags.Activities);
        }
        else
        {
#pragma warning disable CS0618 // 废弃方法的警告可忽略
            pm.GetPackageInfo(packageName, PackageInfoFlags.Activities);
#pragma warning restore CS0618
        }
        installed = true;
    }
    catch (PackageManager.NameNotFoundException)
    {
        installed = false;
    }
    return installed;
}

调用时仍然传入包名"com.google.android.apps.maps"即可正常检测。

内容的提问来源于stack exchange,提问作者Hikari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:24:03