Я пишу Android-приложение для поиска и обнаружения IBeacons (это устройства BLE) и их ранжирование (в зависимости от значения RSSI). Я использую пример кода из https://developer.android.com/guide/topics/connectivity./bluetooth-le.html
Но этот код работает по-разному на моих устройствах Android (Samsung Galaxy S3 и LG G3).
На моем S3 обратный вызов «onLeScan» многократно увеличивается в цикле (около 5 в секунду) и каждый раз дает мне разные значения RSSI в зависимости от диапазона.
Но на моем LG G3 обратный вызов «onLeScan» возникает только один раз, когда я запускаю сканирование. поэтому, если я хочу получить новые значения RSSI, мне нужно перезапустить сканирование. И я думаю, что это не очень хорошо.
Я не знаю, то ли это что-то не так с драйвером LG G3, или я должен проверить некоторые настройки Android. Может ли кто-нибудь сказать мне что-нибудь об этом?
Вот мой код:
public class Main2Activity extends Activity implements BluetoothAdapter.LeScanCallback {
private BluetoothAdapter mBluetoothAdapter;
private boolean mScanning;
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
/**/
final BluetoothManager bluetoothManager =
(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
enableBtIntent.addFlags(enableBtIntent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(enableBtIntent);
}
scanLeDevice(true);
}
private void scanLeDevice(final boolean enable) {
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
mBluetoothAdapter.stopLeScan(Main2Activity.this);
}
}, 30000);
mScanning = true;
mBluetoothAdapter.startLeScan(Main2Activity.this);
} else {
mScanning = false;
mBluetoothAdapter.stopLeScan(Main2Activity.this);
}
}
ArrayList<String> datas = new ArrayList<String>();
@Override
public void onLeScan(BluetoothDevice arg0, int arg1, byte[] arg2) {
// TODO Auto-generated method stub
datas.add( arg2.toString() );
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}