制御したい場合は、マニフェストファイルで<provider>のandroid:grantUriPermission
属性をfalseとして、子要素である<grant-uri-permission>で許可するパスを列挙します。
<provider android:authorities="yuki.test.provider" android:name="yuki.test.MyContentProvider" android:readPermission="yuki.test.signature" android:grantUriPermissions="false" > <grant-uri-permission android:path="/test/hoge/foo/lv5" /> </provider>この例では下記の状態となります
- データ参照にはyuki.test.signature権限が必要(android:readPermission)
- 原則パーミッションの付与は許可しない(android:grantUriPermissions)
- ただし下記パスに対するパーミッションの付与は可能(grant-uri-permission)
- /test/hoge/foo/lv5
- .allowで終わるパス(/yuki/hoge/foo.allow, /test/hoge.allowなど)
許可されていないURIに権限を付与した場合、下記例外が発生します。
java.lang.SecurityException: Provider yuki.test/yuki.test.MyContentProvider does not allow granting of permission to path of Uri content://yuki.test.provider/test/hoge/foo/lv5アクセス許可するコンテンツパスを動的に変えたいような場合があります。
下記のように外部入力値をそのまま利用するコードは大変危険です。
grantUriPermission("yuki.client", getIntent().getData(), Intent.FLAG_GRANT_READ_URI_PERMISSION);あらかじめ、パーミッション付与するコンテンツパスが決まっている場合は、
この仕組みを利用した方が安全です。
以上です。