6

1つのアプリで、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:reading bbct.android.common.BaseballCardProvider uri content://bbct.android.baseballcard/baseball_cards from pid = 996、uid = 10046 requiredcom.example.permission .READ、またはgrantUriPermission()

私の知る限り、必要な許可を求めています。ここで何が欠けていますか?他に何を見る必要がありますか?

4

1 に答える 1

9

ContentProviderを定義するアプリで、(他のアプリで)要求/要求する権限も定義しましたか?そのように(ルート<manifest/>タグ内で):

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

一般的に、次のことを行う必要があります。

  1. アプリのマニフェストファイルの1つで権限を定義する
  2. 許可を取得したいアプリの場合は、アプリのマニフェストファイルで許可をリクエストします
  3. アクティビティ、サービス、ContentProvider(読み取り、書き込み、両方、特定のサブURIなど)など、このアクセス許可で保護するコンポーネントでこのアクセス許可が必要です。

編集:100%明確にするために、たとえばContentProviderでアクセス許可を要求することにより、アクセス許可を「暗黙的に」定義するだけでは十分ではありません。アプリのマニフェストファイル(<manifest/>タグ内)で明示的に定義する必要があります。

于 2013-04-19T13:11:09.200 に答える