在另一个应用程序中请求我自己的ContentProvider的读取权限

时间:2013-02-10 01:27:38

标签: android android-contentprovider runtime-error

在一个应用程序中,我在AndroidManifest中声明了以下内容提供程序:

    <provider android:name="com.example.MyProvider"
              android:label="@string/provider_name"
              android:authorities="com.example"
              android:readPermission="com.example.permission.READ"
    />

另一个应用程序请求使用它的权限:

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

但是在运行此代码时:

    ContentResolver resolver = this.context.getContentResolver();
    Cursor results = resolver.query(BaseballCardContract.CONTENT_URI, BaseballCardContract.PROJECTION, null, null, null);

我收到以下错误消息:

  

E / DatabaseUtils(1009):java.lang.SecurityException:Permission Denial:读取bbct.android.common.BaseballCardProvider uri content://bbct.android.baseballcard/baseball_cards from pid = 996,uid = 10046需要com。 example.permission.READ或grantUriPermission()

据我所知,我正在申请所需的许可。我在这里错过了什么?我还需要注意什么?

1 个答案:

答案 0 :(得分:9)

在定义ContentProvider的应用中,您是否还定义了您需要/请求的权限(在您的其他应用中)?像这样(在根<manifest/>标签内):

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

一般来说,你需要:

  1. 在您的某个应用的清单文件中定义权限
  2. 请求您的任何应用的清单文件中的权限,以获取希望获得许可的应用
  3. 在您希望使用此权限保护的任何组件中需要此权限,例如活动,服务或ContentProviders(读取,写入,两者,特定子URI等)
  4. 编辑:所以只是要100%明确,仅仅通过在ContentProvider中要求它来“隐式”定义权限是不够的。您必须在应用的清单文件中明确定义它(在<manifest/>标记内)。