Content Provider的權限的管理很複雜,因此須要慢慢的說。android
<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>標籤來聲明支持。app
<grant-uri-permission android:path="string" android:pathPattern="string" android:pathPrefix="string" />