USBdevice recognizes the storage device and finds the path

How can I detect a mounted device, such as Pen-Drive, that can be used for storage? How can I find the path for a connected storage device so that I can read files from it?

I used the following broadcast receiver, which received permission to access the installed device:

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); } } } } }; 

Manifest file:

 <?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> 

+2
source share
1 answer

According to this pdf refrencing this library , Each storage device has at least one interface descriptor with class code 08h, which means a mass storage class. The mass storage class is not defined in the device. Descriptor! The USB interface has exactly two endpoint descriptors. One endpoint IN to read from the device and one endpoint OUT to write to device 2 . Reading and writing in this case does not necessarily mean reading or writing to real media, as described below. There are two different types of mass storage classes. There is only a mass of transport (BBB), which is the most common. All new devices follow this standard. Then there's the Control / Bulk / Interrupt (CBI) standard, which is no longer important because USB-IF recommends using the BBB approach

UsbDevice is recognized as a MassStorage If device:

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

and

 usbInterface.getEndpointCount() == 2 

where one of the endpoints must satisfy the following:

 endPoint direction == 0 endPoint type = UsbConstants.USB_ENDPOINT_XFER_BULK //int 2 
+1
source

Source: https://habr.com/ru/post/918767/


All Articles