2016-08-03 10 views
0

Ich bin derzeit mit meinem Android-Gerät mit einem anderen Bluetooth-Gerät mit BLE verbinden.Android BLE startLeScan Scan für bereits angeschlossene Gerät

Das Problem ist, wie scanne ich nach bereits verbundenen Geräten?

In meinem ersten Ansatz habe ich stopLeScan vor der Verbindungsmethode nicht aufgerufen.

Dies hatte kein Problem mit dem oben genannten Problem, aber es verursacht die UI zu brechen (zu kurze Intervall ui Update) und manchmal die Verbindungszeit sehr sehr langsam sein.

Nachdem ich meine App aufgerufen habe, stopLeDevice vor der Verbindung aufzurufen, wurde jeder Fehler behoben, aber ein neues Problem trat auf. Das neue Problem ist, dass ich das verbundene Gerät in meinem ScanResult nicht mehr sehen kann. Es zeigt nur die getrennten Geräte an. Ich möchte immer noch mein angeschlossenes Gerät überwachen. Wie kann ich das erreichen?

Antwort

0

Verwenden Sie diese Klasse, um automatisch zu neuen BLE-Geräten zu starten.

BLEScanner Dienstleistungen

public class BLEScanner extends Service { 
    private BluetoothAdapter mBluetoothAdapter; 
    private ArrayList<BluetoothDevice> mLeDevices; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     mLeDevices = new ArrayList<BluetoothDevice>(); 
     if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { 
      BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 
      mBluetoothAdapter = bluetoothManager.getAdapter(); 
     } 
     startLeScan(); 
     return Service.START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    private void startLeScan() { 
     scanLeDevice(true); 
    } 

    private void stopLeScan() { 
     scanLeDevice(false); 
    } 

    private void scanLeDevice(boolean enable) { 
     if (enable) { 
      mBluetoothAdapter.startLeScan(mLeScanCallback); 
     } else { 
      mBluetoothAdapter.stopLeScan(mLeScanCallback); 
     } 
    } 

    private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { 

     @Override 
     public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { 
      if (!mLeDevices.contains(device)) { 
       mLeDevices.add(device); 
       connectToDevice(device); 
      } 
     } 
    }; 

    private void connectToDevice(final BluetoothDevice device) { 
     if (device != null) { 
      Log.i("Tag", "Name: " + device.getAddress() + " Connecting"); 
      if (device.getName() != null) 
       device.connectGatt(this.getApplicationContext(), false, new BluetoothCallBack(this.getApplicationContext(), BLEScanner.this)); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     stopLeScan(); 
     mLeDevices.clear(); 
    } 

    public void removeDevice(BluetoothDevice mDevice) { 
     try { 
      if (mLeDevices != null && mLeDevices.size() > 0) 
       mLeDevices.remove(mDevice); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Jetzt Rückruf Klasse BLE Gerät verbinden oder nicht

public class BluetoothCallBack extends BluetoothGattCallback { 
    private BLEScanner mServiceObject; 

    public BluetoothCallBack(Context mContext, BLEScanner mServiceObject) { 
     this.mServiceObject = mServiceObject; 
    } 

    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     if (newState == BluetoothProfile.STATE_CONNECTED) { 
      Log.i("Tag", "CONNECTED DEVICE: " + gatt.getDevice().getAddress()); 
      gatt.discoverServices(); 
     } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { 
      Log.e("Tag", "DISCONNECTED DEVICE: " + gatt.getDevice().getAddress()); 
      gatt.disconnect(); 
      gatt.close(); 
      mServiceObject.removeDevice(gatt.getDevice()); 
     } 
    } 
} 
überprüfen