Не удалось получить обратный звонок от USB при использовании широковещательной рассылки - PullRequest
0 голосов
/ 07 октября 2019

Я использую библиотеку от GitHub для последовательной связи с моим USB-устройством. https://github.com/felHR85/SerialPortExample

Мое требование - читать данные с USB, когда он подключен к устройству Android. Поэтому я создал трансляцию для вызова операции readUsb (). Но проблема в том, что UsbSerialInterface.UsbReadCallback не возвращает никакого значения до тех пор, пока я не удалю USB с устройства Android. Но если я вызываю операцию readUsb () по нажатию кнопки, она прекрасно работает.

Созданы две разные трансляции, которые пытались вызвать readUsb (), когда служба USB возвращает USB, готовый к обмену данными.

Основная активность

/*
 * Notifications from UsbService will be received here.
 */
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
            if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action) || UsbManager.ACTION_USB_ACCESSORY_ATTACHED.equals(action)) {
                readUsb();
            } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action) || UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                if (device != null) {

                }
            }
          }
    }
};

/*
 * This handler will be passed to UsbService. Data received from the serial port is displayed through this handler
 */
private static class MyHandler extends Handler {
    private final WeakReference<MainActivity> mActivity;

    public MyHandler(MainActivity activity) {
        mActivity = new WeakReference<>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
        mActivity.get().display.append("Handle:");
        switch (msg.what) {
            case UsbService.MESSAGE_FROM_SERIAL_PORT:
                // Do operations with data over here.
                break;
        }
    }
}

Я хочу иметь возможность вызвать usbRead на подключенном USB и получить ответ USB с необходимостью отсоединить USB.

1 Ответ

0 голосов
/ 24 октября 2019

Добавьте этот код в Manifest

 <receiver
        android:name=".MainActivity$BootUpReceiver"
        android:enabled="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>


    </receiver>

Затем запустите приемник вещания в MainActivity

  protected void onDestroy() {
        super.onDestroy();

        unregisterReceiver(bootupreceiver);
    }


    public class BootUpReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Log.e("USB", "Decive Connected -> " + action);

            if (action.equalsIgnoreCase(ACTION_USB_ATTACHED)) {

                UsbDevice device = (UsbDevice) intent
                        .getParcelableExtra(UsbManager.EXTRA_DEVICE);
                if (device != null) {

                    tv_otg.setText("External OTG storage device connected !");
                    Log.e("true", "true");

                }
            } else if (action.equalsIgnoreCase(ACTION_USB_DETACHED)) {

                tv_otg.setText("External OTG storage device disconnected !");
                Log.e("false", "false");
            }
        }
    }

Также добавьте в oncreate () для целей регистрации. Необходимо отменить регистрацию в методе onDestroy ().

bootupreceiver = new BootUpReceiver();
        IntentFilter filter = new IntentFilter(ACTION_USB_ATTACHED);
        filter.addAction(ACTION_USB_DETACHED);
        filter.setPriority(100);
        registerReceiver(bootupreceiver, filter);
...