Android: проблема с медиа-сканером не работает - PullRequest
2 голосов
/ 06 марта 2011

У меня есть приложение, с помощью которого пользователь может рисовать, а затем «экспортировать» этот чертеж в виде файла .png во внешнее хранилище, если оно есть.Генерация PNG, копирование файла на внешнее все работает как чудо, но возникает довольно уникальная проблема;после экспорта, если пользователь переходит к изображению через «Мои файлы» (в данном случае Samsung Tab с 2.2), он может видеть файл .png, но при открытии его экран черный в течение 10 секунд ... затемони видят изображение. Кроме того, изображения также не отображаются в приложении «Галерея» пользователя.

Теперь, если пользователь подключает устройство к компьютеру через USB или перезагружает устройство, он можетДоступ к изображениям без проблем из Моих файлов, и они появляются в «Галерее» с этого момента, но, опять же, все вновь экспортируемые файлы испытывают те же проблемы, пока не снова включат / выключат устройство.

Мое мышление былочто это должно быть связано с Media Scanner (по крайней мере, в случае с проблемой «Галерея», это, безусловно, так).

Итак, поскольку я нацеливаюсь на Api 8+, я пытаюсь использоватьстатический MediaScannerConnection.scanFile() метод для повторного сканирования ОС и добавления моих изображений в Галерею и т. д. Также надеемся, что это решает проблему странной задержки при открытии изображений.Вот мой код:

MediaScannerConnection.scanFile(
  context, 
  new String[] { "/mnt/sdcard/MyApp" }, 
  null, 
  null
);

LogCat выдает мне следующие записи при экспорте изображения и, таким образом, запускает приведенный выше вызов:

DEBUG/MediaScannerService(2567): IMediaScannerService.scanFile: /mnt/sdcard/MyApp mimeType: null
DEBUG/MediaScannerService(2567): onStartCommand : intent - Intent { cmp=com.android.providers.media/.MediaScannerService (has extras) }
DEBUG/MediaScannerService(2567): onStartCommand : flags [0], startId [1]
DEBUG/MediaScannerService(2567): ServiceHandler:handleMessage volume[null], filePath[/mnt/sdcard/MyApp]
DEBUG/MediaProvider(2567): getSdSerial() sd state = removed
INFO/Database(2567): sqlite returned: error code = 17, msg = prepared statement aborts at 43: [SELECT DISTINCT sd_serial FROM images WHERE sd_serial LIKE 'external_0x%']
ERROR/MediaProvider(2567): removeMediaDBData called
DEBUG/MediaScanner(2567): prescan enter: path - /mnt/sdcard/MyApp
DEBUG/MediaScanner(2567): prescan return

Итак, похоже, что MediaScannerполучить правильное местоположение, но не может найти SD-карту, которая является правильной, и не удается.Samsung Tab имеет встроенное внешнее хранилище без SD, доступ к которому Android предоставляет через Environment.getExternalStorageDirectory().Как мне сказать сканировать хранилище без SD?

Есть идеи, как поступить?

Пол

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

Нашел решение здесь, которое включает в себя отправку широковещательного запроса на медиа-сканер через Intent:

Как обновить медиа базу данных Android

Никогда не фигурировалрешить проблему с MediaScannerConnection.scanFile.

0 голосов
/ 13 февраля 2013

Всякий раз, когда вы добавляете файл, сообщите MediaStore Content Provider об этом, используя

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(imageAddedOrDeleted)));

Основное преимущество: работа с любым типом пантомимы, поддерживаемым MediaStore

Для удаление : просто используйте getContentResolver (). Delete (uri, null, null)

...