ContentProviderは、他のアプリとデータを共有するためのコンポーネントであるため、データに対するアクセス制御を細かくできるようになっています。
他のコンポーネントがandroid:exportedによる公開、非公開の設定だけであるのにContentProviderは6種類のPermissionを指定できるようになっています。
Permission属性 |
用途 |
Permission |
アクセスするために必要なPermissionを指定する。 |
readPermission |
読込みのために必要なPermissionを指定する。<Permission>より優先 |
writePermission |
書き込みのために必要なPermissionを指定する。<Permission>より優先 |
path-permission |
特定のパスにアクセスするためのPermissionを指定する。子要素として<readPermission>、<writePermission>を持つ
|
grantUriPermissions |
一時的に特定のアプリに対してアクセスを許可する時に指定する。falseの時、<grant-uri-permission>で詳細を指定できる |
grant-uri-permission |
特定のパスについて、一時的に特定のアプリに対してアクセスを許可する時に指定する。 |
AndroidManifest.xml上での定義は以下のような形で行います。
赤文字部分がPermissionの定義にあたります。
<providerandroid:authorities="list"
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:grantUriPermissions=["true" | "false"]
android:icon="drawable resource"
android:initOrder="integer"
android:label="string resource"
android:multiprocess=["true" | "false"]
android:name="string"
android:permission="string"
android:process="string"
android:readPermission="string"
android:syncable=["true" | "false"]
android:writePermission="string">
. . .
</provider>
それぞれのPermissionの使用例として、Androidが提供する連絡先のContentProviderの定義を挙げます。
<providerandroid:name="ContactsProvider2"
android:authorities="contacts;com.android.contacts"
android:label="@string/provider_label"
android:readPermission="android.permission.READ_CONTACTS"
android:writePermission="android.permission.WRITE_CONTACTS">
<path-permission android:pathPrefix="/search_suggest_query"
android:readPermission="android.permission.GLOBAL_SEARCH" />
<path-permission android:pathPrefix="/search_suggest_shortcut"
android:readPermission="android.permission.GLOBAL_SEARCH" />
<path-permission android:pathPattern="/contacts/.*/photo"
android:readPermission="android.permission.GLOBAL_SEARCH" />
<grant-uri-permission android:pathPattern=".*" />
</provider>
この例を見ると、全体に対して読み込み、書き込みに必要なreadPermission、writePermissionが定義されていることが分かります。
また、path-permissionによって、android.permission.GLOBAL.SERACH
Permissionを持っているアプリは、読み込みに必要なandroid.permission.READ_CONTACTSを持っていなくても、
- search_suggest_query の呼び出し
- search_suggest_shortcut の呼び出し
- /contacts/.*/photo (連絡先の写真の情報)の読み込み
を行うことができるように設定されています。