Xamarin Android 11无QUERY_ALL_PACKAGES权限唤起Facebook应用咨询
Android 11及以上版本无特殊权限唤起Facebook应用方案
Android 11引入了包可见性过滤机制,默认情况下应用仅能查询系统预装应用、自身已声明关联应用的相关信息,未做声明的第三方应用会被系统直接判定为不存在,这就是未配置全量包查询权限时fb协议无法被识别、仅能跳转网页的核心原因。该场景完全不需要申请需要Google特殊审核的QUERY_ALL_PACKAGES权限,通过定向声明包可见性即可实现正常唤起。
具体实现步骤
1. 配置AndroidManifest包可见性声明
在Android项目的AndroidManifest.xml文件中,找到<manifest>根节点,在和<application>平级的位置添加<queries>配置,定向声明需要查询的Facebook应用信息:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...> <!-- 原有权限配置保持不变 --> <!-- 不要添加QUERY_ALL_PACKAGES权限 --> <queries> <!-- 声明Facebook正式版应用包可见 --> <package android:name="com.facebook.katana" /> <!-- 声明fb协议的intent处理规则匹配 --> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="fb" /> </intent> <!-- 如需兼容Facebook Lite,可补充下面这行 --> <!-- <package android:name="com.facebook.lite" /> --> </queries> <application ...> <!-- 原有application配置保持不变 --> </application> </manifest>
注意:如果编译时提示queries标签无法识别,请将Xamarin.Android SDK升级到支持Android 11(API 30)及以上的版本即可,无需引入额外第三方依赖。
2. 优化原有唤起逻辑(可选推荐)
原有唤起逻辑可以正常使用,建议补充异常兜底逻辑,避免个别设备Facebook版本差异导致的崩溃,优化后代码如下:
private async void Buttonfb_Tapped(object sender, EventArgs e) { try { var fbPageUri = new Uri(string.Format("fb://page/{0}", AppData.FacebookId)); if (await Launcher.CanOpenAsync(fbPageUri)) { await Launcher.OpenAsync(fbPageUri); return; } } catch { // 捕获所有唤起异常,走网页兜底 } // 客户端唤起失败时,跳转移动网页版兜底 OpenUrl(string.Format("https://m.facebook.com/{0}", AppData.FacebookPage)); }
方案合规说明
- 该配置仅定向声明了Facebook单个应用的可见性,不属于全量采集用户安装应用列表的敏感行为,上架Google Play时不会触发
QUERY_ALL_PACKAGES的特殊权限审核流程,无需提交额外说明即可正常过审。 - 配置兼容Android 11至目前最新的Android 14版本,不存在版本适配失效问题。
内容的提问来源于stack exchange,提问作者Software Magic
相关产品推荐
相关产品推荐

