Режим usb на андроид

Работа с устройствами USB в Android

Режим usb на андроид

В недавней статье на Geektimes в х возник вопрос о поддержке в ОС Android периферии, подключенной к шине USB. Действительно, большинство вендорского ПО, к примеру, для работы с принтерами и МФУ, поддерживает только подключение по сети.

Однако это не означает, что в самой ОС Android нет такой возможности — это означает лишь то, что большинство устройств не имеют полноценного USB хоста, и далеко не все имеют поддержку OTG. По сети же могут работать абсолютно все без исключения.

Большинство устройств на Android при наличии порта OTG поддерживают на уровне системы (ядра Linux или стандартных компонентов Android) следующие классы устройств:

  • Устройства ввода — клавиатуры, мыши, джойстики (HID)
  • Накопители (Mass Storage)

Несколько реже:

  • Сотовые модемы
  • Сетевые адаптеры
  • Вебкамеры

Хабы поддерживаются при наличии полноценных хост-портов, но не поддерживаются на портах OTG. Подробнее список устройств, поддерживаемых на уровне ядра Linux, можно получить в sysfs:

$ ls /sys/bus/usb/drivers

Если же модуль в принципе доступен в исходниках ядра Linux, но не включен в Android — не стоит рассчитывать на то, что его получится собрать и расставить на все целевые системы.

Однако, начиная с Android 3.1 (API 12), в системе содержатся средства, достаточные для поддержки на уровне приложения любой USB периферии. Данные средства описаны в разделе USB Host руководства по Android API. Здесь же я хочу привести примеры реальной работы с некоторыми видами устройств.

Права доступа

Как и для прочих действий, Android требует, чтобы приложение получило разрешение на доступ к USB периферии.

Существует 2 способа получить такое разрешение:

  • Задекларировать список устройств в AndroidManifest
  • Явно показать пользователю диалог “разрешить”

Поскольку для моих задач лишние вопросы к пользователю были нежелательны, я использовал первый способ. Итак, нам необходимо добавить в манифест следующее: … А в res/xml/device_filter.

xml вписать следующее: Отмечу, что хотя общепринято указывать VID:PID в 16-ричной системе счисления, здесь они должны быть указаны в десятичной. В документации заявляется, что возможно указание только класса, без VID и PID, но у меня это не стало работать.

Принтеры

На примере принтера я покажу, как непосредственно использовать API android.hardware.usb. На уровне передачи данных все принтеры поддерживают стандартый класс USB устройств: int UsbConstants.USB_CLASS_PRINTER = 7; Класс предельно простой. В рамках этого класса устройство должно поддерживать:

  • Обязательный bulk out endpoind для отправки данных на принтер
  • Опциональный bulk in endpoind для получения статуса принтера
  • 3 управляющих запроса

int GET_DEVICE_ID = 0;int GET_PORT_STATUS = 1;int SOFT_RESET = 2; Код, приведенный ниже, предоставляет функциональность, аналогичную устройству /dev/usb/lp в Linux. Далее нам нужен фильтр, преобразующий исходный документ в пакет данных, понятный конкретной модели принтера. Но это тема иной статьи. Как один из вариантов — можно собрать ghostscript с помощью NDK. Для работы с устройством нам в первую очередь нужно: 1. Найти устройство. В примере для простоты я ищу первый попавшийся: UsbDevice findDevice() { for (UsbDevice usbDevice: mUsbManager.getDeviceList().values()) { if (usbDevice.getDeviceClass() == UsbConstants.USB_CLASS_PRINTER) { return usbDevice; } else { UsbInterface usbInterface = findInterface(usbDevice); if (usbInterface != null) return usbDevice; } } return null;} UsbInterface findInterface(UsbDevice usbDevice) { for (int nIf = 0; nIf < usbDevice.getInterfaceCount(); nIf++) { UsbInterface usbInterface = usbDevice.getInterface(nIf); if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_PRINTER) { return usbInterface; } } return null;}UsbDevice mUsbDevice = findDevice();UsbInterface mUsbInterface = findInterface(mUsbDevice); 2. Получить endpoint’ы: for (int nEp = 0; nEp < mUsbInterface.getEndpointCount(); nEp++) { UsbEndpoint tmpEndpoint = mUsbInterface.getEndpoint(nEp); if (tmpEndpoint.getType() != UsbConstants.USB_ENDPOINT_XFER_BULK) continue; if ((mOutEndpoint == null) && (tmpEndpoint.getDirection() == UsbConstants.USB_DIR_OUT)) { mOutEndpoint = tmpEndpoint; } else if ((mInEndpoint == null) && (tmpEndpoint.getDirection() == UsbConstants.USB_DIR_IN)) { mInEndpoint = tmpEndpoint; }}if (mOutEndpoint == null) throw new IOException("No write endpoint: " + deviceName); 3. Непосредсвенно открыть устройство: mConnection = mUsbManager.openDevice(mUsbDevice);if (mConnection == null) throw new IOException("Can't open USB connection:" + deviceName);mConnection.claimInterface (mUsbInterface, true); 4. После этого мы можем читать и писать в устройство: public int read(final byte[] data) throws IOException { int size = Math.min(data.length, mInEndpoint.getMaxPacketSize()); return mConnection.bulkTransfer(mInEndpoint, data, size, getReadTimeout());} public int write(final byte[] data, final int length) throws IOException { int offset = 0; while (offset < length) { int size = Math.min(length - offset, mInEndpoint.getMaxPacketSize()); int bytesWritten = mConnection.bulkTransfer(mOutEndpoint, Arrays.copyOfRange(data, offset, offset + size), size, getWriteTimeout()); if (bytesWritten

Источник: https://habr.com/ru/post/277093/

Что означают USB-подключения Android: MTP, PTP и USB Mass Storage

Режим usb на андроид

Старые устройства Android поддерживают USB-накопители для передачи файлов с помощью компьютера. Современные устройства Android используют протоколы MTP или PTP — Вы можете выбрать тот, который
предпочитаете.

Чтобы выбрать протокол подключения USB, откройте приложение «Настройки», нажмите «Память», нажмите кнопку меню и нажмите «Подключение к компьютеру через USB». Вы также увидите протокол в уведомлении, который Ваше устройство использует, когда оно подключено к компьютеру через USB.

Почему современные устройства Android не поддерживают USB Mass Storage

Запоминающее устройство USB — также известное как «класс устройств USB mass storage», USB MSC или UMS — было способом, которым более ранние версии Android отображали свое хранилище на компьютере.

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

При отключении его от компьютера Вам нужно было нажать кнопку «Отключить USB-накопитель».

USB-накопитель — это стандартный протокол, используемый флэш-накопителями, внешними жесткими дисками, SD-картами и другими USB-накопителями. Диск полностью доступен для компьютера, как если бы он был внутренним.

Были проблемы такой работой. Какое бы устройство ни обращалось к хранилищу, ему нужен эксклюзивный доступ. Когда Вы подключили хранилище к компьютеру, оно было отключено от операционной системы Android, работающей на устройстве. Любые файлы или приложения, хранящиеся на SD-карте или USB-накопителе, были недоступны при подключении к компьютеру.

Системные файлы должны были где-то храниться, поэтому у устройства Android есть отдельные разделы /data для «системного хранилища» и /sdcard для «USB хранилища» на одном внутреннем устройстве хранения. Android устанавливал приложения и системные файлы в /data, а пользовательские данные были сохранены в разделе /sdcard.

Из-за этого жесткого разделения Вы могли получить слишком мало места для приложений и слишком много места для данных. Нельзя было изменить размер этих разделов без рутирования Вашего устройства — производитель выбрал соответствующее количество для каждого раздела на заводе.

Поскольку файловая система должна была быть доступна с устройства Windows, она должна была быть отформатирована с файловой системой FAT.

Мало того, что у Microsoft есть патенты на FAT, FAT также является более старой, более медленной файловой системой без современной системы разрешений.

Android теперь может использовать современную файловую систему ext4 для всех своих разделов, потому что они не должны быть доступны для чтения непосредственно Windows.

Подключение телефона или планшета Android к компьютеру в качестве стандартного USB-накопителя удобно, но есть слишком много недостатков. Поэтому современные устройства Android используют разные протоколы USB-подключения.

MTP расшифровывается как «Media Transfer Protocol». Когда Android использует этот протокол, он представляется компьютеру как «мультимедийное устройство».

Протокол передачи мультимедиа широко рекламировался как стандартизированный протокол для передачи аудиофайлов на цифровые музыкальные проигрыватели с использованием Windows Media Player и аналогичных приложений.

Он был разработан, чтобы позволить другим компаниям медиаплеера конкурировать с iPod Apple и iTunes.

Этот протокол работает совсем не так, как USB-накопитель. MTP работает не на уровне файлов, а на файловой системе Вашего Android-устройства. Ваше устройство Android не предоставляет доступ ко всему устройству хранения Windows.

Вместо этого, когда Вы подключаете устройство к компьютеру, компьютер запрашивает устройство, а устройство отвечает списком файлов и каталогов, которые оно предлагает. Компьютер может загрузить файл — он запросит файл с устройства, и устройство отправит файл через соединение.

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

Android может выбирать файлы, которые он Вам предоставляет, и скрывать системные файлы, чтобы Вы не могли их видеть или изменять. Если Вы попытаетесь удалить или отредактировать файл, который нельзя изменить, устройство отклонит запрос, и Вы увидите сообщение об ошибке.

Вашему компьютеру не требуется эксклюзивный доступ к устройству хранения, поэтому нет необходимости подключать хранилище, отключать его или иметь отдельные разделы для разных типов данных. Android также может использовать ext4 или любую другую файловую систему по своему усмотрению — Windows не должна понимать файловую систему, только Android.

На практике MTP очень похож на USB-накопитель. Например, устройство MTP отображается в проводнике Windows, чтобы Вы могли просматривать и передавать файлы. Linux также поддерживает устройства MTP через libmtp, который обычно входит в состав популярных дистрибутивов Linux. Устройства MTP также должны появиться в файловом менеджере Вашего ПК с Linux.

Apple Mac OS X — это отдельное решение — оно вообще не включает поддержку MTP. Apple iPod, iPhone и iPad используют собственный проприетарный протокол синхронизации вместе с iTunes, так почему же они хотят поддерживать конкурирующий протокол?

Google предоставляет приложение Android File Transfer для Mac OS X. Это приложение является простым MTP-клиентом, поэтому оно будет работать для передачи файлов туда и обратно на Mac. Google не предоставляет это приложение для других операционных систем, поскольку они включают поддержку MTP.

PTP — цифровая камера

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

MTP фактически основан на PTP, но добавляет больше функций или «расширений». PTP работает аналогично MTP и обычно используется цифровыми камерами. Любая программа, которая поддерживает захват фотографий с цифровой камеры, будет поддерживать захват фотографий с телефона Android при выборе режима PTP. PTP был разработан, чтобы быть стандартным протоколом для связи с цифровыми камерами.

В этом режиме Ваше устройство Android будет работать с приложениями для цифровых камер, которые поддерживают PTP, но не MTP. Apple Mac OS X поддерживает PTP, поэтому Вы можете использовать режим PTP для передачи фотографий с устройства Android на Mac через USB-соединение без какого-либо специального программного обеспечения.

Если у Вас старое устройство Android, Вы вынуждены использовать USB-накопитель. На современном устройстве Android у Вас есть выбор между MTP и PTP — Вы должны использовать MTP, если у Вас нет программного обеспечения, которое поддерживает только PTP.

Если на Вашем устройстве установлена съемная SD-карта, Вы можете извлечь SD-карту и вставить ее в слот для SD-карты Вашего компьютера. SD-карта будет доступна для Вашего компьютера в качестве устройства хранения, так что Вы сможете получить доступ ко всем файлам на ней, запустить программное обеспечение для восстановления файлов и делать все, что Вы не можете сделать с MTP.

Источник: https://zen.yandex.ru/media/android_example/chto-oznachaiut-usbpodkliucheniia-android-mtp-ptp-i-usb-mass-storage-5ecfbadd060a786229e6db4e

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.