MediaScanner повторно вставляет фотографию в галерею и сбрасывает ее ориентацию и другие поля - PullRequest
1 голос
/ 15 декабря 2011

Мое приложение создает фотографию, а затем вставляет ее в корзину галереи стоковой камеры.(Я хочу, чтобы фотографии сохранялись рядом с другими фотографиями, снятыми стандартной камерой)

Следующий код делает это:

ContentValues values = new ContentValues();
values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, taken_at);//msec
values.put(MediaStore.Images.ImageColumns.DATE_ADDED, taken_at/1000);//sec
values.put(MediaStore.Images.ImageColumns.DATE_MODIFIED, taken_at/1000);//sec
values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, fileName);
values.put(MediaStore.Images.ImageColumns.TITLE, fileName);
values.put(MediaStore.Images.ImageColumns.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.ImageColumns.ORIENTATION, orientation);// << ORIENTATION
values.put(MediaStore.Images.ImageColumns.DATA, dir+"/"+fileName);
uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
OutputStream os = getContentResolver().openOutputStream(uri);
// WRITE JPEG BINARY DATA

Когда я выбираю последние две фотографии (одну, сделанную стоковой камерой, вторую -моим приложением) из MediaStore.Images.Media.EXTERNAL_CONTENT_URI, я получаю следующее:

fields:
_id, bucket_id, date_added, date_modified, datetaken, _display_name, 
orientation, title

fields values of photo taken by stock camera:
4471, 856031460, 1323942742, 1323942742, 1323942742189, 2011-12-15 15.52.22.jpg,
90, 2011-12-15 15.52.22.jpg

values of photo taken by my app:
4470, 856031460, 1323942722, 1323942722, 1323942722545, 2011-12-15 15.52.02.jpg     
90, 2011-12-15 15.52.02.jpg

Пока все хорошо.Он отображается в галерее правильно.Проблема возникает, когда я перемонтирую SDCard и медиа-сканер заканчивает свою работу:

stock camera's photo after re-mounting sdcard
1241, 856031460, 1323942742, 1323942742, 1323942742189, 2011-12-15 15.52.22.jpg
90, 2011-12-15 15.52.22.jpg

my app's photo after re-mounting sdcard
1242, 856031460, 1323943033, 1323942722, 1323942722000, 2011-12-15 15.52.02.jpg
0, 2011-12-15 15.52.02 
// WTF? orientation defaulted, date_added and date_modified were updated

Похоже, эти фотографии повторно вставлены, НО СЕЙЧАС фотография моего приложения повторно вставляется со значениями полей по умолчанию (включая ориентацию)в то время как значения фотографий стандартной камеры не изменились (за исключением _id)!

Теперь фотографии моего приложения отображаются в галерее неправильно (повернуты, поскольку ориентация была сброшена), в то время как стандартные камеры в порядке.

Как медиа-сканер распознает связь между записью в медиа-базе данных и файлом, который он сканирует сейчас?Похоже, он не может этого сделать в моем случае, удаляет старую запись, «связанную с несуществующим файлом», и вставляет новую «никогда не вставленную ранее» запись.

Есть идеи, как это исправить?

PS: обе фотографии находятся в одном каталоге

1 Ответ

2 голосов
/ 30 марта 2012

MediaScanner сканирует файлы в каталогах, а в случае фотографий сканирует заголовок фотографии, содержащий теги EXIF, и извлекает из него теги ORIENTATION, DATE_TAKEN, DATE_MODIFIED.Если эти данные не совпадают с данными в базе данных, то данные базы данных заменяются.

Если вы столкнулись с этой проблемой, вам необходимо вручную обновить тег EXIENTATION exif с допустимым значением.

Также я должен упомянутьэтот exif-менеджер Android очень глючит, и вы можете использовать библиотеку org.apache.sanselan, которая прекрасно работает.

...