【问题标题】:Getting file from content uri for videos taken从内容 uri 获取所拍摄视频的文件
【发布时间】:2017-03-13 21:41:24
【问题描述】:

我有一个方法如下:

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 获取文件?

【问题讨论】:

  • 你为什么想要“文件”?
  • 需要能够上传到我的服务器。
  • 您不需要文件路径。只需为此使用uri。请准确解释为什么需要文件系统路径而不是内容方案。
  • 我只是解释了为什么我需要它并找到了解决方案。谢谢。上传我需要访问我的代码文件的对象。

标签: android uri android-contentresolver


【解决方案1】:

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

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

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

不一定。我想有一种方法可以让您获得像录制视频那样的Uri,尽管我想不出一个推荐的方法来给您这样的Uri。如果您使用MediaRecorderACTION_VIDEO_CAPTURE,则创建您自己的文件(对于ACTION_VIDEO_CAPTURE,您自己的Uri 用于该文件)。而且,如果您正在创建自己的文件,您就知道该文件在哪里。

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

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

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

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

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

【讨论】:

  • 既然有办法直接获取文件,为什么要这样对待呢?用户空间问题呢?
  • @KVISH: "什么时候可以直接获取文件?" -- 因为没有办法直接获取任意Uri 的文件。 Uri 可能指向另一个应用程序内部存储中的文件,您无法访问该文件。 Uri 可能指向可移动存储上的文件,您无法访问该文件。 Uri 可能指向数据库中的 BLOB 列,您无法访问该列。 Uri 可能指向一个加密文件,您可以访问但不能使用该文件。以此类推。
  • @KVISH:“用户空间问题呢?” -- 只会在短时间内出现重复副本,并且只有在您决定不使用允许您从UriInputStream 上传的库时。
【解决方案2】:

似乎从我需要的第二个 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();
        }
    }
}

【讨论】:

    猜你喜欢
    • 2017-05-08
    • 1970-01-01
    • 2014-06-06
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多