Content Provider的权限
Content Provider的权限的管理很复杂,所以需要慢慢的说。
<path-permission android:pathPrefix="/users" android:permission="lichie.provider.permission"/>
<provider android:name=".PackageProvider" android:authorities="com.ygomi.packageprovider" android:multiprocess="true" android:readPermission="com.ygomi.packageprovider.permission.read"> <path-permission android:pathPattern="/apks/.*" android:permission="com.ygomi.packageprovider.permission.application.read"/> </provider>
这段代码的path-permission是有效的,但是下面这段代码是无效的。
<provider android:name=".PackageProvider" android:authorities="com.ygomi.packageprovider" android:multiprocess="true"> <path-permission android:pathPattern="/apks/.*" android:permission="com.ygomi.packageprovider.permission.application.read"/> </provider>
<provider android:name=".MyProvider" android:authorities="mytest.testProvider" android:multiprocess="true" android:readPermission="lichie.provider.permission"> <grant-uri-permission android:pathPrefix="/user/"/> </provider>
<uses-permission android:name="lichie.provider.permission" />
一个content provider可能想保护它的读写权限,而同时与它对应的直属客户端也需要将特定的URI传递给其它应用程序,以便其它应用程序对该URI进行操作。一个典型的例子就是邮件程序处理带有附件的邮件。进入邮件需要使用permission来保护,因为这些是敏感的用户数据。然而,如果有一个指向图片附件的URI需要传递给图片浏览器,那个图片浏览器是不会有访问附件的权利的,因为他不可能拥有所有的邮件的访问权限。
针对这个问题的解决方案就是per-URI permission:当启动一个activity或者给一个activity返回结果的时候,呼叫方可以设置Intent.FLAG_GRANT_READ_URI_PERMISSION和/或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION . 这会使接收该intent的activity获取到进入该Intent指定的URI的权限,而不论它是否有权限进入该intent对应的content provider。
这种机制允许一个通常的capability-style模型,这种模型是以用户交互(如打开一个附件, 从列表中选择一个联系人)为驱动,特别获取fine-grained permissions(更细粒化的权限)。这是一种减少不必要权限的重要方式,这种方式主要针对的就是那些和程序的行为直接相关的权限。
这些URI permission的获取需要content provider(包含那些URI)的配合。强烈推荐在content provider中提供这种能力,并通过android:grantUriPermissions或者<grant-uri-permissions>标签来声明支持。
<grant-uri-permission android:path="string" android:pathPattern="string" android:pathPrefix="string" />