所以我们的应用程序可以选择拍照或录像。如果用户拍照,我们可以使用 MediaStore.Images.Media.insertImage 函数将新图像(通过文件路径)添加到手机的图库并生成 content:// 样式的 URI。鉴于我们只有它的文件路径,对于捕获的视频是否有类似的过程?
问问题
17368 次
5 回答
12
这是一个简单的“基于单个文件的解决方案”:
每当您添加文件时,让 MediaStore Content Provider 使用
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(imageAdded)));
主要优势:使用 MediaStore 支持的任何 mime 类型
每当您删除文件时,让 MediaStore Content Provider 使用
getContentResolver().delete(uri, null, null)
于 2013-02-13T08:53:52.300 回答
7
我也有兴趣,能找到解决办法吗?
编辑:解决方案是 RTFM。基于“内容提供者”一章,这是我的有效代码:
// Save the name and description of a video in a ContentValues map.
ContentValues values = new ContentValues(2);
values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
// values.put(MediaStore.Video.Media.DATA, f.getAbsolutePath());
// Add a new record (identified by uri) without the video, but with the values just set.
Uri uri = getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
// Now get a handle to the file for that record, and save the data into it.
try {
InputStream is = new FileInputStream(f);
OutputStream os = getContentResolver().openOutputStream(uri);
byte[] buffer = new byte[4096]; // tweaking this number may increase performance
int len;
while ((len = is.read(buffer)) != -1){
os.write(buffer, 0, len);
}
os.flush();
is.close();
os.close();
} catch (Exception e) {
Log.e(TAG, "exception while writing video: ", e);
}
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
于 2010-02-10T12:35:32.537 回答
6
如果您的应用正在生成一个新视频,并且您只是想为 MediaStore 提供一些元数据,您可以在此函数的基础上进行构建:
public Uri addVideo(File videoFile) {
ContentValues values = new ContentValues(3);
values.put(MediaStore.Video.Media.TITLE, "My video title");
values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
values.put(MediaStore.Video.Media.DATA, videoFile.getAbsolutePath());
return getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
}
编辑:从 Android 4.4 (KitKat) 开始,此方法不再有效。
于 2012-07-31T18:52:29.480 回答
4
我无法让Intent.ACTION_MEDIA_SCANNER_SCAN_FILE
广播在 API 21(Lollipop)下为我MediaScannerConnection
工作,但确实有效,例如:
MediaScannerConnection.scanFile(
context, new String[] { path }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.d(TAG, "Finished scanning " + path + " New row: " + uri);
}
} );
于 2015-04-20T01:44:58.450 回答
1
试试这个代码。它似乎对我有用。
filePath = myfile.getAbsolutePath();
ContentValues values = new ContentValues();
values.put(MediaStore.Video.Media.DATA, filePath);
return context.getContentResolver().insert(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
文件路径示例 -
/storage/emulated/0/DCIM/Camera/VID_20140313_114321.mp4
于 2014-03-13T08:38:50.823 回答