2016-08-03 5 views
0

В настоящее время я подключаю свое устройство Android к другому устройству Bluetooth с использованием BLE.Android BLE startLeScan сканирование для уже подключенного устройства

Проблема в том, как сканировать для уже подключенных устройств?

В моем первом подходе я не вызывал stopLeScan до метода подключения.

У этого не было проблем с вышеупомянутой проблемой, но это вызвало разрыв ui (слишком короткий интервал обновления ui), а иногда время соединения было очень медленным.

После того, как я сделал свое приложение для вызова stopLeDevice перед подключением, все проблемы были разрешены, но возникла новая проблема. Новая проблема заключается в том, что я больше не могу видеть подключенное устройство на своем scanResult. Он отображает только отключенные устройства. Я все еще хочу контролировать мое подключенное устройство. Как я могу добиться этого?

ответ

0

Используйте этот класс для автоматического запуска новых устройств BLE.

BLEScanner Услуги

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(); 
     } 
    } 
} 

Теперь обратный вызов класса для проверки BLE устройства Connect или не

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()); 
     } 
    } 
}