Android 10+版本下ContentResolver无法识别跨应用ContentProvider URI
解决Android 11+下ContentResolver访问ContentProvider报Unknown URL的问题
核心原因
Android 11(API 30)及以上版本引入了包可见性限制,默认情况下应用无法访问其他应用的组件;同时原权限配置存在错误,UriMatcher未初始化也会导致URI匹配失败。
步骤1:配置包可见性(API30+必填)
在调用ContentProvider的应用(TestProductDataBase.Android)的AndroidManifest.xml中添加<queries>标签,声明要访问的ContentProvider authorities:
<manifest ...> <queries> <!-- 指定目标ContentProvider的authorities --> <provider android:authorities="com.nts.user_screen_provider" /> </queries> <!-- 原有权限声明 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> ... </manifest>
步骤2:修复自定义权限配置
原Provider使用了系统权限BIND_DIRECTORY_SEARCH,这是错误的,应改为自定义权限:
在提供ContentProvider的应用(UserScreen.Android)的AndroidManifest.xml中:
- 定义自定义读写权限:
<manifest ...> <!-- 自定义权限 --> <permission android:name="com.nts.user_screen_provider.READ_PRODUCTS" android:protectionLevel="normal" /> <permission android:name="com.nts.user_screen_provider.WRITE_PRODUCTS" android:protectionLevel="normal" /> <application ...> <provider android:name="com.nts.user_screen.ProductProvider" android:authorities="com.nts.user_screen_provider" android:enabled="true" android:exported="true" android:grantUriPermissions="true" <!-- 替换为自定义权限 --> android:readPermission="com.nts.user_screen_provider.READ_PRODUCTS" android:writePermission="com.nts.user_screen_provider.WRITE_PRODUCTS" /> </application> </manifest>
在调用方应用(TestProductDataBase.Android)的AndroidManifest.xml中添加权限声明:
<uses-permission android:name="com.nts.user_screen_provider.READ_PRODUCTS" /> <uses-permission android:name="com.nts.user_screen_provider.WRITE_PRODUCTS" />
步骤3:初始化UriMatcher
在ProductProvider类的OnCreate方法中初始化UriMatcher,否则会导致URI匹配失败:
public override bool OnCreate() { uriMatcher = new UriMatcher(UriMatcher.NoMatch); // 添加URI匹配规则 uriMatcher.AddURI(AUTHORITIES, PRODUCT_PATH, PRODUCTS_URI_ID); return true; }
步骤4:验证Provider类名正确性
确保AndroidManifest.xml中android:name指向正确的Provider类全名。如果Xamarin项目中Provider类的命名空间是UserScreen.Android,则应改为:
android:name=".ProductProvider" <!-- 或者完整命名空间 --> android:name="UserScreen.Android.ProductProvider"
内容的提问来源于stack exchange,提问作者M_Porg Gamer
相关产品推荐
相关产品推荐

