首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ContentResolver从Uri获取文件路径

使用ContentResolver从Uri获取文件路径
EN

Stack Overflow用户
提问于 2016-08-11 07:13:31
回答 1查看 2.8K关注 0票数 0
  • 目标:使用意图选择一个文件
  • 用途:文件上传

问:如何从Uri获得文件路径。请注意,没有特定的文件类型。用户可以从设备上可用的文件选择器列表中选择任何文件。

到目前为止我编码的内容

代码语言:javascript
运行
复制
{
//File Pick Intent
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        try {
            (context).startActivityForResult(
                    Intent.createChooser(intent, "Select a File to Upload"),
                    PICK_FILE);
        }
        catch (android.content.ActivityNotFoundException ex) {
            Toast.makeText(context, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
        }
}

// On Activity Result
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {

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

            Uri uri = intent.getData();

            String mimeType = getContentResolver().getType(uri);
            Cursor returnCursor = getContentResolver().query(uri,null, null, null, null);

            int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
            int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);

            System.out.println("mime: "+ mimeType);
            System.out.println("name: " + returnCursor.getString(nameIndex));
            System.out.println("size: " + returnCursor.getString(sizeIndex));

            // File Input Stream gets me file data
            InputStream inputStream = getContentResolver().openInputStream(uri);
            // Can create a file using this stream but I am looking for some better dolution that gives me file path instead

}

从意图返回的典型Uris是

代码语言:javascript
运行
复制
1. { dat=content://com.google.android.apps.docs.storage/document/acc=1;doc=107 flg=0x1 }
2. { dat=file:///Removable/MicroSD/docs/doccuments.rar flg=0x3 }
3. { dat=content://media/external/audio/media/1110 }
4. { dat=content://com.android.externalstorage.documents/document/primary:.profig.os flg=0x1 }

现在我有了fileNameMimeTypefileSize &这是我的目的,但是

如何从内容提供者获得filePath而不是使用inputStream?

EN

回答 1

Stack Overflow用户

发布于 2016-08-11 07:30:50

您已经使用了正确的解决方案。通过获取文件路径,您可能会尝试直接读取文件,但是由于沙箱,在大多数情况下它都会失败。例如,如果文件位于另一个应用程序的app目录中。通过使用内容提供程序,其他应用程序可以向某些uris授予读取权限,这些uris允许您读取文件。

而且,在编写内容提供程序时,没有人强迫您导出文件路径。在内部,你必须处理它们,但从外部看,只有uris才重要。因此,作为提供者的使用者,您可以也不应该对文件路径做出任何假设。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38889645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档