USB-устройство распознает как устройство хранения и находит путь

Как я могу обнаружить установленное устройство, такое как Pen-Drive, которое можно использовать для хранения? Как найти путь к подключенному устройству хранения, чтобы я мог читать файлы с него?

Я использовал следующий широковещательный приемник с разрешением на доступ к подключенному устройству:

private 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) {
                        // call method to set up device communication

                        Log.d(TAG, "onReceive: "+intent.getExtras().toString());
                        Log.d(TAG, "onReceive: "+intent.getData());
                        LinearLayout layoutUsbList = (LinearLayout)findViewById(R.id.layout_usb_list);
                        Button btn = new Button(MainActivity.this);
                        btn.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
                        layoutUsbList.addView(btn);
                        btn.setText(device.getDeviceId()+"\t"+device.getDeviceName());
                        Log.d(TAG, "onReceive: "+intent.getExtras().toString());
                        final String path = intent.getData().getPath();
                        Log.e(TAG, "onReceive: path of device received from intent: "+ path );
                        btn.setOnClickListener(new OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                File file = new File(path);
                                Toast.makeText(MainActivity.this, "file exists --> "+file.exists()+"", Toast.LENGTH_SHORT).show();
                                Toast.makeText(MainActivity.this, "file is directory --> "+file.isDirectory()+"", Toast.LENGTH_SHORT).show();
                                Log.d(TAG, "onClick: file is directory --> "+file.isDirectory()+"");
                                try{
                                    Toast.makeText(MainActivity.this, file.listFiles().length+"", Toast.LENGTH_LONG).show();
                                }catch(Exception e){
                                    Toast.makeText(MainActivity.this, "error while showing total items", Toast.LENGTH_SHORT).show();
                                }

                            }
                        });

                    }
                } else {
                    Log.d("ERROR", "permission denied for device " + device);
                }
            }
        }
    }
};

Файл манифеста:

<?xml version="1.0" encoding="utf-8"?>

<uses-feature android:name="android.hardware.usb.host"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:configChanges="keyboard|orientation"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>


        <intent-filter>
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/>
        </intent-filter>

        <meta-data
            android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
            android:resource="@xml/device_filter"/>

        <intent-filter>
            <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED"/>
        </intent-filter>


        <!---->
        <!---->
        <!---->
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_MOUNTED"/>
            <data android:scheme="file"/>
        </intent-filter>
    </activity>

</application>

1 ответ

Решение

В соответствии с этим PDF, ссылающимся на эту библиотеку. Каждое запоминающее устройство имеет как минимум один дескриптор интерфейса с кодом класса 08h, который обозначает класс запоминающего устройства. Класс запоминающего устройства не определен в дескрипторе устройства! Интерфейс USB имеет ровно два дескриптора конечной точки. Одна конечная точка IN для чтения с устройства и одна конечная точка OUT для записи на устройство 2. Чтение и запись в этом случае не обязательно означает чтение или запись на фактическом носителе, это будет описано позже. Есть два разных типа относительно класса запоминающего устройства. Существует механизм перевозки только навалочных грузов (BBB), который является наиболее распространенным. Все новые устройства соответствуют этому стандарту. Затем существует стандарт Control/Bulk/Interrupt (CBI), который больше не важен, потому что USB-IF рекомендует использовать подход BBB

UsbDevice распознается как устройство massStorage, если:

usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_MASS_STORAGE
                        || usbInterface.getInterfaceSubclass() == INTERFACE_SUBCLASS // int 6
                        || usbInterface.getInterfaceProtocol() == INTERFACE_PROTOCOL // int 80

а также

usbInterface.getEndpointCount() == 2

где одна из конечных точек должна удовлетворять следующим условиям:

endPoint direction == 0
endPoint type = UsbConstants.USB_ENDPOINT_XFER_BULK //int 2
Другие вопросы по тегам