获取Android版本时蓝牙设备全部断开,求原因与替代获取方法
问题分析与解决建议
可能的原因
- 权限/系统API冲突:获取Android版本的操作(不管是Flutter的
Platform类还是device_info_plus包)底层调用的系统接口,在部分定制Android系统上会触发系统服务临时重置,蓝牙服务受此影响导致断开。 - 系统资源抢占:读取系统版本信息时短暂占用核心系统资源,蓝牙进程的资源被挤占,进而引发连接中断。
- 定制ROM兼容性bug:部分厂商的定制系统存在逻辑漏洞,调用特定系统属性读取接口时会意外触发蓝牙服务重启。
替代的Android版本获取方法
方法1:直接读取系统属性文件(需注意权限)
通过读取/system/build.prop文件中的版本字段获取,Flutter代码示例:
import 'dart:io'; Future<String> getAndroidReleaseVersion() async { try { final buildProp = File('/system/build.prop'); if (await buildProp.exists()) { final content = await buildProp.readAsString(); final versionMatch = RegExp(r'ro.build.version.release=(.*)').firstMatch(content); return versionMatch?.group(1) ?? '未知版本'; } } catch (e) { print('读取版本出错:$e'); } return '未知版本'; }
注意:Android 10及以上版本可能因文件权限限制无法直接读取,需适配。
方法2:通过MethodChannel调用Android原生API
直接在Android原生层获取版本号,再通过MethodChannel传给Flutter,避免Flutter层API触发问题:
Android原生代码(Kotlin)
class MainActivity : FlutterActivity() { private val VERSION_CHANNEL = "your.app.package/version" override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, VERSION_CHANNEL).setMethodCallHandler { call, result -> if (call.method == "getAndroidVersion") { result.success(android.os.Build.VERSION.RELEASE) } else { result.notImplemented() } } } }
Flutter层调用代码
import 'package:flutter/services.dart'; Future<String> getAndroidNativeVersion() async { const versionChannel = MethodChannel('your.app.package/version'); try { return await versionChannel.invokeMethod('getAndroidVersion'); } on PlatformException catch (e) { return '获取失败:${e.message}'; } }
额外建议
如果上述方法仍有问题,可以尝试:
- 在应用启动初期获取版本号并缓存,避免在蓝牙连接状态下调用相关接口;
- 延迟获取版本号,比如在蓝牙连接成功后等待1-2秒再执行读取操作。
内容的提问来源于stack exchange,提问作者Pandruz
相关产品推荐
相关产品推荐

