当前位置: 首页 > 知识库问答 >
问题:

如何通过uri获取权限为“com.android.externalstorage.documents”的文件路径

慕容嘉熙
2023-03-14

我想通过打开一个文件来获得一个文件路径,该文件选择由start ActivityForResult,其意图是意图。ACTION_GET_CONTENT和setType(* / *), 但是当我选择打开“Nexus 5X”项时,返回uri是“com.android.externalstorage.documents”,如何处理这种类型uri。有一些代码。

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.putExtra(Intent.ACTION_DEVICE_STORAGE_OK, true);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setType("*/*");
startActivityForResult(intent, FILE_ADD_ACTION_REQUEST_CODE);

截图

共有2个答案

匡玉堂
2023-03-14

如何处理这种类型的uri

使用ContentResolveropenInputStream()Uri标识的内容上获取InputStream

白学
2023-03-14

外部存储URI的形式如下:

content://com.android.externalstorage.documents/root%3Apath

其中root是存储介质的根,只是一个转义冒号,path是相对于根的文件系统路径(也是转义的)。

在具有模拟主存储器的设备(即现代Android设备)上,主存储器(即/sdcard)的根通常被称为。在其他情况下,它似乎是媒体ID(由连字符分隔的4个十六进制数字)。

您也可以尝试使用此功能(需要API 21才能实现完整功能):

 public static String getRealPathFromURI_API19(Context context, Uri uri) {
    String filePath = "";

    // ExternalStorageProvider
    String docId = DocumentsContract.getDocumentId(uri);
    String[] split = docId.split(':');
    String type = split[0];

    if ("primary".equalsIgnoreCase(type)) {
        return Environment.getExternalStorageDirectory() + "/" + split[1];
    } else {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
            //getExternalMediaDirs() added in API 21
            File[] external = context.getExternalMediaDirs();
            if (external.length > 1) {
                filePath = external[1].getAbsolutePath();
                filePath = filePath.substring(0, filePath.indexOf("Android")) + split[1];
            }
        } else {
            filePath = "/storage/" + type + "/" + split[1];
        }
        return filePath;
}
 类似资料:
  • 我正在尝试创建一个存储在我的谷歌硬盘中的文件列表,以及它们当前和以前的权限列表。具体地说,我想在我的谷歌硬盘中创建一个文件列表,在过去的任何时候都有“任何人都可以查看/编辑(etc)”权限集。 我已经创建了一个谷歌应用脚本来做到这一点,我可以迭代所有的文件,我可以得到当前具有该权限集的文件,但是我看不到获取文件权限历史的方法。 我已找到并激活修订列表API:https://developers.g

  • 我想从URI中获得完整的文件路径。URI不是图像,而是音乐文件,但如果我像纵隔解决方案那样做,如果应用程序用户选择eg Astro作为浏览器,而不是音乐播放器,它就不会工作。我怎么解决这个?

  • 我在尝试选择文件时获得URI: /外部/文件/15499 我如何将它转换成真实的文件路径? 注意:我阅读了以下主题: null

  • 问题内容: 我在Eclipse中编写了一个应用程序,该应用程序已成功编译并运行。之后,在相应的目录中找到 .java和 .class文件。然后,我删除了* .class文件,现在我不知道该如何找回它。 Eclipse写道:“未编写类文件。如果这样,请尝试刷新此项目并进行构建,该项目可能会不一致”。 通过右键单击该项目,我得到了一个下拉菜单,在其中我找到了“刷新”,但找不到如何“构建”该项目。 那么

  • 在Office365中,我们使用用户“UserA”将文件“File1”上载到OneDrive。然后,我们使用图形api获取该文件的权限(https://graph.microsoft.com/me/drives/[DriveId]/items/[itemId]/权限),并按预期获得权限: 然而,我们随后将相同的文件(使用相同的用户)上载到新创建的名为“Site1”的SharePoint网站,并获得

  • 我正在尝试在我的Android10(API29)设备上获得MANAGE_EXTERNAL_STORAGE权限。 https://developer.android.com/training/data-storage/manage-all-files 清单: 主要活动: 但我怎样才能得到那个许可呢?