【问题标题】:Inserting a video into MediaStore将视频插入 MediaStore
【发布时间】:2014-06-10 15:31:37
【问题描述】:

我正在尝试将视频插入MediaStore,就像使用此方法可以存储图像一样:

MediaStore.Images.Media.insertImage(getContentResolver(), imagePath, null, null)

由于MediaStore.Video.Media上没有类似的方法,所以我尝试在MediaStore.Video.Media.EXTERNAL_CONTENT_URI中插入一条记录,然后将文件复制到目的地,如下所示:

ContentValues values = new ContentValues();
values.put(MediaStore.Video.Media.TITLE, "Title1");
values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
values.put(MediaStore.Video.Media.DATA, videoPath);
Uri uri = cr.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);

try {
    OutputStream os = cr.openOutputStream(uri);
    ...
    ...
} (FileNotFoundException e) {
    cr.delete(uri, null, null);
}

返回的urinon-null,形式为content://media/external/video/media/{id},看起来是正确的。

但是当cr.openOutputStream(uri);被执行时,FileNotFoundException被抛出。

最后一点类似于 Images.Media.insertImage 查看其源代码所做的。

顺便说一句,我确实有WRITE_EXTERNAL_STORAGE 权限。另外,我正在测试 4.3 和 4.4。

【问题讨论】:

  • 我的 Nexus 5 和 4.4.4 也有同样的问题。
  • 任何解决方案的人?
  • 你找到解决办法了吗?
  • 有人解决了吗?
  • 遗憾的是,我一直无法使用 MediaStore 在图库中保存视频。我找到的唯一解决方案是通过流进行经典文件保存,然后使用 MediaScanner 意图扫描输出文件,因此将其添加到手机的图库中。如果你不想绝对使用 MediaStore,我可以发布我的解决方案(使用 Xamarin/C#,但代码几乎相同,只是语法和缩进发生了变化),但如果你真的想使用 MediaStore,它赢了'不回答你的问题..

标签: android video android-contentresolver mediastore


【解决方案1】:

你从这段代码中得到了什么:

ContentValues values = new ContentValues();
values.put(MediaStore.Video.Media.TITLE, "Title1");
values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
values.put(MediaStore.Video.Media.DATA, videoPath);
Uri uri = cr.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);

是一个公共Uri。可以在here 找到更多相关信息,您可以在其中看到,自从 API 19 (KitKat) 以来,对Media 的访问已经改变。

通过查看 Android 的源代码,您可以看到 database video schema and columnsVideoColumns 扩展自 MediaColumns,其中有以下列:

MediaStore.MediaColumns.DATA

描述为:

Path to the file on disk.

所以你必须从公共Uri 那里得到真正的Uri

为了这个运行代码:

getDataColumn(context, uri, null, null);

其中uri 是您的公共Uri,函数getDataColumn 如下所示:

public static String getDataColumn(Context context, Uri uri, String selection,
                                   String[] selectionArgs) {

    Cursor cursor = null;
    final String column = MediaStore.MediaColumns.DATA;
    final String[] projection = {
            column
    };

    try {
        cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                null);
        if (cursor != null && cursor.moveToFirst()) {
            final int column_index = cursor.getColumnIndexOrThrow(column);
            return cursor.getString(column_index);
        }
    } finally {
        if (cursor != null)
            cursor.close();
    }
    return null;
}

这段代码来自aFileChooser和函数getPath

【讨论】:

  • uri 返回 null
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2020-01-15
  • 2019-08-25
  • 1970-01-01
相关资源
最近更新 更多