Android 6.0上的蓝牙低功耗startScan无法find设备
我正在开发一款使用Nexus 5的低功耗蓝牙应用程序。它在棒棒糖上工作,现在它不能在棉花糖上工作。 我在清单中和运行时的Activity中设置了ACCESS_COARSE_LOCATION和ACCESS_FINE_LOCATION权限。
这是ScanFilters的列表:
mScanFilterTest = new ScanFilter.Builder().build(); mScanFilter = new ArrayList<ScanFilter>(); mScanFilter.add(mScanFilterTest);
这些是设置:
mScanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).setReportDelay(0) .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES).build();
这些是我的callback:
mBLEScan = new ScanCallback() { @Override public void onScanResult(int callbackType, ScanResult result) { super.onScanResult(callbackType, result); Log.i(TAG, "******************************************"); Log.i(TAG, "The scan result " + result); Log.i(TAG, "------------------------------------------"); } };
这是我的电话:
mBluetoothLeScanner.startScan(mScanFilter, mScanSettings, mBLEScan);
它开始扫描,但没有find任何设备。 请帮帮我!!!!
我在同样的问题上挣扎着。 要解决这个问题,您必须在手机设置中启用“位置”(GPS), 并在运行时请求位置权限。 两者都需要完成扫描才能正常工作。
要请求位置权限,请在对话框中input以下内容:
yourActivity.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, yourPermissionRequestCode);
并执行:
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){ if(requestCode == yourPermissionRequestCode) { ... //Do something based on grantResults } }
在yourActivity
并处理用户select的任何内容。 您还需要执行以下操作来打开设备的位置服务:
Intent enableLocationIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); yourActivity.startActivityForResult(enableLocationIntent, yourServiceRequestCode);
您可以通过执行以下操作来检查用户是否打开位置服务:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == yourServiceRequestCode) { ...//Do whatever you need to } }
在yourActivity
。 您还可以通过执行以下操作手动打开位置(GPS)服务:
Enter phone settings -> Select "Location" -> Then turn it on
它在电话设置中应该看起来像这样:
或者像快速设置下拉菜单中的这样:
一旦用户启用了许可和启动位置服务,那么你应该开始扫描。 我注意到,如果你已经扫描,而你启用的权限/打开位置服务,它仍然不会把任何东西在你的onScanResults
我不确定这是否是iBeacons / Bluetooth广告的错误或“function”(注意:广告是指销售产品而不是技术蓝牙广告),以便公司能够看到您的位置并将您引导至所需位置。
希望这能解决你的问题!
编辑我想补充说:你只需要这个扫描。 一旦连接到BLE设备,就可以closures手机上的位置服务,并且仍然会连接到设备。 但是,您无法发现或连接到任何新设备,所有广告设备将从onScanResults
就像@Jacopo Tosi说,你必须要求位置权限。 你可以在这里阅读如何做到这一点。 而且你还必须打开位置。 我不知道为什么这样做。 但这是我设法使其工作的唯一方法。
在我的情况下(HTC M9),我也不得不进入蓝牙下的Android设置菜单,并手动扫描BT设备。