You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter插件集成依赖Activity的AILink BLE体重秤SDK方案咨询

看起来你碰到了Flutter插件集成依赖Activity的Android SDK的经典问题,我结合你的尝试和SDK特性,给你几个可行的解决方案:

问题背景复盘

你在Flutter应用中使用AILink蓝牙SDK(bluetoothlib_ts_1.0.3)实现体重秤功能,但SDK强制要求继承BaseBlueToothActivity并实现BroadcastDataParsing.OnBroadcastDataParsing接口才能接收体重数据。而Flutter插件的架构天然和Android Activity生命周期存在适配鸿沟,导致你尝试的几种方式都没拿到回调数据。

SDK核心组件回顾:

  • BaseBlueToothActivity:负责BLE服务绑定的核心基类
  • BroadcastDataParsing:解析广播体重数据的工具类
  • OnBroadcastDataParsing:体重数据回调的接口
  • ELinkBleServer:处理BLE操作的Android服务

你已尝试的方案&问题点

1. 反射调用方式

你用反射调用BaseBlueToothActivity的方法,但因为你的类并没有真正继承这个基类,无法触发SDK内部绑定的生命周期回调,所以体重数据的getWeightData永远不会被调用。

2. 直接绑定SDK服务

仅绑定ELinkBleServer缺少了BaseBlueToothActivity内部做的回调注册、生命周期同步等关键逻辑,所以能扫描但拿不到数据。

3. 带Activity感知的插件

你拿到了FlutterActivity的引用,但没有把它和SDK的Activity依赖逻辑结合起来,相当于只是拿到了上下文,没完成SDK要求的初始化流程。

可行的解决方案建议

方案1:让Flutter的MainActivity直接继承BaseBlueToothActivity

这是最贴合SDK设计的方案,也是原生示例的工作逻辑,能完美保证生命周期和回调的正常触发:

修改Flutter项目中的MainActivity.kt

class MainActivity : BaseBlueToothActivity(), BroadcastDataParsing.OnBroadcastDataParsing {
    private var weightChannel: MethodChannel? = null
    private lateinit var mBroadcastDataParsing: BroadcastDataParsing

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 初始化SDK的解析类
        mBroadcastDataParsing = BroadcastDataParsing(this)
        GeneratedPluginRegistrant.registerWith(this)
        
        // 创建MethodChannel,用于向Flutter端传递体重数据
        weightChannel = MethodChannel(flutterEngine?.dartExecutor?.binaryMessenger, "com.example/weight_scale")
    }

    override fun getWeightData(weightData: YourWeightDataType) {
        // 将原生体重数据通过MethodChannel发送给Flutter
        weightChannel?.invokeMethod("onWeightReceived", mapOf(
            "value" to weightData.weightValue,
            "unit" to weightData.unit,
            // 其他需要传递的字段
        ))
    }

    // 按需重写BaseBlueToothActivity的生命周期方法,确保SDK正常工作
    override fun onResume() {
        super.onResume()
        // 可以在这里重启扫描等操作
    }
}

然后在Flutter端监听这个MethodChannel就能实时拿到体重数据了,这种方式几乎没有适配成本,兼容性最好。

方案2:用代理类包装BaseBlueToothActivity的功能

如果不想修改MainActivity的继承关系,可以创建一个代理类,让它持有FlutterActivity的引用,同时代理SDK的生命周期和回调:

public class WeightScaleProxy extends BaseBlueToothActivity implements BroadcastDataParsing.OnBroadcastDataParsing {
    private WeakReference<Activity> flutterActivityRef;
    private MethodChannel methodChannel;

    public WeightScaleProxy(Activity flutterActivity, MethodChannel channel) {
        this.flutterActivityRef = new WeakReference<>(flutterActivity);
        this.methodChannel = channel;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBroadcastDataParsing = new BroadcastDataParsing(this);
    }

    @Override
    public void getWeightData(YourWeightDataType weightData) {
        // 转发数据到Flutter端
        methodChannel.invokeMethod("onWeightReceived", ...);
    }

    // 重写生命周期方法,转发给FlutterActivity,避免生命周期冲突
    @Override
    protected void onResume() {
        super.onResume();
        Activity activity = flutterActivityRef.get();
        if (activity != null) {
            activity.onResume();
        }
    }

    // 同理重写onPause、onDestroy等方法
}

然后在你的Flutter插件的onAttachedToActivity方法中初始化这个代理类,注意要用弱引用避免内存泄漏。

方案3:手动复刻BaseBlueToothActivity的内部逻辑

如果SDK的BaseBlueToothActivity只是做了服务绑定、回调注册等基础工作,你可以反编译查看它的内部实现,然后手动复刻这些逻辑:

  1. 手动绑定ELinkBleServer服务
  2. 拿到服务实例后,注册OnBroadcastDataParsing回调
  3. 手动处理BLE扫描的启动、停止逻辑
    这种方式灵活性最高,但需要你对SDK的内部逻辑有一定了解,适合不想依赖Activity继承的场景。

关键注意事项

  • 确保BroadcastDataParsing的实例是用Activity上下文初始化的,SDK可能依赖Activity的生命周期来管理回调注册
  • 注意内存泄漏问题,尤其是持有Activity引用时,尽量用弱引用
  • 确认AndroidManifest中配置了完整的BLE权限:BLUETOOTH_SCANBLUETOOTH_CONNECT,部分Android版本还需要位置权限

内容来源于stack exchange

火山引擎 最新活动