我正在尝试与Android 6.0中工作资料中的USB大容量存储设备进行通信。
我整理了一些示例代码,并使用TestDPC提供的示例环境配置了工作资料。如果我在Android 8.0上运行代码,那么在工作资料外和工作资料内代码似乎都可以正常工作。
但是,在Android 6.0.1中,USB权限对话框从不出现,并且我无法访问USB设备。 UsbManager.hasPermission(UsbDevice设备)返回true,但是当使用相同的UsbDevice对象打开连接时,它返回null。你们在这些Android版本的工作资料中使用USB api时发现任何错误吗?
这是我的(快速且肮脏的)示例代码:
public void requestUsbPermissionForConnectedDevices(View view) {
try {
Object service = getApplicationContext().getSystemService(Context.USB_SERVICE);
if (!(service instanceof UsbManager)) {
vStatusView.setText("No se pudo obtener el servicio de USB!");
return;
}
UsbManager usbManager = (UsbManager) service;
HashMap<String, UsbDevice> connectedDevices = usbManager.getDeviceList();
if (connectedDevices.isEmpty()) {
vStatusView.setText("No se detectó ningún USB conectado");
return;
}
vUsbCount.setText(String.valueOf(connectedDevices.size()));
for (UsbDevice device : connectedDevices.values()) {
Toast.makeText(getApplicationContext(), "Solicitando permiso para el dispositivo " + device.getDeviceName(), Toast.LENGTH_LONG).show();
Intent intent = new Intent();
intent.setClass(getApplicationContext(), UsbBroadcastReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 1000, intent, PendingIntent.FLAG_CANCEL_CURRENT);
usbManager.requestPermission(device, pi);
}
} catch (Exception ex) {
ex.printStackTrace();
Toast.makeText(getApplicationContext(), "ex: " + ex.getMessage(), Toast.LENGTH_LONG).show();
}
}
我的BroadcastReceiver,openConnection在工作资料中的Android 6.0.1上返回null:
@Override
public void onReceive(Context context, Intent intent) {
UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
boolean bGranted = intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false);
if (usbDevice == null) {
Toast.makeText(context.getApplicationContext(), "Intent de permisos recibido, pero no se recibió objeto UsbDevice", Toast.LENGTH_LONG).show();
return;
} else {
Toast.makeText(context.getApplicationContext(), "Intent de permisos recibido, permiso concedido: " + bGranted, Toast.LENGTH_LONG).show();
}
if (!bGranted) {
return;
}
Object service = context.getApplicationContext().getSystemService(Context.USB_SERVICE);
if (!(service instanceof UsbManager)) {
return;
}
UsbManager usbManager = (UsbManager) service;
UsbDeviceConnection deviceConnection = usbManager.openDevice(usbDevice);
if (deviceConnection == null) {
Toast.makeText(context.getApplicationContext(), "Se concedió el permiso, pero no se pudo abrir el dispositivo", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context.getApplicationContext(), "Se concedió el permiso y se ha abierto correctamente el dispositivo", Toast.LENGTH_LONG).show();
}
}