java - 如何将视频保存到图库并检索保存的视频 uri?
问题描述
我正在尝试为我的应用程序保存到图库功能。我的应用程序的最低 api 级别为 21,最高 30。这是我用于将视频保存到图库的代码。一切正常,但代码仅适用于 API 29 及更高版本。这是代码:
String videoFileName = "video_" + System.currentTimeMillis() + ".mp4";
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
ContentValues valuesvideos;
valuesvideos = new ContentValues();
valuesvideos.put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/" + "Folder");
valuesvideos.put(MediaStore.Video.Media.TITLE, videoFileName);
valuesvideos.put(MediaStore.Video.Media.DISPLAY_NAME, videoFileName);
valuesvideos.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
valuesvideos.put(MediaStore.Video.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
valuesvideos.put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis());
valuesvideos.put(MediaStore.Video.Media.IS_PENDING, 1);
ContentResolver resolver = context.getContentResolver();
Uri collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
Uri uriSavedVideo = resolver.insert(collection, valuesvideos);
ParcelFileDescriptor parcelFileDescriptor;
try {
assert uriSavedVideo != null;
parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uriSavedVideo, "w");
assert parcelFileDescriptor != null;
FileOutputStream out = new FileOutputStream(parcelFileDescriptor.getFileDescriptor());
FileInputStream in = new FileInputStream(context.getExternalFilesDir(Environment.DIRECTORY_MOVIES) + File.separator + "Application" + File.separator + "video.mp4");
byte[] buf = new byte[8192];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.close();
in.close();
parcelFileDescriptor.close();
} catch (Exception e) {
e.printStackTrace();
}
valuesvideos.clear();
valuesvideos.put(MediaStore.Video.Media.IS_PENDING, 0);
context.getContentResolver().update(uriSavedVideo, valuesvideos, null, null);
}
这是我用于 API 29 以下版本的代码:
ContentValues valuesvideos;
valuesvideos = new ContentValues();
valuesvideos.put(MediaStore.Video.Media.DATA, context.getExternalFilesDir(Environment.DIRECTORY_MOVIES) + File.separator + "Folder");
valuesvideos.put(MediaStore.Video.Media.TITLE, videoFileName);
valuesvideos.put(MediaStore.Video.Media.DISPLAY_NAME, videoFileName);
valuesvideos.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
valuesvideos.put(MediaStore.Video.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
ContentResolver resolver = context.getContentResolver();
Uri collection = MediaStore.Video.Media.INTERNAL_CONTENT_URI;
Uri uriSavedVideo = resolver.insert(collection, valuesvideos);
ParcelFileDescriptor parcelFileDescriptor;
try {
assert uriSavedVideo != null;
parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uriSavedVideo, "w");
assert parcelFileDescriptor != null;
FileOutputStream out = new FileOutputStream(parcelFileDescriptor.getFileDescriptor());
FileInputStream in = new FileInputStream(context.getExternalFilesDir(Environment.DIRECTORY_MOVIES) + File.separator + "Application" + File.separator + "video.mp4");
byte[] buf = new byte[8192];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.close();
in.close();
parcelFileDescriptor.close();
} catch (Exception e) {
e.printStackTrace();
}
valuesvideos.clear();
context.getContentResolver().update(uriSavedVideo, valuesvideos, null, null);
如何为较低的 API 编写这个精确的函数?现在我尝试了 MediaScanner,但它似乎太慢了,我无法获取已保存文件的 uri。希望你能回答。问候。
解决方案
推荐阅读
- excel - 在其他工作表中搜索多个标题(列),复制数据并粘贴到主文件中
- node.js - 将 NodejS API 与 Apache 一起使用
- python - 使用 Pandas 导入 Excel 文件时出现问题
- node.js - 使用 node.js 从谷歌云存储中删除多个对象(文件和文件夹)的最佳做法是什么
- amazon-web-services - 从 PowerShell SSM cmdlet 向 EC2 实例发送多行脚本
- javascript - 为什么 RegExp() 不等同于 JavaScript 中显式定义的正则表达式?
- ios - 更改 UIButton 内的 SF 符号大小
- java - Java Selenide:如何使用注解 @Setter 将字符串添加到 xpath
- scala - Scala/Spark/Databricks:如何从用户创建的 JAR 中导入代码?
- c++ - 返回静态常量值