我正在尝试将视频插入到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
是content://media/external/video/media/{id}
形式的non-null
,这似乎是正确的。
但是当cr.openOutputStream(uri);
被执行时,就会抛出一个FileNotFoundException
。
最后一点类似于Images.Media.insertImage查看其源代码时所做的事情。
顺便说一句,我确实有WRITE_EXTERNAL_STORAGE
权限。另外,我正在4.3和4.4上测试。
发布于 2016-09-20 17:06:53
你从这段代码中得到了什么:
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 columns。VideoColumns
从MediaColumns
扩展而来,它包含以下列:
MediaStore.MediaColumns.DATA
描述为:
因此,您必须从公共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
https://stackoverflow.com/questions/24145036
复制相似问题