2015-08-10 3 views
1

Я пишу приложение, которое сканирует для устройств, затем отображает результаты в списке, чтобы пользователь мог нажать на устройство для подключения. У меня две проблемы. Один из них - когда я останавливаю Сканирование и подключаюсь к устройству, соединение не очень хорошо. (Светодиод на устройстве продолжает мигать, указывая на то, что соединение отключено и снова подключено.) Вторая проблема, которую я испытываю, заключается в том, что на некоторых телефонах я получить несколько результатов одного и того же устройства в списке. В методе OnLeScan() я помещаю устройства, которые я нахожу, в arraylist, который будет отображаться после завершения сканирования. Как я могу исправить свои проблемы. Я знаю, я использую старую Api для 21+Соединение Android BLE отключается

 private BluetoothAdapter.LeScanCallback mLeScanCallback = 
    new BluetoothAdapter.LeScanCallback() { 
     @Override 
     public void onLeScan(final BluetoothDevice device, final int rssi, 
         byte[] scanRecord) { 

     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 

       mdevices.put(dcount, device); 
       names.add(mdevices.get(dcount).getName().toString() + " " + "MAC:" + mdevices.get(dcount).getAddress() + " " + rssi); 
       dcount++; 


      } 
     }); 
    } 
}; 



///////////////////////////// 



    public void scanDevice(boolean enable) 
    { 

    if(enable) 
    { 

    mHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      if (Build.VERSION.SDK_INT < 21) { 
       btAdapter.stopLeScan(mLeScanCallback); 
      }else 
      { 
       /// if I comment this out the connection is good 
       btAdapter.stopLeScan(mLeScanCallback); 
      } 

     } 


    }, 1100); 


    if (Build.VERSION.SDK_INT < 21) { 
     btAdapter.startLeScan(mLeScanCallback); 
    } else { 

     btAdapter.startLeScan(mLeScanCallback); 
    } 


} 
else 
{ 
    btAdapter.stopLeScan(mLeScanCallback); 

} 

}

ответ

1

Для вашего первого вопроса, то трудно сказать, что является причиной разъединителей. Возможно, среда, в которой вы тестируете свою установку, имеет достаточное количество помех для периодических отключений. Это может быть одна возможность.

Чтобы избежать появления нескольких результатов одного и того же устройства в ListView, используйте HashSet, который отслеживает уже проверенные устройства. В обратном вызове onLeScan проверьте, существует ли устройство с данным аппаратным адресом. Если нет, добавьте его в свой ArrayList. Что-то вроде этого:

private HashSet<String> mLeDevicesScanned = new HashSet<String>(); 

@Override 
public synchronized void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { 

    if (mLeDevicesScanned.add(device.getAddress())) { 
      // Add this device to your ArrayList 
    } 

} 

Кроме того, убедитесь, что вы ясно ваши HashSet при обновлении сканирования.

+1

Когда вы используете 'Set', вы можете просто выполнить' if (set.add (вещь)) {..} ', проверка содержимого встроена в add. – zapl

+0

Правильно, я только что обновил свой ответ :) – androholic

Смежные вопросы