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
相关产品推荐
相关产品推荐

