Следите за изменениями во внешнем USB-накопителе для Honeycomb или более поздних версий Android

У меня есть цифровая зеркальная камера и Samsung Galaxy Tab под управлением Android Honeycomb. Цифровая зеркальная фотокамера, подключенная к планшету с помощью USB-кабеля -(через USB-комплект, обеспечивающий функции хоста на планшете ). Я хотел бы получать уведомления, когда пользователь делает снимок с помощью этой внешней камеры, чтобы загрузить это изображение на планшет или сделать с ним что-то еще, например, показать всплывающее уведомление, содержащее метаданные -, взятые из изображения.

Насколько я понимаю, все существующие инструменты (, такие как FileObserver, использующие базовый inotifyмеханизм, MediaContentProviderи т. д. ), позволяющие отслеживать изменения, требовать, чтобы конкретный файл или путь к файловой системе смотрели. Этого было достаточно, пока у нас не появилась поддержка протокола блочного уровня в 2.x и более ранних версиях Android -, когда вы подключали устройство, оно было смонтировано где-то в файловой системе устройства, и вы могли использовать эту точку монтирования в качестве точки наблюдения для эти инструменты.

Начиная с Honeycomb, Google изменил способ доступа к внешним USB-устройствам на Media Transfer Protocolс PTPв качестве его подмножества.Теперь, когда я подключаю внешнее USB-устройство к устройству Android, я не вижу для него точек монтирования (. Я использую adb shellи последующую команду mountдля их получения ). Кроме того, реализация MTPиспользует идентификаторы памяти, которые, по-видимому, действуют как более высокий уровень абстракции и представляют собой просто целочисленные значения. Я надеялся, что есть способ каким-то образом преобразовать эти идентификаторы хранилища в реальные пути/точку монтирования/что угодно, но, похоже, этого не произошло.

Размышляя об Android MediaScanner, который уже работает на моем устройстве, я предположил, что он может справиться с этой проблемой с помощью специального Intent, транслируемого при наличии изменений в медиафайлах, доступных с устройства, поэтому я начал искать уже существующие и подходит Intentsдля уведомления, но не повезло -Я нашел только ACTION_MEDIA_MOUNTEDи ACTION_MEDIA_REMOVED, которые транслируются только при подключении и отключении устройства соответственно. Это означает, что MediaScannerне заметит никаких изменений на устройстве, пока вы не перемонтируете его. (Я дважды проверил его с помощью стандартного приложения "Галерея" -он не видит новых изображений на камере, пока вы не отключите его и не отключите. затем снова подключите его к устройству Android ).

Пытаясь получить этот путь монтирования для внешней SD-карты, я использовал Environment.getExternalStorageDirectory()API-вызов, но он выдает эмулированный путь к SD-карте Galaxy. это /mnt/sdcard, а не камера. Так что у меня тоже не работает.

Мне удалось решить эту проблему, только запустив периодическое событие Timerс AsyncTaskв качестве TimerTask. Эта задача инициализирует USB-соединение, открывает устройство, просканируйте всю память устройства, получив только последнюю сделанную фотографию, а затем закройте дескриптор устройства и USB-соединение.

Это не похоже на лучший и эффективный способ сделать это, принимая во внимание, что он должен выполнять все эти действия каждый раз, что может быть довольно часто, скажем, каждые 5 или 10 секунд.Это определенно быстро разряжает батарею и производит ненужные системные операции ввода-вывода только для того, чтобы сделать последнюю сделанную фотографию и сравнить ее с предыдущей последней сделанной фотографией (, в 99% это будет то же самое изображение ), но я не нашел любое лучшее рабочее решение для этого. Гораздо лучше иметь механизм наблюдателя с уведомлениями на основе события -.

Итак, мой вопрос: существует ли более эффективный способ уведомления об изменениях во внешнем USB-накопителе для Honeycomb или более поздних версий Android, чем описанный выше?

20
задан Sunseeker 27 April 2012 в 07:27
поделиться