コンテントプロバイダを公開しない方法

久々に更新。
Android Dev Phoneも3週間ほどで返ってきて、必死にAndroidアプリの勉強中。
Androidではデータベースへのアクセスはコンテントプロバイダってのを使うのが基本らしいが、他のアプリからも利用可能になるらしい。アプリによってはデータを公開したくないけど、コンテントプロバイダの仕組みを使いたい!って場合もあると思うので調査。

AndroidアプリのContactっていうのは、アドレス帳を他のアプリに公開しているが、それを使うときにはpermissionの設定が必要。そこにヒントがあると思い、AndroidソースコードからContactsProviderを参照。AndroidManifest.xmlのproviderの定義にpermissionの設定をしているようだ。「Google Android プログラミング入門」の本を参考にして、以下のような感じになると思う。

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.ne.hatena.haruser.android"
    android:versionCode="1" android:versionName="1.0">

    <!-- 自分のアプリで使う場合にも許可情報の追加が必要 -->
    <uses-permission android:name="jp.ne.hatena.haruser.android.permission.XXXXX" />

    <!-- コンテントプロバイダへのアクセス許可設定 -->
    <!-- "signature"を指定することで署名が同じアプリに対してのみ許可する -->
    <permission
        android:name="jp.ne.hatena.haruser.android.permission.XXXXX"
        android:label="@string/permission_lavel"
        android:description="@string/permission_description"
        android:protectionLevel="signature" />
    
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <!-- コンテントプロバイダへのアクセスに許可情報を要求 -->
        <provider android:name=".XXXXXProvider"
            android:authorities="jp.ne.hatena.haruser.android.XXXXXProvider"
            android:permission="jp.ne.hatena.haruser.android.permission.XXXXX"
            />
    以下略

署名が同じ場合はアクセス可能だが、まぁ公開しなければ同じになることはないから上記のようにしておけば他のアプリからデータにアクセスされることはないと思う。

Google Androidプログラミング入門

Google Androidプログラミング入門


2011/05/19 追記
どうやら、異なる署名のアプリに対してもちゃんと制御する仕組みがあるらしい
ContentProvider で特定のアプリにのみ利用を許可する - おともだちティータイム
Sign in - Google Accounts