usb-serial-for-android icon indicating copy to clipboard operation
usb-serial-for-android copied to clipboard

Permission denied after update to Android 12

Open topiux opened this issue 1 year ago • 1 comments

I was successfully using this library with Android 10 on Unity 2021.3.4f1. An update by Meta to Android 12L broke several things including USB communications. This is what I get via logcat:

04-30 18:30:16.748  4824  4849 D UnityUsbSerial: connectToDevice: Start
04-30 18:30:16.750  4824  4849 D UnityUsbSerial: connectToDevice: Drivers found
04-30 18:30:16.752  1110  1123 W Bundle  : Key android.hardware.usb.action.USB_DEVICE_ATTACHED expected Integer but value was a java.lang.String.  The default value 0 was returned.
04-30 18:30:16.752  1110  1123 W Bundle  : 	at com.android.server.usb.UsbUserSettingsManager.canBeDefault(UsbUserSettingsManager.java:105)
04-30 18:30:16.752  1110  1123 W Bundle  : 	at com.android.server.usb.UsbUserPermissionManager.requestPermission(UsbUserPermissionManager.java:744)
04-30 18:30:16.752  1110  1123 W Bundle  : 	at com.android.server.usb.UsbService.requestDevicePermission(UsbService.java:521)
04-30 18:30:16.752  1110  1123 W Bundle  : 	at android.hardware.usb.IUsbManager$Stub.onTransact(IUsbManager.java:703)
04-30 18:30:16.754  1110  1123 I ActivityTaskManager: START u0 {flg=0x10000000 cmp=com.oculus.os.vrusb/.UsbPermissionActivity (has extras)} from uid 1000
04-30 19:10:02.902 11262 11262 D UnityUsbSerial: permission denied for device UsbDevice[mName=/dev/bus/usb/001/002,mVendorId=4292,mProductId=60000,mClass=0,mSubclass=0,mProtocol=0,mManufacturerName=Silicon Labs,mProductName=CP2102 USB to UART Bridge Controller,mVersion=1.00,mSerialNumberReader=android.hardware.usb.IUsbSerialReader$Stub$Proxy@8db262, mHasAudioPlayback=false, mHasAudioCapture=false, mHasMidi=false, mHasVideoCapture=false, mHasVideoPlayback=false, mConfigurations=[

This is my code for handling USB permission request:

public String connectToDevice() {
        Log.d(TAG, "connectToDevice: Start");

        UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
        List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(usbManager);

        if (availableDrivers.isEmpty()) {
            Log.d(TAG, "connectToDevice: No available drivers");
            return "No available drivers";
        } else {
            Log.d(TAG, "connectToDevice: Drivers found");
        }

        // Use the first available driver.
        driver = availableDrivers.get(0);

        if (!usbManager.hasPermission(driver.getDevice())) {
            PendingIntent permissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0);
            usbManager.requestPermission(driver.getDevice(), permissionIntent);
            return "Requesting permission";
        } else {
            // ...

            return "Connected to the device";
        }
    }
private final BroadcastReceiver usbReceiver = 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
                            UsbDeviceConnection connection = usbManager.openDevice(device);

                            if (connection == null) {
                                Log.d(TAG, "connectToDevice: Connection is null");
                            } else {
                                Log.d(TAG, "connectToDevice: Connection established");
                            }

                            usbSerialPort = driver.getPorts().get(0);
                            try {
                                usbSerialPort.open(connection);
                                usbSerialPort.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
                                Log.d(TAG, "connectToDevice: Port opened successfully");
                            } catch (IOException e) {
                                Log.e(TAG, "connectToDevice: Error opening port", e);
                            } finally {
                                Log.d(TAG, "connectToDevice: End");
                            }
                        }
                    } else {
                        Log.d(TAG, "permission denied for device " + device);
                    }
                }
            }
        }
    };

topiux avatar Apr 30 '23 23:04 topiux