2016-08-03 19 views
0

現在、BLEを使用して自分のAndroidデバイスを別のBluetoothデバイスに接続しています。Android BLE startLeScanが既に接続されているデバイスをスキャンします

問題は、既に接続されているデバイスをスキャンすることです。

私の最初のアプローチでは、接続メソッドの前にstopLeScanを呼び出さなかった。

これは上記の問題に問題はありませんでしたが、uiが(短すぎるuiアップデートの間隔が短く)、接続時間が非常に遅くなることがありました。

接続前にstopLeDeviceを呼び出すようにアプリケーションを作成した後、すべてのissusesが解決されましたが、新しい問題が発生しました。新しい問題は、私が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(); 
     } 
    } 
} 

今すぐコールバッククラス

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()); 
     } 
    } 
} 
BLEデバイスの接続かをチェックします
関連する問題