flutter app如何主动上报事件?

我们开发的app需要配合一个usb插入安卓手机使用,就是usb插入手机,启动需要十几秒,启动好后能主动上报给界面,做相关逻辑处理,包括在使用过程中如果用户拔掉usb也能主动上报给界面做相关提示。
请问如何主动上报,界面这边如何接收?

阅读 2.8k
2 个回答

您可以在App中创建一个USB接收BroadcastReceiver,用于监听USB插拔事件。当USB插入/拔出手机时,系统会发送USB插拔的广播,您可以在BroadcastReceiver的onReceive方法中进行相关处理并发送自定义广播到界面。同时,您也可以在界面中创建一个BroadcastReceiver,用于接收自定义广播,从而响应相关提示信息。具体实现可以参考下面的伪代码:

创建USB接收BroadcastReceiver:

public class UsbReceiver extends BroadcastReceiver {
    private static final String ACTION_USB_PERMISSION = "com.example.USB_PERMISSION";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
            // USB插入处理逻辑
            // ...
            // 发送自定义广播到界面
            Intent i = new Intent();
            i.setAction("com.example.USB_ATTACHED");
            context.sendBroadcast(i);
        } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
            // USB拔出处理逻辑
            // ...
            // 发送自定义广播到界面
            Intent i = new Intent();
            i.setAction("com.example.USB_DETACHED");
            context.sendBroadcast(i);
        }
    }
}

在Manifest.xml中注册BroadcastReceiver,并申请USB权限:

<uses-feature android:name="android.hardware.usb.host" />
<uses-permission android:name="android.permission.USB_PERMISSION"/>
<application>
    <receiver android:name=".UsbReceiver">
        <intent-filter>
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
        </intent-filter>
    </receiver>
</application>

创建界面接收BroadcastReceiver,并实现相关逻辑:

public class MyActivity extends Activity {
    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if ("com.example.USB_ATTACHED".equals(action)) {
                // USB插入提示逻辑
                // ...
            } else if ("com.example.USB_DETACHED".equals(action)) {
                // USB拔出提示逻辑
                // ...
            }
        }
    };

    @Override
    protected void onResume() {
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.example.USB_ATTACHED");
        filter.addAction("com.example.USB_DETACHED");
        registerReceiver(mReceiver, filter);
        super.onResume();
    }

    @Override
    protected void onPause() {
        unregisterReceiver(mReceiver);
        super.onPause();
    }
}

同时,在App中启动时可以执行启动耗时的操作,例如异步进行初始化等,待初始化完成后再发送自定义广播到界面,通知界面开启相关功能。

  • 需要确定安卓手机工作于主(Host mode)模式,还是附属(accessory mode)模式,模式不同能够使用的API也不同
  • 如果手机工作于附属模式,我门需要连接的设备需要实现Android accessory communication protocol 这样才可以和安卓手机通信
  • 除了考虑当连接或者断开USB时候收到通知,还要考虑如何进行通信
  • 目前找到在Android平台有关于USB通信的API,iOS并没有提供,但Mac有

这是一个fluter pub上的的插件 quick_usb,同样没有支持iOS;

https://developer.android.com/guide/topics/connectivity/usb

https://github.com/mik3y/usb-serial-for-android/issues

https://cloud.tencent.com/developer/article/2041129

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题