Android 8.0及以上使用serial_port_flutter无法获取串口设备列表问题
问题根因
Android 8.0(API 26)及以上版本收紧了第三方应用对/proc文件系统的访问权限,/proc/tty/drivers属于系统敏感路径,普通应用无读取权限。serial_port_flutter插件原有逻辑是通过读取该路径枚举串口设备,因此在高版本系统上会触发如下报错:
java.io.FileNotFoundException: /proc/tty/drivers (Permission denied)
这也是该示例在低版本设备运行正常、高版本无法获取设备列表的核心原因。
适配方案
可根据你的应用场景选择对应方案:
- 方案一:改造插件枚举逻辑,使用官方UsbManager API实现
放弃读取/proc路径的原有实现,改用Android官方提供的USB设备管理接口枚举串口设备,操作步骤如下:- 在
android/app/src/main/AndroidManifest.xml中添加USB主机权限声明:
<uses-feature android:name="android.hardware.usb.host" /> <uses-permission android:name="android.permission.USB_PERMISSION" />- 修改插件Android层的设备枚举代码,调用
UsbManager.getDeviceList()获取所有已连接的USB设备,过滤符合串口设备VID/PID规则的设备后,通过UsbDeviceConnection打开设备即可获取串口实例。
- 在
- 方案二:定制系统场景特殊适配
如果你的应用仅运行在可获取系统签名的定制设备上,可在AndroidManifest.xml的manifest节点添加android:sharedUserId="android.uid.system"属性,使用系统签名打包应用后即可获得/proc路径的访问权限,原有逻辑无需修改即可正常运行。 - 方案三:更换适配高版本的串口插件
不想自行改造插件的话,可以替换使用usb_serial等基于UsbManager实现的Flutter串口插件,这类插件原生适配了Android 8.0及以上版本的权限限制,无需额外修改即可正常获取串口设备列表。
内容的提问来源于stack exchange,提问作者José Romero
相关产品推荐
相关产品推荐

