从内容uri获取所拍摄视频的文件

时间:2016-10-31 18:36:04

标签: android uri android-contentresolver

我有一个方法如下:

private String getRealPathFromUriForVideos(Uri selectedVideoUri) {
    String wholeID = DocumentsContract.getDocumentId(selectedVideoUri);
    String id = wholeID.split(":")[1];

    String[] column = { MediaStore.Video.Media.DATA };
    String sel = MediaStore.Video.Media._ID + "=?";
    Cursor cursor = getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, column, sel, new String[]{ id }, null);
    String filePath = "";

    int columnIndex = cursor.getColumnIndex(column[0]);
    if (cursor.moveToFirst()) {
        filePath = cursor.getString(columnIndex);
    }
    cursor.close();
    return filePath;
}

这可以很好地获取用户选择的视频文件。但是,我想让用户也可以创建新视频(来自我的应用),然后从那里获取URI和文件。新创建的视频的URI为: content:// media / external / video / media / 41 。对于选定的视频,如 content://com.android.providers.media.documents/document/video%3A42

它适用于第二个,但不适用于第一个。第一个我得到IllegalArgumentException,因为它不是文档URI。如何从第一个URI获取文件?

2 个答案:

答案 0 :(得分:3)

  

这可以很好地获取用户选择的视频文件

它可能在少数情况下有效。它一般不起作用。从ACTION_MANAGE_OVERLAY_PERMISSION之类的东西中获得的Uri不一定代表文件,更不用说可以通过文件系统访问的文件了,更不用说这个脚本小子算法允许您访问的文件了。

  

新制作视频的URI为:content:// media / external / video / media / 41

不一定。我想有一种方法可以为录制的视频获得ACTION_OPEN_DOCUMENT这样的内容,虽然我无法想到推荐的方式会给你这样的Uri。如果您使用的是UriMediaRecorder,则可以创建自己的文件(对于ACTION_VIDEO_CAPTURE,您可以创建自己的ACTION_VIDEO_CAPTURE文件。而且,如果您要创建自己的文件,则知道该文件的位置。

  

需要能够上传到我的服务器

对于视频,录制到您控制的文件,然后使用该文件。

使用一些可让您从UriUri上传的库。否则:

  • 使用InputStreamContentResolver获取openFileInput()所代表内容的InputStream
  • 在您控制的某个文件上创建Uri(例如,在FileOutputStream中)
  • 将内容从getCacheDir()复制到InputStream
  • 使用您的副本进行上传
  • 工作完成后删除副本

您将外国OutputStream视为Web服务器的URL:流式传输内容。

答案 1 :(得分:0)

似乎从我需要的第二个URI中获取它:

private String getRealPathFromUriForImagesAndVideo(Uri contentUri) {
    Cursor cursor = null;
    try {
        String[] proj = {MediaStore.Images.Media.DATA};
        cursor = getContentResolver().query(contentUri, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } catch (Exception e) {
        return contentUri.getPath();
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}