繁体   English   中英

Android从相对uri到ACTION_OPEN_DOCUMENT打开InputStream?

[英]Android open InputStream from relative uri to ACTION_OPEN_DOCUMENT?

我试图在android 4.4(api级别19)中打开多个与json配置文件相关的文件

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType({mime});
this.startActivityForResult(intent, {code});

让用户找到配置文件,然后从那里打开多个文件,这些文件我知道配置文件的路径。

但是我明白了

Caused by: java.lang.SecurityException: 
Permission Denial: reading com.android.providers.downloads.DownloadStorageProvider
uri content://com.android.providers.downloads.documents/document/raw:/storage/emulated/0/Download/{relative file}
requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs

我不想使用用户界面打开其他文件,因此我尝试添加以下权限而没有得到任何结果

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS "/>

我宁愿文件分开而不是Blob或zip文件

ACTION_OPEN_DOCUMENT仅使您可以完全访问用户选择的文件(如果使用EXTRA_ALLOW_MULTIPLE ,则可以访问多个文件)。

您可以使用ACTION_OPEN_DOCUMENT_TREE允许用户选择一个文件夹-然后,您将可以访问该文件夹中的所有文件(及其子文件夹)。

如果需要让用户从文件选择器中选择多个文件,则可以执行以下操作:

它是我的应用程序的一部分,您可以根据需要进行调整。 此功能从API 18开始

private void openFileChooser() {
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.setType("*/*");
    i.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
    i.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
    startActivityForResult(i, REQUEST_CODE_DOC_ALL_FILES);
}

然后,您将获得选定的Uris:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

if (requestCode == REQUEST_CODE_DOC_ALL_FILES && resultCode == Activity.RESULT_OK) {

        if (data == null || (data.getData() == null && data.getClipData() == null)) {
            Toast.makeText(getContext(), R.string.invalid_source, Toast.LENGTH_SHORT).show();
            return;
        }


        //get result after user action (selecting files) and transform it into array of Uris
        Uri[] uriPaths;
        if (data.getData() != null) { // only one uri was selected by user
            uriPaths = new Uri[1];
            uriPaths[0] = data.getData();
        } else if (data.getClipData() != null) {
            int selectedCount = data.getClipData().getItemCount();
            uriPaths = new Uri[selectedCount];
            for (int i = 0; i < selectedCount; i++) {
                uriPaths[i] = data.getClipData().getItemAt(i).getUri();
            }
        } 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM