android 未能找到com.example.serialprovider.provider.SampleProvider的提供程序信息

0x6upsns  于 2023-08-01  发布在  Android
关注(0)|答案(1)|浏览(95)

我一直在尝试从另一个应用的自定义ContentProvider类获取数据,但我一直得到这个错误:找不到com.example.serialprovider.provider.SampleProvider的提供程序信息。
我在网上搜索了很多类似的问题,但仍然不知道出了什么问题,我多次检查了清单,我甚至采取了一份权威属性的副本在接收者应用程序中使用它,但仍然,接收者应用程序找不到提供者。
下面是清单中的声明:

<provider
    android:name=".provider.SampleProvider"
    android:authorities="com.example.serialprovider.provider.SampleProvider"
    android:enabled="true"
    android:exported="true" />

字符串
下面是Provider类中onCreate和query方法的实现(我使用的是RoomDatabase):

public class SampleProvider extends ContentProvider {
    
    public SampleProvider() {
    }

    private static final String AUTHORITY = "com.example.serialprovider.provider.SampleProvider";
    private static final String TABLE_NAME = "devicepin";

    private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    static {
        sURIMatcher.addURI(AUTHORITY, TABLE_NAME, 1);
    }

    @Override
    public boolean onCreate() {
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        if (sURIMatcher.match(uri) == 1) {
            final Context context = getContext();
            AppDao dao = DatabaseClient.getInstance(context).getAppDatabase().appDao();
            final Cursor cursor = dao.get();
            cursor.setNotificationUri(getContext().getContentResolver(), uri);
            cursor.close();
            return cursor;
        } else {
            throw new IllegalArgumentException("Unknown URI: " + uri);
        }
    }
}


下面是我如何尝试在另一个应用程序中获取光标“接收器”:

private void getPin(){
    new Thread(() -> {
        ContentResolver resolver = getContentResolver();
        try{
            Cursor cursor = resolver.query(Uri.parse("content://com.example.serialprovider.provider.SampleProvider/devciepin"), null, null, null, null);
            cursor.close();
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }).start();
}


cursor总是null,当我用try和catch块包围它时,“未能找到提供程序信息”是我得到的异常。

vyswwuz2

vyswwuz21#

代码被证明是好的,但Android 11(API 30)中引入了一些新的限制,从另一个应用访问ContentProvider。您可以在documentation中查看行为更改。
1-将此权限作为标记的同级权限添加到提供程序应用的清单:

<permission android:name="com.example.myprovider.READ_PIN" />

字符串
2-在提供者应用的清单中作为标签的兄弟执行此操作:

<provider
      android:name=".provider.SampleContentProvider"
      android:authorities="com.example.app_package_name.provider"
      android:exported="true"
      android:readPermission="com.example.app_package_name.READ_PIN" />


B:如果你想让你的应用程序的内容暴露给所有其他应用程序,不管他们是否授予权限,你可以跳过#1并删除#2的最后一行,但这不是一个安全的做法,你会收到警告。
3-将这些作为兄弟添加到阅读器应用的清单中的标签中:

<uses-permission android:name="com.example.myprovider.READ_PIN" />

<queries> 
   <package android:name="com.example.your_provider_name" /> 
</queries>

相关问题