Android: Получите UsbDevice от намерения

Я возился с USB-хостом, и следуя рекомендациям на сайте разработчиков Android, мне удалось создать Hello World, который запускается после подключения определенного USB-устройства. Однако, когда я пытаюсь и … Получить UsbDevice, который представляет подключенное устройство из намерения «он возвращает null:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(); UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); // device is always null if (device == null){Log.i(TAG,"Null device");} 

Вот мой манифест:

 <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" /> </activity> </application> 

И мой xml / device_filter.xml (я знаю, что это правильный VID и PID, потому что у меня есть аналогичное приложение, работающее с использованием метода перечисления, описанного на сайте разработчиков Android ):

 <resources> <usb-device vendor-id="1234" product-id="1234"/> </resources> 

Когда ваше приложение (повторно) запускается из-за события подключения USB-устройства, тогда устройство передается на намерение, когда onResume . Вы можете воспользоваться getParcelableExtra методом getParcelableExtra . Например:

 @Override protected void onResume() { super.onResume(); Intent intent = getIntent(); if (intent != null) { Log.d("onResume", "intent: " + intent.toString()); if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) { UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (usbDevice != null) { Log.d("onResume", "USB device attached: name: " + usbDevice.getDeviceName()); 

Я нашел обходное решение (или предполагаемое использование?) Благодаря Тейлору Александру . В принципе, как я понимаю, это то, что запуск намерения, открывающего приложение, открывает приложение . После этого вам нужно искать и получать доступ к устройствам USB в соответствии с разделом Enumerating Devices на странице Android Developers в методе onResume.

 @Override public void onResume() { super.onResume(); UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); while(deviceIterator.hasNext()){ UsbDevice device = deviceIterator.next(); // Your code here! } в @Override public void onResume() { super.onResume(); UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); while(deviceIterator.hasNext()){ UsbDevice device = deviceIterator.next(); // Your code here! } 

Я не уверен, что это правильный способ сделать это, но, похоже, он работает. Если у кого есть какие-то дальнейшие предложения, я был бы рад послушать.