我正在使用MediaStore和ContentResolver API使用MediaStore.Images保存图像文件(jpg/png/gif)。它可以工作,但问题是所有文件都以.jpg扩展名保存,并且文件名始终是“以毫秒为单位的当前时间.jpg”。
这是我在ContentValue中添加的示例:
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);
}
你找到答案了吗?我没有,所以我最终做了这个:
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);
}
基本上(正如我们在pre Q中一样),我们可以将图像直接复制到图库中。在我的例子中,“imagePath”是“Android/data/[包名]/文件/图片”。
我正在尝试使用来保存图像,但它总是以这个名称保存文件1637955326427.jpg并且文件的大小0 B。 <代码>列表。获取(0)。getDocFile()返回一个文档文件,我也在API 28上测试了这个,谢谢 请注意,此图像已存在于外部存储器中,只需复制即可。 编辑:我删除此代码是重复的。我真的很抱歉。文件工作正常,但盗用了错误的名称。
我需要一些非常简单的东西-我的应用程序录制了一个mp4文件,我想将其插入MediaStore到用户的视频收藏中。这是我的代码,包括处理新范围存储的推荐方法: 但是,在这个函数调用名称为变成了类似的东西,所以名称和扩展名都不同(我的设备是Android 9)。已弃用。我该如何解决这个问题?
问题内容: 设法将我的文件存储在一个文件夹中,但是没有文件扩展名。 有谁知道我将如何存储带有文件扩展名的文件? 问题答案: 从文档中:“ Multer不会为您添加任何文件扩展名,您的函数应返回带有文件扩展名的文件名。” 添加扩展名的方法如下: 我建议使用该属性来确定扩展名。例如: 更多信息:https://github.com/expressjs/multer
我正在创建一个Zend Framework应用程序,用户可以在其中上载配置文件图像。可接受的文件类型为png、jpg和gif。图像最终被存储为用户id和文件扩展名。 我想知道的是,假设用户上传png或gif文件,将文件扩展名更改为jpg是否安全? 这样,所有的配置文件图像都将具有相同的文件扩展名,我只是不确定这样更改文件类型是否是一个好主意。
问题内容: 我想更改特定文件夹中文件的扩展名。我在论坛上阅读了有关此主题的信息。使用“确实”的想法,我编写了以下代码,我希望它可以工作,但不能。我很感谢您为我的失误提供任何指导。 问题答案: 在对源文件是不必要的,因为只需要在源和目标路径来完成这项工作。而且,始终返回,因此调用其返回值没有任何意义。 我简单地删除了两个。检查是否适合您。
问题内容: 我有这个PHP代码: 如果我有一个名为的文件,则此函数返回。 我想做相反的事情,我希望函数不带扩展名就返回。 该文件只是变量中的字符串。 问题答案: 不需要所有这些。签出pathinfo() ,它为您提供了路径的所有组件。 手册中的示例: 代码输出: 或者,您只能获得某些部分,例如: