在模拟器上从uri获取文件路径

时间:2015-04-09 18:41:12

标签: android storage

我想从Uri获取视频的文件路径。在使用真实设备进行测试时,以下方法可以正常工作,但是,在模拟器上进行测试时,它会失败(返回null)。

    public String getRealPathFromURI(Context context, Uri contentUri) {
        Cursor cursor = null;
        try {
            String[] proj = {MediaStore.Video.Media.DATA};
            cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
        return null;
    }

在模拟器上从uri获取文件路径的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

  

使用真实设备进行测试时,以下方法可以正常工作

仅适用于您尝试过的设备,仅适用于您尝试过的应用。特别是在Android 4.4+上,您的方法将不可靠。那是因为a Uri is not a file。在旧版Android上,对于Uri中的MediaStore,您的方法可能会有效。

如今,请勿尝试获取Uri的文件。按照Uri上的方法使用ContentResolver上的方法获取InputStream,MIME类型等。{/ p>

  

在模拟器上从uri获取文件路径的正确方法是什么?

没有。没有与Uri关联的文件路径,更不用说应用程序能够使用Java文件I / O访问的路径。

答案 1 :(得分:1)

正如CommonsWare所提到的,Uri不是文件。处理Uri的一般方法是使用输入流并将内容保存为文件(假设这是您正在寻找的)。我通常做的是

  1. 获取与Uri相关联的元数据(获取数据/大小的标题/类型)
  2. 通过输入流获取内容,将其作为文件保存在设备上。
  3. 在此页面上查看“检查文档元数据”和“获取输入流”:https://developer.android.com/guide/topics/providers/document-provider.html