将视频插入MediaStore

时间:2014-06-10 15:31:38

标签: android video android-contentresolver mediastore

我尝试将视频插入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);
}

uri以[{1}}的形式返回non-null,这似乎是正确的。

但是当content://media/external/video/media/{id}被提取时,会抛出cr.openOutputStream(uri);

最后一点类似于Images.Media.insertImage查看源代码的内容。

是的,我确实有FileNotFoundException的许可。另外,我正在测试4.3& 4.4。

1 个答案:

答案 0 :(得分: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 columnsVideoColumnsMediaColumns延伸,其中包含以下列:

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