首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将视频插入MediaStore

将视频插入MediaStore
EN

Stack Overflow用户
提问于 2014-06-10 23:31:38
回答 1查看 6.2K关注 0票数 23

我正在尝试将视频插入到MediaStore中,这与使用以下方法存储图像的方式相同:

代码语言:javascript
复制
MediaStore.Images.Media.insertImage(getContentResolver(), imagePath, null, null)

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

代码语言:javascript
复制
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);
}

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

但是当cr.openOutputStream(uri);被执行时,就会抛出一个FileNotFoundException

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

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

EN

回答 1

Stack Overflow用户

发布于 2016-09-20 17:06:53

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

代码语言:javascript
复制
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。关于is的更多信息可以在here中找到,在那里您可以看到,从API19 (KitKat)开始,对Media的访问发生了变化。

通过查看安卓的源代码,你可以看到一个database video schema and columnsVideoColumnsMediaColumns扩展而来,它包含以下列:

代码语言:javascript
复制
MediaStore.MediaColumns.DATA

描述为:

Path to the file on disk.

因此,您必须从公共Uri获取真正的Uri

为了实现这一点,运行代码:

代码语言:javascript
复制
getDataColumn(context, uri, null, null);

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

代码语言:javascript
复制
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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24145036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档