Android 內容提供器—建立內容提供器(實現內容提供器許可權)

來源:互聯網
上載者:User

在“安全和許可權”的專題中全面詳細的描述了有關Android系統的許可權和訪問。“資料存放區”的專題也描述了安全和許可權對各種儲存類型的影響。因此以下簡要介紹幾個重點內容:

1.  預設情況下,儲存在裝置內部儲存空間上的資料檔案是你的應用程式和提供器私人的;

2.  你建立的SQLiteDatabase資料庫對你的應用程式和提供器是私人的;

3.  預設情況下,儲存在外部儲存空間中資料檔案是共有的,你不能使用內容提供器來限制訪問外部儲存空間中的檔案,因為其他的應用程式能夠使用其他的API調用來讀/寫它們;

4.  針對裝置上內部儲存空間的開啟或建立檔案或SQLite資料庫的方法調用,隱含的會把讀/寫訪問都分配給其他應用程式。如果你使用一個內部檔案或資料庫作為你的提供器的資產庫,並且給予它“world-readable”或“world-writeable”的存取權限,那麼你在它資訊清單檔中給提供器設定的許可權將不會保護你的資料。對於內部儲存空間中的檔案和資料庫的預設訪問時“私人的”,針對你的提供器的儲存空間,你不應該改變這種預設設定。

如果你想要使用內容提供器的許可權來控制對你的資料的訪問,那麼你就應該把你的資料儲存在內部檔案、SQLite資料庫或雲端(如遠程伺服器)中,並且應該保持這些檔案和資料庫對你的應用程式私人。

實現許可權

即使底層資料是私人的,所有的應用程式也能夠針對你的提供器進行讀寫操作,因為預設情況下,你的提供器沒有使用權限設定。要改變這種情況,在你的資訊清單檔中使用<provider>元素的屬性或子項目給你的提供器設定許可權。你能夠設定應用於整個提供器的許可權,或者針對某個表的許可權,甚至是針對某個記錄的,或者三者皆有。

你能夠在資訊清單檔中用一個或多個<permission>元素給你的提供器定義許可權。要使許可權對你的提供器唯一,就要對android:name屬性使用Java風格的範圍。例如,設定讀許可權:com.example.app.provider.permission.READ_PROVIDER.

下面描述了提供器許可權的範圍,從應用於整個提供器的許可權開始,逐步變的更細的許可權。更細範圍的許可權總是優先於比它範圍大的許可權:

1.  單一的提供器層級的讀寫權限

控制整個提供器讀寫訪問的一個許可權,這個許可權在<provider>元素的android:permission屬性中指定。

2.  分開的提供器層級的讀寫權限

針對整個提供器,有一個讀許可權和一個寫入權限。你可以分別使用<provider>元素的android:readPermission和android:writePermission屬性來指定。它們優先於通過android:permission屬性許可權要求。

3.  路徑層級的許可權

針對你的提供器的一個內容資源標識的讀、寫或讀寫權限。你用<provider>元素的<permission>子項目來指定你想要控制的每個URI。對於你指定的每個內容資源標識,你能夠指定讀寫權限、讀許可權、或寫入權限,或者所有三個許可權。讀和寫的許可權要優先於讀寫權限。同時,路徑層級的許可權也優先於提供給器層級的許可權。

4.  臨時許可權

即使應用程式沒有通常要求的許可權,但是也可以給應用程式授予臨時訪問的權限等級。這種臨時存取權限的特徵減少了應用程式必須在資訊清單檔中申請許可權的數量。當你開啟臨時許可權時,應用程式只對那些持續訪問的資料才需要提供器的“持久”許可權。

在你想要允許一個外部的圖片查看器應用程式來顯示提供器中的圖片附件時,實現一個電子郵件提供器和應用程式就需要考慮這種臨時許可權。要讓這個圖片查看器不需要任何許可權就能夠進行必要的訪問,就要給這些資源標識的圖片設定臨時許可權。你的電子郵件應用程式就需要這樣的設計,以便在使用者想要顯示一張照片時,郵件應用程式能夠發送一個包含照片的資源標識(URI)和許可權標記的Intent對象給這個圖片查看器。然後,這個圖片查看器就能查詢電子郵件提供器,擷取照片,即使這個查看器沒有通常的提供器的讀許可權。

要開啟臨時許可權,即可以設定<provider>元素的android:grantUriPermissions屬性,也可以給<provider>元素添加一個或多個<grant-uri-permission>子項目。如果你使用了臨時許可權,那麼無論何時刪除提供器與臨時許可權關聯的資源標識(URI),都要調用Context.revokeUriPermission()方法。

臨時許可權的屬性(android:grantUriPermissions)值決定了你的提供有多少內容是可訪問的。如果這個屬性被設定為true,那麼系統將給整個提供器授予臨時許可權,它會覆蓋由提供器層級或路徑層級所申請其他任何許可權。

如果屬性android:grantUriPermissions被設定為false,那麼你就必須給<provider>元素添加<grant-uri-permission>子項目。每個子項目指定要授予臨時存取權限的一個或多個內容資源標識。

要把臨時存取權限委託給一個應用程式,Intent對象中必須包含FLAG_GRANT_READ_URI_PERMISSION或FLAG_GRANT_WRITE_URI_PERMISSION標識,或二者都要。用setFlags()方法設定這些標記。

如果android:grantUriPermissions屬性沒有出現,那麼就會假設它的值是false。

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.