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

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中:

  1. 定义自定义读写权限:
<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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:14:52