使用儲存空間存取架構開啟檔案

Android 4.4 (API 級別 19) 引入了儲存空間存取架構 (SAF)。SAF 可讓使用者跨所有偏好的文件儲存空間供應商瀏覽及開啟文件、圖片和其他檔案。標準且易於使用的 UI 可讓使用者在不同的應用程式和供應商之間,以一致的方式瀏覽檔案及存取近期檔案。

Cloud 或本機儲存服務可實作封裝其服務的 DocumentsProvider,並參與這個生態系統。用戶端應用程式若需要存取供應商的文件,只需加入幾行程式碼,就能與 SAF 整合。

SAF 包含下列項目:

  • 文件供應器:讓儲存空間服務 (例如 Google 雲端硬碟) 的內容供應器會顯示其管理的檔案。文件供應器會實作為 DocumentsProvider 類別的子類別。文件供應商結構定義以傳統的檔案階層為基礎,但文件供應商實際儲存資料的方式由您決定。Android 平台提供數個內建文件供應商,例如下載、圖片和影片。
  • 用戶端應用程式:此自訂應用程式可叫用 ACTION_CREATE_DOCUMENTACTION_OPEN_DOCUMENTACTION_OPEN_DOCUMENT_TREE 意圖動作,並接收文件供應器傳回的檔案。
  • 挑選器:這個系統 UI,可讓使用者從所有文件供應器存取符合用戶端應用程式搜尋條件的文件。

SAF 提供以下功能:

  • 允許使用者瀏覽所有文件供應器的內容,而不只是單一應用程式。
  • 可讓應用程式長期持續存取文件供應商擁有的文件。透過這項存取權,使用者可以新增、編輯、儲存及刪除供應器中的檔案。
  • 支援多個使用者帳戶和暫時根層級 (例如 USB 儲存裝置供應商),這些根根憑證只會在裝置插入磁碟時顯示。

總覽

SAF 以某個 DocumentsProvider 類別的子類別內容供應器為中心。在文件供應器中,資料的結構是傳統的檔案階層:

資料模型

圖 1 文件提供者資料模型。根點指向單一文件,然後展開樹狀結構展開畫面。

請注意:

  • 每個文件供應器會回報一或多個「根」,起點是從探索文件樹狀結構的起點。每個根層級都有專屬的 COLUMN_ROOT_ID,並指向代表該根下內容的文件 (目錄)。根層級經過動態設計,可支援多個帳戶、暫時性 USB 儲存裝置或使用者登入及登出等用途。
  • 每個根層級底下都有一份文件。該文件指向 1 到「N」份文件,每個文件都指向 1 到「N」份文件。
  • 每個儲存空間後端都會以不重複的 COLUMN_DOCUMENT_ID 參照個別檔案和目錄,來顯示個別檔案和目錄。文件 ID 是獨一無二的,且核發後不會變更,因為它們會用來在裝置重新啟動時用於永久 URI 授權。
  • 文件可以是特定 MIME 類型可開啟的檔案,也可以是包含其他文件的目錄 (具有 MIME_TYPE_DIR MIME 類型)。
  • COLUMN_FLAGS 所述,每份文件都可以有不同的功能。例如 FLAG_SUPPORTS_WRITEFLAG_SUPPORTS_DELETEFLAG_SUPPORTS_THUMBNAIL。同一個 COLUMN_DOCUMENT_ID 可以加到多個目錄中。

控制流程

文件提供者資料模型以傳統的檔案階層為基礎。不過,只要能使用 DocumentsProvider API 存取資料,您就可以按照自己的方式實際儲存資料。舉例來說,您可以使用標記式雲端儲存空間來儲存資料。

圖 2 顯示相片應用程式如何使用 SAF 存取儲存的資料:

應用程式

圖 2. 儲存空間存取架構流程。

請注意:

  • 在 SAF 中,供應商和用戶端不會直接互動,用戶端會要求與檔案互動的權限,代表讀取、編輯、建立或刪除檔案。
  • 互動會在應用程式 (在此相片應用程式範例中) 觸發 ACTION_OPEN_DOCUMENTACTION_CREATE_DOCUMENT 意圖時啟動。意圖可以加入篩選器來進一步縮小條件,例如「告知我所有具有「圖片」MIME 類型的可開啟檔案」。
  • 當意圖啟動後,系統挑選器會前往每個已註冊的供應器,並向使用者顯示相符內容的根目錄。
  • 挑選器提供標準介面,可讓使用者存取文件,即使基礎文件供應器大不相同也不受影響。舉例來說,圖 2 顯示的是 Google 雲端硬碟供應商、USB 供應商和雲端服務供應商。

在圖 3 中,使用者在搜尋圖片時開啟的挑選器中選取「Downloads」資料夾。挑選器也會顯示用戶端應用程式可用的所有根。

在系統選擇器中選取資料夾的螢幕截圖

圖 3. 顯示選取做為搜尋位置的「Downloads」資料夾的挑選器。

使用者選取「下載」資料夾後,就會看到圖片。圖 4 顯示這項程序的結果。使用者現在可以透過供應器和用戶端應用程式支援的方式與圖片互動。

「下載」資料夾的螢幕截圖

圖 4. 儲存在「下載」資料夾中的圖片,如系統挑選器所示。

編寫用戶端應用程式

在 Android 4.3 以下版本中,如要讓應用程式從其他應用程式擷取檔案,則必須叫用意圖,例如 ACTION_PICKACTION_GET_CONTENT。接著,使用者選取單一應用程式來選擇檔案。所選應用程式必須提供使用者介面,讓使用者瀏覽及挑選可用的檔案。

在 Android 4.4 (API 級別 19) 以上版本中,您還可以使用 ACTION_OPEN_DOCUMENT 意圖,藉此顯示系統控制的挑選器 UI,讓使用者瀏覽其他應用程式提供的所有檔案。使用者可透過此單一 UI,從任何支援的應用程式中挑選檔案。

在 Android 5.0 (API 級別 21) 以上版本中,您也可以使用 ACTION_OPEN_DOCUMENT_TREE 意圖,讓使用者選擇目錄,供用戶端應用程式存取。

注意: ACTION_OPEN_DOCUMENT 無法取代 ACTION_GET_CONTENT,具體方式取決於應用程式的需求:

  • 如果您希望應用程式讀取或匯入資料,請使用 ACTION_GET_CONTENT。使用這個方法時,應用程式會匯入資料副本,例如圖片檔。
  • 如果您希望應用程式能夠長期存取文件供應商擁有的文件,請使用 ACTION_OPEN_DOCUMENT。其中一個範例相片編輯應用程式可讓使用者編輯儲存在文件供應器中的圖片。

如要進一步瞭解如何使用系統選擇器 UI 支援瀏覽檔案和目錄的功能,請參閱「存取文件和其他檔案」指南。

其他資源

如要進一步瞭解文件供應器,請參考下列資源:

範例

影片