Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android可在不同型号的手机上进行BLE信标扫描_Android_Bluetooth Lowenergy_Ibeacon_Samsung Mobile_Lg - Fatal编程技术网

Android可在不同型号的手机上进行BLE信标扫描

Android可在不同型号的手机上进行BLE信标扫描,android,bluetooth-lowenergy,ibeacon,samsung-mobile,lg,Android,Bluetooth Lowenergy,Ibeacon,Samsung Mobile,Lg,我正在编写一个Android应用程序,用于查找和检测IBeacons(这些是可扩展设备)并对其进行测距(取决于RSSI值) 我使用的示例代码来自 但这段代码在我的android设备(三星Galaxy S3和LG G3)上的工作原理不同 在我的S3上,“onLeScan”回调在循环中多次上升(大约每秒5次),每次根据范围给我不同的RSSI值 但在我的LG G3上,当我开始扫描时,“onLeScan”回调只上升一次。因此,如果我想获得新的RSSI值,我需要重新开始扫描。我认为这不是很好 我不知道LG

我正在编写一个Android应用程序,用于查找和检测IBeacons(这些是可扩展设备)并对其进行测距(取决于RSSI值) 我使用的示例代码来自

但这段代码在我的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;
}
公共类Main2Activity扩展活动实现BluetoothAdapter.LeScanCallback{
私人蓝牙适配器mBluetoothAdapter;
私有布尔扫描;
私有处理程序mHandler=新处理程序();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
/**/
最终BluetoothManager BluetoothManager=
(BluetoothManager)getSystemService(Context.BLUETOOTH\u服务);
mBluetoothAdapter=bluetoothManager.getAdapter();
if(mBluetoothAdapter==null | |!mBluetoothAdapter.isEnabled()){
Intent enablebintent=新意图(BluetoothAdapter.ACTION\u REQUEST\u ENABLE);
enableBtIntent.addFlags(enableBtIntent.FLAG\u活动\u新任务);
此。startActivity(enableBtIntent);
}   
扫描设备(真实);
}
专用void扫描设备(最终布尔启用){
如果(启用){
//在预定义的扫描周期后停止扫描。
mHandler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
mScanning=false;
mBluetoothAdapter.stopLeScan(Main2Activity.this);
}
}, 30000);
mScanning=true;
mBluetoothAdapter.starteScan(Main2Activity.this);
}否则{
mScanning=false;
mBluetoothAdapter.stopLeScan(Main2Activity.this);
}
}
ArrayList数据=新的ArrayList();
@凌驾
仅限公共void扫描(蓝牙设备arg0,int arg1,字节[]arg2){
//TODO自动生成的方法存根
add(arg2.toString());
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
返回super.onOptionsItemSelected(项目);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
返回true;
}

不幸的是,您需要停止并重新启动扫描以获取其他回调。这正是在中实现的方式,这使得在操作系统没有对每个播发进行回调的情况下,每个周期可以获取一次回调

目前尚不清楚设备和操作系统版本之间的差异。在Android 4.3的Nexus 4上,可连接广告和不可连接广告的扫描行为不同。可连接广告在每个扫描周期中只会导致一次广告回调,而不可连接广告每个扫描周期接收多个回调。此行为在其他设备和操作系统版本上可能有所不同,这就是为什么循环对于广泛兼容性是必要的

在配备Android 5.0的Nexus 5设备上,新的扫描API始终会为来自同一设备的每个BLE播发返回多个回调,无论播发是否可连接。但是,配备Android 5.0的Nexus 4设备在停止扫描之前,仍然只会收到一个可连接播发的播发回调并重新启动。这似乎是在驱动程序级别实现的,因此每个ROM映像可能会有所不同。

请参阅。BLE规范说,除非重新启动扫描,否则您不必为每个广告获取报告。因此,有些手机有,有些没有。您不能依赖它


在我看来,这是一个愚蠢的举动。

你在beach case中使用的是相同的beacon硬件吗?它是什么beacon型号?还有,每个设备上都有什么Android版本?是的,我只有1个IBeacon Cc2541(在这里购买:)Android版本:G3上的4.4.2和S3上的4.3这是一个已知的差异,因为蓝牙过滤。不同的设备/品牌在Android上实现了不同的BLE扫描。我不确定你能做什么来“修复”它。这很糟糕。所以每次我需要新的RSSI值时,我都必须重新启动扫描(