共享文件

在此示例中,你将学习如何与其他应用共享文件。我们将在此示例中使用 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 的临时读访问权限。