Android 6.X.X USB设备和工作资料

时间:2018-08-06 11:49:10

标签: android android-6.0-marshmallow android-usb android-for-work

我正在尝试与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();
    }
}

0 个答案:

没有答案