我尝试将视频插入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。
答案 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 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