Неверное расширение файла и имя файла после создания файла изображения с помощью Android MediaStore (ContentResolver/ хранилище с ограниченным объемом)
Я использую MediaStore и ContentResolver API для сохранения файлов изображений (jpg/png/gif) с помощьюMediaStore.Images
. Это работает, но проблема в том, что все файлы сохраняются с расширением.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);
}
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);
}
В принципе (как мы находимся в pre Q) мы можем скопировать изображение прямо в галерею. "imagePath" - это "Android/data/[имя пакета]/files/Pictures" в моем случае.