蓝牙Android 4.0低耗开发兼容稳定性问题解决方式

Xtremeprog 10年前

可以在 www.IOTSDK.com  下载一个SDK,解决~!

android4.2以上蓝牙开发稳定兼容Samsung BLE SDK、Broadcom BLE SDK、Google BLE SDK 

1. 拷贝依赖库

将如下 jar 包拷贝到 libs 目录下:

  • blelibrary-0.1.jar
  • com.broadcom.bt.jar
  • commons-codec-1.8.jar
  • samsung_ble_sdk_200.jar

2. 添加权限

在 AndroidManifest.xml 中添加如下权限

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

3. 添加 Service

在 AndroidManifest.xml 中添加如 Service

<application>      ...      <service          android:name="com.xtremeprog.sdk.ble.BleService"          android:enabled="true" />      ...  </application>

4. 绑定 BLE service 并接收广播

在需要使用 BLE 通讯的 Activity 中(或者写在 Application 中),添加 bind service 的代码:

    protected BleService mService;      protected IBle mBle;        ...        private final BroadcastReceiver mBleReceiver = new BroadcastReceiver() {              @Override              public void onReceive(Context context, Intent intent) {                      Bundle extras = intent.getExtras();                      String action = intent.getAction();                        // 4. 处理 service 发过来的广播                        // 发现设备                      if (BleService.BLE_DEVICE_FOUND.equals(action)) {                              BluetoothDevice device = extras                                              .getParcelable(BleService.EXTRA_DEVICE);                              byte[] scanRecord = extras                                              .getByteArray(BleService.EXTRA_SCAN_RECORD);                              return;                      }                        // 设备已连接                      if (BleService.BLE_GATT_CONNECTED.equals(action)) {                              BluetoothDevice device = extras                                              .getParcelable(BleService.EXTRA_DEVICE);                              return;                      }                        // 发现设备服务                      if (BleService.BLE_SERVICE_DISCOVERED.equals(action)) {                              String address = extras                                              .getParcelable(BleService.EXTRA_ADDR);                              ArrayList<BleGattService> services = mBle.getServices(address);                              return;                      }                                           }      };        private final ServiceConnection mServiceConnection = new ServiceConnection() {              @Override              public void onServiceConnected(ComponentName className,                              IBinder rawBinder) {                      // 1. 绑定 service 成功,获取 mBle 对象                      mService = ((BleService.LocalBinder) rawBinder).getService();                      mBle = mService.getBle();              }                @Override              public void onServiceDisconnected(ComponentName classname) {                      mService = null;                      mBle = null;              }      };          @Override      public void onCreate(Bundle savedInstanceState) {                ...                // 0. 绑定 service              Intent bindIntent = new Intent(this, BleService.class);              bindService(bindIntent, mServiceConnection, Context.BIND_AUTO_CREATE);      }          @Override      protected void onResume() {              super.onResume();              // 3. 接受 service 发送的广播              registerReceiver(mBleReceiver, BleService.getIntentFilter());      }        @Override      protected void onPause() {              super.onPause();              // 5. 停止接收广播              unregisterReceiver(mBleReceiver);      }

5. BLE 操作

所有 BLE 的操作都通过调用 IBle 对象的 requestXXX 来实现,调用的结果在广播中返回,

    // 请求连接      mBle.requestConnect(address);        // 读取 characteristic      List<BleGattCharacteristic> gattCharacteristics = gattService.getCharacteristics();      mBle.requestReadCharacteristic(address, gattCharacteristics.get(1));        // 写入 characteristic      public static final UUID CHARACTER_COMMON_WRITE = UUID          .fromString("00008a81-0000-1000-8000-00805f9b34fb");      BleGattCharacteristic characteristic = deviceSerivce              .getCharacteristic(CHARACTER_COMMON_WRITE);       characteristic.setValue(new byte[] {0x00});      mBle.requestWriteCharacteristic(address, characteristic, "");        // 接收 notification      mBle.requestCharacteristicNotification(address, characteristic)