共享檔案

在此示例中,你將學習如何與其他應用共享檔案。我們將在此示例中使用 pdf 檔案,儘管程式碼也適用於所有其他格式。

路線圖:

指定要放置要共享的檔案的目錄

要共享檔案,我們將使用 FileProvider,這是一個允許在應用程式之間共享檔案的類。FileProvider 只能共享預定義目錄中的檔案,所以我們來定義它們。

  1. 建立一個包含路徑的新 XML 檔案,例如 res / xml / filepaths.xml

  2. 新增路徑

    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <files-path name="pdf_folder" path="documents/"/>
    </paths>
    

定義 FileProvider 並將其與檔案路徑連結

這是在清單中完成的:

<manifest>
    ...
    <application>
        ...
        <provider
            android:name="android.support.v4.context.FileProvider"
            android:authorities="com.mydomain.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>
        ...
    </application>
    ...
</manifest>

生成檔案的 URI

要共享檔案,我們必須提供檔案的識別符號。這是通過使用 URI(統一資源識別符號)來完成的。

// We assume the file we want to load is in the documents/ subdirectory
// of the internal storage
File documentsPath = new File(Context.getFilesDir(), "documents");
File file = new File(documentsPath, "sample.pdf");
// This can also in one line of course:
// File file = new File(Context.getFilesDir(), "documents/sample.pdf");

Uri uri = FileProvider.getUriForFile(getContext(), "com.mydomain.fileprovider", file);

正如你在程式碼中看到的,我們首先建立一個表示該檔案的新 File 類。要獲取 URI,我們要求 FileProvider 為我們提供一個。第二個引數很重要:它傳遞了 FileProvider 的許可權。它必須等於清單中定義的 FileProvider 的許可權。

與其他應用共享該檔案

我們使用 ShareCompat 與其他應用共享該檔案:

Intent intent = ShareCompat.IntentBuilder.from(getContext())
    .setType("application/pdf")
    .setStream(uri)
    .setChooserTitle("Choose bar")
    .createChooserIntent()
    .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

Context.startActivity(intent);

選擇器是一個選單,使用者可以從中選擇他/她想要共享檔案的應用程式。需要標誌 Intent.FLAG_GRANT_READ_URI_PERMISSION 來授予對 URI 的臨時讀訪問許可權。