这是我试图了解Android内容提供商权限的测试:
App ProviderApp 清单:
<provider
android:authorities="com.mycompany.myProviderApp"
android:name="com.mycompany.myProviderApp.ContentProviderForMyOtherApps"
android:exported="true"/>
我还使用基本ContentProvider
方法实现了一个虚拟ContentProviderForMyOtherApps
(query
),在 ProviderApp 中返回一个字符串:
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
String[] cols = {"column1"};
MatrixCursor cursor = new MatrixCursor(cols);
MatrixCursor.RowBuilder builder = cursor.newRow();
builder.add("HELLO!");
return cursor;
}
App ClientApp 代码:
Cursor cursor = getContentResolver().query(Uri.parse("content://com.mycompany.myProviderApp"),null,null,null,null);
cursor.moveToFirst();
Log.d(TAG, cursor.getString(0)); // output: HELLO!
好的,所以一切正常, ClientApp 成功访问提供商。
但根据以下摘录,我对文档的理解是 ClientApp 应该拒绝访问提供商,因为:
android:readPermission
内没有provider
(例如com.mycompany.myProviderApp.READ
)uses-permission
(例如com.mycompany.myProviderApp.READ
)文档摘录:
如果提供商的应用程序未指定任何权限,则其他应用程序无权访问提供商的数据。
https://developer.android.com/guide/topics/providers/content-provider-basics.html#Permissions
机器人:导出
内容提供商是否可用于其他应用程序 use:true:提供程序可供其他应用程序使用。任何 应用程序可以使用提供程序的内容URI来访问它,主题 为提供者指定的权限。
https://developer.android.com/guide/topics/manifest/provider-element.html
为什么此代码(提供者和客户端声明无权限)实际上有效?
(我在文档中遗漏了什么?)
答案 0 :(得分:8)
文档有错误。这样:
如果提供商的应用程序未指定任何权限,则其他应用程序无权访问提供商的数据。
应为:
恕我直言,整个部分需要重写。但是,对于您的测试,导出的无权限提供程序是敞开的,任何应用程序都能够读写而不受惩罚。如果提供商的应用程序未指定任何权限,则其他应用程序对提供者数据的访问权限仅由
android:exported
值确定(true
授予对所有应用程序的无限制访问权限; {{1 }阻止其他应用程序访问)和false
值(变得复杂)。