2014-07-09 86 views

回答

18

據我所知,以啓動BLE配對過程有兩種方式:

1)從19 API和高達你可以通過調用mBluetoothDevice.createBond()開始配對。您無需連接遠程BLE設備即可開始配對過程。

2)當試圖做蓋特操作,讓我們例如該方法

mBluetoothGatt.readCharacteristic(characteristic) 

如果遠程BLE設備需要被結合做任何通信然後回調時

onCharacteristicRead( BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)

被稱爲其status參數值將等於GATT_INSUFFICIENT_AUTHENTICATIONGATT_INSUFFICIENT_ENCRYPTION,而不等於GATT_SUCCESS。如果發生這種情況,配對程序將自動開始。

這裏是要找出失敗時一旦onCharacteristicRead回調函數被調用

@Override 
public void onCharacteristicRead(
     BluetoothGatt gatt, 
     BluetoothGattCharacteristic characteristic, 
     int status) 
{ 

    if(BluetoothGatt.GATT_SUCCESS == status) 
    { 
     // characteristic was read successful 
    } 
    else if(BluetoothGatt.GATT_INSUFFICIENT_AUTHENTICATION == status || 
      BluetoothGatt.GATT_INSUFFICIENT_ENCRYPTION == status) 
    { 
     /* 
     * failed to complete the operation because of encryption issues, 
     * this means we need to bond with the device 
     */ 

     /* 
     * registering Bluetooth BroadcastReceiver to be notified 
     * for any bonding messages 
     */ 
     IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED); 
     mActivity.registerReceiver(mReceiver, filter); 
    } 
    else 
    { 
     // operation failed for some other reason 
    } 
} 

其他人提的是,該操作將自動啓動配對過程爲例: Android Bluetooth Low Energy Pairing

這是怎麼了接收器可以實現

private final BroadcastReceiver mReceiver = new BroadcastReceiver() 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     final String action = intent.getAction(); 

     if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) 
     { 
      final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR); 

      switch(state){ 
       case BluetoothDevice.BOND_BONDING: 
        // Bonding... 
        break; 

       case BluetoothDevice.BOND_BONDED: 
        // Bonded... 
        mActivity.unregisterReceiver(mReceiver); 
        break; 

       case BluetoothDevice.BOND_NONE: 
        // Not bonded... 
        break; 
      } 
     } 
    } 
}; 
+1

這個答案對我來說幫了大忙!我在使用Android 6.0+進行配對通知時遇到了問題,用戶甚至不會看到這些通知(較舊的Android做了很好的對話,這是我想要的所有情況)。有一件事我做得比你更不同,就是從開始就調用createBond()(即使在連接到設備之前),如果device.getBondState()== BluetoothDevice.BOND_NONE。這是因爲在閱讀特徵時我沒有得到「GATT_INSUFFICIENT_AUTHENTICATION」;操作系統會在它發送通知來配對設備時保留它。 – cclogg

+0

如果我的** onCharacteristicRead()**永遠不會被調用? –

+1

@IgorGanapolsky如果您100%確定您正在調用此方法mBluetoothGatt.readCharacteristic(特性),那麼將調用回調,除非可能存在與遠程設備有關的問題,無論它是代碼相關還是連接丟失(如果這是你應該得到一個不同的回調,但我不記得這個名字)。如果有人知道不同,請告訴我們。 – Kiki

相關問題