6

在一个应用程序中,我在我的 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: 从 pid=996 读取 bbct.android.common.BaseballCardProvider uri content://bbct.android.baseballcard/baseball_cards,uid=10046 需要 com.example.permission .READ 或 grantUriPermission()

据我所知,我正在请求所需的许可。我在这里想念什么?我还需要看什么?

4

1 回答 1

9

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

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

一般来说,您需要:

  1. 在您的应用程序清单文件之一中定义权限
  2. 在您的应用程序的任何清单文件中请求权限,对于希望获得权限的应用程序
  3. 在您希望使用此权限保护的任何组件中要求此权限,例如活动、服务或内容提供者(读取、写入,两者,特定的子 URI 等)

编辑:所以只是为了 100% 清楚,通过在你的 ContentProvider 中要求它来“隐式”定义一个权限是不够的。您必须在应用程序的清单文件中(在<manifest/>标签内)明确定义它。

于 2013-04-19T13:11:09.200 回答