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

Getting file path from uri on emulator

我想从 Uri 获取视频的文件路径。以下方法在真实设备上测试时工作正常,但是在模拟器上测试时失败(returns 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 获取文件路径的正确方法是什么?

The following method works fine when testing with a real device

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

现在,不要试图为 Uri 获取文件。按预期使用 Uri,使用 ContentResolver 上的方法获取 InputStream、MIME 类型等

What is the correct way of getting file path from uri on emulator?

有none。不必有与 Uri 关联的文件路径,更不用说您的应用程序能够使用 Java 文件 I/O.

访问的路径

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

  1. 获取与 Uri 关联的元数据(获取标题/数据类型/大小)
  2. 通过输入流获取内容以将其作为文件保存在设备上。

查看此页面上的 "Examine document metadata" 和 "get an inputstream":https://developer.android.com/guide/topics/providers/document-provider.html