使用 Android 的 MediaStore(ContentResolver/范围存储)创建图像文件后文件扩展名和文件名错误
Posted
技术标签:
【中文标题】使用 Android 的 MediaStore(ContentResolver/范围存储)创建图像文件后文件扩展名和文件名错误【英文标题】:Wrong file extension and file name after creating image file with Android's MediaStore (ContentResolver/scoped storage) 【发布时间】:2020-03-29 14:42:24 【问题描述】:我正在使用MediaStore and ContentResolver API 使用MediaStore.Images
保存图像文件 (jpg/png/gif)。
它可以工作,但问题是所有文件都以 .jpg 扩展名保存,并且文件名始终为 “以millis.jpg 为单位的当前时间”。
这是我在 ContentValues 中放入的示例:
date_added=1575480356 _display_name=2067623.gif date_modified=1575480356 mime_type=image/gif
但是在将其插入 ContentResolver 并写入文件后,显示名称更改为2067623.jpg
,文件名称更改为1575480356.jpg
。
如何让其保留文件名和扩展名?
代码:
ContentResolver resolver = activity.getContentResolver();
Uri mediaCollection;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
mediaCollection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
else
mediaCollection = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentValues mediaDetails = new ContentValues();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
final String relativeLocation = Environment.DIRECTORY_PICTURES + File.separator + "my_folder";
mediaDetails.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
mediaDetails.put(MediaStore.Images.Media.IS_PENDING, 1);
mediaDetails.put(MediaStore.MediaColumns.RELATIVE_PATH, relativeLocation);
String mimeType = "image" + "/" + getExtension(p); // jpg/png/gif
mediaDetails.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
mediaDetails.put(MediaStore.Images.Media.MIME_TYPE, mimeType);
mediaDetails.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
mediaDetails.put(MediaStore.Images.Media.DATE_MODIFIED, System.currentTimeMillis() / 1000);
Uri contentUri = resolver.insert(mediaCollection, mediaDetails);
write(contentUri, resolver, p, fileName); // Write the file content using resolver.openOutputStream(contentUri)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
mediaDetails.clear();
mediaDetails.put(MediaStore.Images.Media.IS_PENDING, 0);
resolver.update(contentUri, mediaDetails, null, null);
【问题讨论】:
您将需要 2 种不同的文件保存方式,具体取决于您运行的手机的 SDK。请检查此***.com/a/65141440/1797806 【参考方案1】:您找到解决方案了吗?我没有,所以我最终这样做了:
private void addImageToGalleryLegacy(@NonNull final String imagePath, @NonNull final String fileName) throws IOException
File fIn = new File(imagePath);
String outPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
File fOut = new File(outPath, fileName);
FileInputStream in = new FileInputStream(fIn);
FileOutputStream out = new FileOutputStream(fOut);
copy(in, out);
基本上(就像我们在 Q 之前一样)我们可以将图像直接复制到图库中。 在我的例子中,“imagePath”是“android/data/[package name]/files/Pictures”。
【讨论】:
是的,我最终使用了developer.android.com/training/data-storage/shared/…,您可以在其中授予对特定文件夹的访问权限,然后您可以随时对其进行写入。它更容易并且文件结尾被保留:) @hej2010 谢谢,我试试看:)以上是关于使用 Android 的 MediaStore(ContentResolver/范围存储)创建图像文件后文件扩展名和文件名错误的主要内容,如果未能解决你的问题,请参考以下文章
错误记录Android 低版本使用分区存储错误 ( 低版本存储不得使用 MediaStore )
如何使用 MediaStore 在 Android Q 中保存图像?
在 android 中使用 MediaStore.ACTION_IMAGE_CAPTURE 意图捕获图像
Android 文件管理分区存储 ( MediaStore 文件操作 )