Skip to content

Android SDK 概览

Mooting_android_demo 是原生 Android 蓝牙通信示例项目,封装了与 Mooting 智能眼镜的 BLE 通信协议。

项目信息

属性
项目路径app-dev/Mooting_android_demo
语言Kotlin / Java
编译 SDK34 (Android 14)
最低 SDK26 (Android 8.0)
Kotlin 版本1.9.0

模块架构

Mooting_android_demo/
├── app/                    # 主应用模块
│   └── 设备发现与绑定 UI

├── BluetoothModule/        # 核心蓝牙通信库
│   ├── core/              # 核心管理器
│   ├── bean/              # 数据类
│   ├── listener/          # 回调接口
│   ├── task/              # 任务管理
│   ├── message/           # 消息协议
│   ├── util/              # 工具类
│   └── libs/
│       └── MetaBluetoothSDK.aar

└── DebugModule/            # 调试工具模块
    ├── 命令测试
    ├── 音频采集
    ├── 固件升级
    └── 日志查看

核心功能

📡 设备发现

  • BLE 设备扫描
  • 设备类型识别
  • 信号强度显示

🔗 设备连接

  • GATT 连接管理
  • 自动重连机制
  • 连接状态监听

📨 命令通信

  • 绑定/解绑命令
  • 状态查询命令
  • 设置同步命令

🔧 调试工具

  • 命令发送测试
  • 音频数据采集
  • 日志查看导出

核心类说明

DeviceManager

设备管理单例,提供主要 API:

kotlin
// 初始化
DeviceManager.init(application)

// 获取实例
val manager = DeviceManager.getInstance()

// 开始扫描
manager.startDiscovery()

// 停止扫描
manager.stopDiscovery()

// 构建设备信息
manager.buildDevice(name, macBle, macBt, token, status)

// 连接设备
manager.connect(userId, token, imei, enableBtConnect)

// 发送命令
manager.sendCmd(cmdRequest)

// 断开连接
manager.disconnect()

MetaGlassDeviceGlobal

全局状态和监听器管理:

kotlin
// 添加扫描监听
MetaGlassDeviceGlobal.addGlassDeviceScanListener(listener)

// 添加命令响应监听
MetaGlassDeviceGlobal.addGlassDeviceCmdRspListener(listener)

// 添加连接状态监听
MetaGlassDeviceGlobal.addGlassDeviceConnectListener(listener)

设备状态枚举

kotlin
enum class MetaGlassState {
    DISCONNECTED,    // 未连接
    CONNECTING,      // 连接中
    CONNECTED,       // 已连接
    CONNECT_FAILED,  // 连接失败
    RECONNECTING     // 重连中
}

监听器接口

GlassDeviceScanListener

java
public interface GlassDeviceScanListener {
    void onGlassDeviceScanStarted();
    void onGlassDeviceScaned(MetaGlassDevice device);
    void onGlassDeviceScanFinished();
}

GlassDeviceCmdRspListener

java
public interface GlassDeviceCmdRspListener {
    void onGlassDeviceCmdRsp(String address, CmdRsp response);
}

设备类型

kotlin
enum class DeviceType(val code: String) {
    BACH("02150000"),     // Bach 系列
    PICASSO("02150002")   // Picasso 系列
}

权限要求

Android 12+ (API 31+)

xml
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

Android 11 及以下

xml
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

快速开始

1. 添加依赖

kotlin
// settings.gradle.kts
include(":BluetoothModule")

// app/build.gradle.kts
dependencies {
    implementation(project(":BluetoothModule"))
}

2. 初始化

kotlin
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        DeviceManager.init(this)
        ToastUtils.init(this)
    }
}

3. 扫描设备

kotlin
class MainActivity : AppCompatActivity(), GlassDeviceScanListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        MetaGlassDeviceGlobal.addGlassDeviceScanListener(this)
    }

    private fun startScan() {
        // 请求权限后
        DeviceManager.getInstance().startDiscovery()
    }

    override fun onGlassDeviceScanStarted() {
        // 清空设备列表
    }

    override fun onGlassDeviceScaned(device: MetaGlassDevice) {
        // 添加到列表
    }

    override fun onGlassDeviceScanFinished() {
        // 更新 UI
    }
}

4. 连接设备

kotlin
private fun connectDevice(device: MetaGlassDevice) {
    DeviceManager.getInstance().apply {
        buildDevice(
            device.name,
            device.macBle,
            device.macBt,
            ByteUtil.getDeviceToken(),
            0
        )

        connect(
            userId = 123,
            token = deviceToken,
            imei = IMEIUtil.getIMEI1(context),
            enableBtConnect = true
        )

        // 发送绑定命令
        if (isConnected()) {
            sendCmd(CmdReqBind().apply {
                timeout_period = 30000
            })
        }
    }
}

Gradle 配置

kotlin
// app/build.gradle.kts
android {
    namespace = "com.metabounds.demo"
    compileSdk = 34

    defaultConfig {
        minSdk = 26
        targetSdk = 34
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }

    buildFeatures {
        viewBinding = true
    }
}

下一步

Mooting 开发者文档