Android MediaStore 插入视频
Posted
技术标签:
【中文标题】Android MediaStore 插入视频【英文标题】:Android MediaStore insertVideo 【发布时间】:2010-01-22 00:47:47 【问题描述】:所以我们的应用可以选择拍摄照片或视频。如果用户拍照,我们可以使用 MediaStore.Images.Media.insertImage 函数将新图像(通过文件路径)添加到手机的图库并生成 content:// 样式的 URI。鉴于我们只有文件路径,对于捕获的视频是否有类似的过程?
【问题讨论】:
***.com/questions/1925502/… 的可能重复项。我在那里发布了回复。 【参考方案1】:这是一个简单的“基于单个文件的解决方案”:
每当您添加一个文件时,让 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)
【讨论】:
关于获取内容样式 URI 的问题。你是怎么得到的? 我正在寻找扫描视频文件。这对你有影响吗? @qix 哦..我只是尝试使用图像。将尝试使用视频,但现在没有机会测试。 在调用它之前文件应该存储在特定位置吗? AFAIK 文件可以位于任何地方【参考方案2】:我也有兴趣,你能找到解决办法吗?
编辑:解决方案是 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));
【讨论】:
回复:已发布解决方案。请注意,Java 有 BufferedInputStream 和 BufferedOutputStream,因此您不必自己这样做。 这个怎么样:developer.android.com/reference/android/media/…【参考方案3】:如果您的应用正在生成新视频,而您只是想为 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) 开始,此方法不再有效。
【讨论】:
***.com/questions/2114168/… 是的,整个媒体存储/提供程序系统在 4.4 中进行了大修。任何针对 4.4+ 的人都应该寻找更现代的解决方案。 FWIW,我认为这不值得对这个古老问题的答案投反对票。 感谢您的回复,并对不赞成投票感到抱歉,但由于这个答案,我花了大约 0.5 小时没有去任何地方,我认为让 Android 开发人员不要这样做是件好事。我希望你明白。我不认为针对较低的 API 会有所不同,因为 Android 团队不会投入任何时间来为之前发生的未记录/不受支持的行为创建兼容性措施。删除该答案会从否决票中恢复这些点吗?如果没有,我也可以在删除之前删除反对票。 哦,发送广播对我有用:***.com/a/14849684/501940 即使在 Android P 上仍然可以工作,我想知道为什么它提到它不会在 4.4+ 上工作【参考方案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);
);
【讨论】:
【参考方案5】:试试这个代码。它似乎对我有用。
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
【讨论】:
这段代码返回 null,最新的 KitKat,Nexus 5。我猜它只适用于媒体商店中已经存在的视频,所以它更像是查询而不是插入... VID_20140313_114321 和路径建议因为它是标准相机应用在捕捉视频时的标准路径和命名。以上是关于Android MediaStore 插入视频的主要内容,如果未能解决你的问题,请参考以下文章
MediaStore.EXTRA_VIDEO_QUALITY不适用于Android视频捕获