藍牙Android 4.0低耗開發兼容穩定性問題解決方式

可以在 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
  • </ul>

    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)
 本文由用戶 Xtremeprog 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!