我一直在尝试从另一个应用的自定义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块包围它时,“未能找到提供程序信息”是我得到的异常。
1条答案
按热度按时间vyswwuz21#
代码被证明是好的,但Android 11(API 30)中引入了一些新的限制,从另一个应用访问ContentProvider。您可以在documentation中查看行为更改。
1-将此权限作为标记的同级权限添加到提供程序应用的清单:
字符串
2-在提供者应用的清单中作为标签的兄弟执行此操作:
型
B:如果你想让你的应用程序的内容暴露给所有其他应用程序,不管他们是否授予权限,你可以跳过#1并删除#2的最后一行,但这不是一个安全的做法,你会收到警告。
3-将这些作为兄弟添加到阅读器应用的清单中的标签中:
型