Файловый ввод / вывод на подключенном USB-устройстве хранения данных в режиме USB Host (Android 3.1 или более поздней версии) - PullRequest
9 голосов
/ 10 сентября 2011

Хорошо, у меня есть планшет на Android 3.1 (Acer Iconia Tab, который, кстати, великолепен), который я могу использовать с Android USB API для подключения к USB-накопителю (простой USB-накопитель).

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

Это то, что у меня есть:

final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
            UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

            if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                if (device != null) {

                    // Got to a point where I should set up connection
                    // I'm setting up a very simple connection, just want some file transfer

                    UsbInterface intf = device.getInterface(0);
                    UsbEndpoint endpoint = intf.getEndpoint(0);
                    UsbDeviceConnection connection = UsbManager.openDevice(device);

                    if (connection.claimInterface(intf, true)) {
                        UtilsAndDialogs.print(getApplicationContext(), "Connected to device");

                        // Copy file to USB...

                    } else
                        UtilsAndDialogs.print(getApplicationContext(), "Could not connect!");
                }
            } else {
                UtilsAndDialogs.print(getApplicationContext(), "Permission denied");
                Log.d(UtilsAndDialogs.LOG_TAG, "Permission denied for device " + device);
            }
        }
    } 
};

Я прочитал документацию по Android Dev Usb Host , но она не очень понятна, и я нашел довольно хороший учебник Android Usb Host Tutorial - AdbTest , но он использует асинхронную связь.

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

Будем весьма благодарны за любые подсказки или указатели на более явную документацию.

Спасибо

Ответы [ 2 ]

4 голосов
/ 09 октября 2014

API-интерфейсы хоста USB для Android предоставляют только сырой доступ к USB. Чтобы получить доступ к файлам на запоминающем устройстве, ваше приложение должно самостоятельно реализовать USB Mass Storage Mode поверх USB Apis, а затем код файловой системы поверх этого.

Некоторые версии Android, настроенные производителем, будут монтировать запоминающее устройство USB с распознаваемой файловой системой на уровне операционной системы, но в настоящее время это не является частью стандартного Android. Также возможно, что если у вас есть рутированное устройство, вы можете использовать его, чтобы убедить ядро ​​смонтировать такую ​​файловую систему.

1 голос
/ 13 декабря 2011

Ваше соединение установлено, конечные точки - это в основном флаги на устройстве с информацией о передаче данных.

Для вашей флешки вам нужно сделать что-то вроде VV, чтобы выяснить, сколько у вас конечных точек,

UsbInterface intf = device.getInterface(0);
// checks for 2 endpoints
if (intf.getEndpointCount() != 2) {
Toast toast = Toast.makeText(context, "could not find endpoint", duration);
toast.show();
return;
    }
UsbEndpoint ep = intf.getEndpoint(0);
if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {

это позволит вам выяснить, является ли интересующая вас конечная точка объемной (документы USB-констант имеют другие типы) и можете ли вы отправлять данные на или с устройства на этой конечной точке (usb_dir_in длятест на в).Конечная точка, которую вы хотите, зависит от устройства, мой пример начинается с 0, ваш пример будет отличаться

Чтобы восстановить файл, вам нужно сделать что-то вроде

mConnection.bulkTransfer(mEndpointOut, bytes, 512, TIMEOUT);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...