昨日の記事、Android ContetProviderを非公開にする方法にて、exportでの制限について記載しましたが、まとまりが悪いので、証明書を使ったアクセス制限についてです。
(ついでに昨日の記事も書きなぐりでしたので少しわかりやすいように修正しました)

同じ証明書を持ったアプリのみコンテントプロパイダにアクセス可能にするので、実質他のアプリからのアクセス制限が可能になります。

コンテントプロパイダを非公開にする方法と似ていますが、シェアードユーザIDは異なり、証明書のみ同じケースです。
密接に関連している2つのアプリケーションの場合は、シェアードユーザIDを同じにしてもかまいませんが、祖結合の場合はシェアードユーザIDは同じにしないので、証明書のみを利用したアクセス制限を利用します。


<uses-permissionandroid:name="jp.co.taosoftware.android.sb.contentprovider.permission.NOT_OPEN"/>
<permissionandroid:name="jp.co.taosoftware.android.sb.contentprovider.permission.NOT_OPEN"
    android:protectionLevel="signature"
    android:label="@string/permlab_read_data_signature"
    android:description="@string/permdesc_read_data_signature"
/>
<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
<activityandroid:name="jp.co.taosoftware.android.sb.contentprovider.MainActivity"
android:label="@string/app_name">
    <intent-filter>
    <actionandroid:name="android.intent.action.MAIN"/>
    <categoryandroid:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>
<!-- プロバイダー -->
<providerandroid:name="jp.co.taosoftware.android.sb.contentprovider.normal.NormalContentProvider"
android:authorities="jp.co.taosoftware.android.sb.contentprovider.normal.normalcontentprovider"
android:permission="jp.co.taosoftware.android.sb.contentprovider.permission.NOT_OPEN"
/>
</application>

AndroidManifest.xml内でまず<permission>を作成します。nameは任意でかまいませんが、protectionLevel="signature"を指定する事で、このアプリと同じ証明書を持つアプリケーションのみ許可する権限となります。
次に作成した<permission>を<provider>のpermissionに指定します。これでこのコンテントプロパイダは、証明書が同じアプリケーションのみアクセス可能になります。最後に自分自身もこのコンテントプロパイダにアクセスするために、<users-permission>にて使用宣言をします。

ブログ内の関連する記事