У меня есть цифровая зеркальная камера и 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, чем описанный выше?