Android BLE Beacon扫描不同的手机型号

时间:2014-10-27 09:24:45

标签: android bluetooth-lowenergy ibeacon samsung-mobile lg

我正在编写Android应用程序来查找和检测IBeacons(这些是BLE设备)并对它们进行测距(取决于RSSI值) 我使用https://developer.android.com/guide/topics/connectivity/bluetooth-le.html

中的示例代码

但是这个代码在我的Android设备(三星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;
}

2 个答案:

答案 0 :(得分:2)

不幸的是,您需要停止并重新开始扫描才能获得额外的回调。这正是它在Android Beacon Library中实现的方式,stops scanning every 1.1 seconds and then immediately restarts.这使得在操作系统不为每个广告进行回调的情况下,每个周期可以获得一次回调。

目前尚不清楚设备和操作系统版本之间的确切差异。在Android 4.3的Nexus 4上,可连接的BLE广告与不可连接的BLE广告的扫描行为不同。可连接广告在每个扫描周期仅引起一个广告回调,而不可连接的广告在每个扫描周期中接收多个回调。此行为可能因其他设备和操作系统版本而异,这就是为了广泛兼容而需要循环的原因。

在使用Android 5.0的Nexus 5设备上,无论广告是否可连接,新扫描API始终会为同一设备的每个BLE广告返回多个回调。然而,使用Android 5.0的Nexus 4设备仍然只能获得一个可连接广告的广告回调,直到扫描停止并重新启动。这似乎是在驱动程序级别实现的,因此每个ROM映像可能会有所不同。

答案 1 :(得分:0)

this answer。除非您重新开始扫描,否则BLE规范表明您不会 为每个广告获取报告。所以有些手机可以做,有些手机不做。你不能依赖它。

我认为这是一种愚蠢的举动。