将视频插入MediaStore

Jua*_*ana 18 video android mediastore android-contentresolver

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

MediaStore.Images.Media.insertImage(getContentResolver(), imagePath, null, null)
Run Code Online (Sandbox Code Playgroud)

由于没有类似的方法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);
}
Run Code Online (Sandbox Code Playgroud)

uri返回的non-null的形式content://media/external/video/media/{id},这似乎是正确的.

但是当cr.openOutputStream(uri);被激活时,会FileNotFoundException被抛出.

最后一点类似于Image.Media.insertImage查看其源代码所做的操作.

顺便说一句,我确实得到了WRITE_EXTERNAL_STORAGE许可.另外,我正在测试4.3和4.4.

R. *_*ski 9

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

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);
Run Code Online (Sandbox Code Playgroud)

是公的Uri。可以在此处找到更多信息,您可以其中看到,自 API 19 (KitKat) 以来,对 的访问Media已发生变化。

通过查看 Android 的源代码,您可以看到数据库视频架构和列VideoColumns扩展自MediaColumns,其中包含以下列:

MediaStore.MediaColumns.DATA
Run Code Online (Sandbox Code Playgroud)

被形容为:

磁盘上文件的路径。

所以你必须Uri从公众那里得到真实的Uri

为此,请运行以下代码:

getDataColumn(context, uri, null, null);
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

这段代码来自aFileChooser和函数getPath

  • uri 返回 null (2认同)