Android-USB-соединение установлено только во второй раз, когда приложение открывается - PullRequest
0 голосов
/ 07 сентября 2018

Для моего приложения мне нужно установить соединение с подключенным устройством Arduino, вот код:

public String openConnection(UsbManager manager, Context context) {

    // getting the driver with an external library...

    UsbSerialDriver driver = availableDrivers.get(0);

    PendingIntent pi = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0);
    manager.requestPermission(driver.getDevice(), pi);

    UsbDeviceConnection connection = manager.openDevice(driver.getDevice());

    if (connection == null) {
        return "Found a device, but cannot connect";
    }

    // otherwise, continue and do stuff
}

Проблема в том, что когда устройство подключено, при первом открытии приложения отображается предупреждение с запросом разрешения, но если я нажимаю «ОК», соединение становится пустым, поэтому оно возвращается рано. Тем не менее, во второй раз он не запрашивает никакого разрешения, но соединение открыто, и все работает нормально.

Почему это происходит?

Я знаю, что это не самый правильный подход к открытию USB-соединения, но у меня есть другие проблемы, которые не присущи этому вопросу, поэтому я довольно заинтересован, чтобы понять , почему так происходит, чем что я должен сделать вместо этого

Я тестирую это на Android 8.1.0

1 Ответ

0 голосов
/ 07 сентября 2018

Попробуйте предварительно запросить разрешение и запустите оставшуюся часть кода от Broadcast Receiver, который прослушивает предоставленное разрешение USB. Это показано в документации Google:

private static final String ACTION_USB_PERMISSION =
"com.android.example.USB_PERMISSION";
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
               }
            }
            else {
                Log.d(TAG, "permission denied for device " + device);
            }
        }
    }
}
};

Вот как вы регистрируете приемник вещания:

UsbManager mUsbManager = (UsbManager) 
getSystemService(Context.USB_SERVICE);
private static final String ACTION_USB_PERMISSION =
"com.android.example.USB_PERMISSION";
...
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new 
Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(mUsbReceiver, filter);

И затем вы начинаете все это с:

UsbDevice device;
...
mUsbManager.requestPermission(device, mPermissionIntent);

В способе, которым вы это делаете, устройство пытается подключиться к USB даже до того, как разрешение было предоставлено, и поэтому происходит сбой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...