ACTION_GET_CONTENT 操作),而是使用 ACTION_OPEN_DOCUMENT 操作并指定 MIME 类型,请求打开由另一个应用管理的文件。如果还需要允许用户创建应用可写入的新文档,可改用 ACTION_CREATE_DOCUMENT 操作。例如,ACTION_CREATE_DOCUMENTACTION_GET_CONTENT 操作传递至您的 onActivityResult() 方法的 Intent 可能返回任何类型的 URI,来自 ACTION_OPEN_DOCUMENT 和ACTION_CREATE_DOCUMENT 的结果 Intent 始终将所选文件指定为 DocumentsProvider 支持的 content: URI。您可以通过 openFileDescriptor() 打开该文件,并使用 DocumentsContract.DocumentACTION_OPEN_DOCUMENT操作(而不是使用 ACTION_GET_CONTENT)。EXTRA_ALLOW_MULTIPLE 并将其设置为 true,允许用户选择多个文件。如果用户只选择一项,您就可以从 getData() 检索该项目。如果用户选择多项,则 getData() 返回 null,此时您必须改为从 getClipData() 返回的 ClipData :您的 Intent 必须指定 MIME 类型,并且必须声明 CATEGORY_OPENABLE 类别。必要时,您可以使用 EXTRA_MIME_TYPES extra 添加一个 MIME 类型数组来指定多个 MIME 类型 — 如果您这样做,必须将 setType() 中的主 MIME 类型设置为 "*/*"

操作

ACTION_OPEN_DOCUMENT 或


ACTION_CREATE_DOCUMENT

数据 URI 架构

MIME 类型

与用户应选择的文件类型对应的 MIME 类型。 Extra

EXTRA_MIME_TYPES

setType() 中将主 MIME 类型设置为 

"*/*"

EXTRA_ALLOW_MULTIPLE

一个布尔型值,声明用户是否可以一次选择多个文件。 EXTRA_TITLE

ACTION_CREATE_DOCUMENT

EXTRA_LOCAL_ONLY

一个布尔型值,声明是否返回的文件必须直接存在于设备上,而不是需要从远程服务下载。 类别

CATEGORY_OPENABLE

openFileDescriptor()

用于获取照片的示例 Intent

static final int REQUEST_IMAGE_OPEN = 1;

public void selectImage() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.setType("image/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test.
    startActivityForResult(intent, REQUEST_IMAGE_OPEN);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) {
        Uri fullPhotoUri = data.getData();
        // Do work with full size photo saved at fullPhotoUri
        ...
    }
}



ACTION_OPEN_DOCUMENTDocumentsProvider,并加入一个 PROVIDER_INTERFACE Intent 过滤器 ("android.content.action.DOCUMENTS_PROVIDER")。例如:

<provider ...
    android:grantUriPermissions="true"
    android:exported="true"
    android:permission="android.permission.MANAGE_DOCUMENTS">
    <intent-filter>
        <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
    </intent-filter>
</provider>



如需了解有关如何实现从其他应用打开您的应用管理的文件的详细信息,请阅读

存储访问框架

指南。