【问题标题】:How to get real path of selected video from device如何从设备获取所选视频的真实路径
【发布时间】:2017-05-28 12:13:49
【问题描述】:

我想从 URI 中检索视频的真实路径

我用 startActivityForResult

打开视频库
startActivityForResult(
                        Intent.createChooser(
                                new Intent(Intent.ACTION_GET_CONTENT)
                                .setType("video/*"), "Choose Video"),
                        REQUEST_VIDEO
                        );

我正在 onActivityResult

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

        if(resultCode == RESULT_OK){
            if(requestCode == REQUEST_VIDEO){

                Uri uri = data.getData();
                String realpath = getRealPathFromURI(getContext(),uri);

            }
}

getRealPathFromUri是这样的;

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

但realpath总是返回null;

我搜索它,但仍然返回 null

它与 sdk_version 一致?

还是将MediaStore.Images.Media.DATA 更改为MediaStore.Video.Media.DATA

我被困在这里,不知道,请建议!任何帮助都将非常有价值

--谢谢!

【问题讨论】:

  • 您能找到解决方案吗?你能更新一下吗?

标签: android path uri


【解决方案1】:

试试这个,

public static String getRealVideoPathFromURI(ContentResolver contentResolver,
                                                 Uri contentURI) {
        Cursor cursor = contentResolver.query(contentURI, null, null, null,
                null);
        if (cursor == null)
            return contentURI.getPath();
        else {
            cursor.moveToFirst();
            int idx = cursor.getColumnIndex(Video.VideoColumns.DATA);
            try {
                return cursor.getString(idx);
            } catch (Exception exception) {
                return null;
            }
        }
    }

【讨论】:

  • 谢谢但仍然返回null;
  • 在 onActivityResult 改变这个,String video= getRealVideoPathFromURI(getContentResolver(), videoUri);
  • 字符串路径 = getRealVideoPathFromURI(getActivity().getContentResolver(),videouri);是的,我试过了,但仍然为空
【解决方案2】:

一旦你有了Uri,你就可以通过这种方式获得绝对文件路径:

File myFile = new File(uri.getPath());
myFile.getAbsolutePath();

【讨论】:

  • 我试过但我有疑问,它返回 /document/video:####(####is number) 我认为它不是来自视频文件的真实路径,因为当我进入文件管理器时并查看选定的视频文件信息,它返回 /storage/0/emulated/... 像这样我想要那个路径
  • onActivityResult() 中登录时会得到什么:data.getData().toString()?告诉我
  • Uri uri = data.getData();字符串路径 = uri.getPath().toString();日志说,/document/video:2745
  • 请问获取绝对路径有什么要求?
  • 我想从路径中选择视频文件 id
【解决方案3】:

据我了解,获取“真实”文件路径的方式取决于 Android 的 SDK 版本。

场景 1) 我在模拟器上运行 targetSdkVersion 28,我可以使用 onActivityResult 中的这个简单命令获取“真实”文件路径:

data.getData().getPath();

场景 2)但在我的物理设备 SDK 级别 25 中,我得到的正是您显示的内容:内容路径或类似的东西。

content://media/external/file/3131

“真实”文件路径在哪里:

/storage/emulated/0/Download/lista_produtos.xlsx

为了在我的物理设备中获取“真实”文件路径并考虑到我的模拟器,我在onActivityResult 中使用了这段代码:

    Uri uri = data.getData();
    String realPath;
    if (DocumentsContract.isDocumentUri(getApplicationContext(), uri)) {

        String[] path = uri.getPath().split(":");
        realPath = path[1];
        Log.i("debinf ProdAct", "Real file path on Emulator: "+realPath);
    } else {

        CursorLoader cursorLoader = new CursorLoader(getApplicationContext(), uri, null, null, null,null);
        Cursor cursor = cursorLoader.loadInBackground();
        int idx = cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA);
        cursor.moveToFirst();
        realPath = cursor.getString(idx);
        Log.i("debinf ProdAct", "Real file path in physical device "+realPath);
        cursor.close();
    }

我猜在你的情况下,更合适的索引是:

int idx = cursor.getColumnIndex(MediaStore.Video.Media.DATA);

希望对您有所帮助,因为我没有使用过您的代码。正如我之前所说,这取决于 Android 的 SDK 版本。

另请参阅:https://stackoverflow.com/a/49687681/4300670

【讨论】:

    【解决方案4】:

    我猜你没有授予对外部存储的读写权限。我有同样的问题,授予权限并没有解决它。谁知道呢,愿它解决你的问题!

    【讨论】:

      猜你喜欢
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多