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

它在电话设置中应该看起来像这样:

在“电话设置”中启用了位置(GPS)服务

或者像快速设置下拉菜单中的这样:

位置(GPS)服务在下拉设置中启用

一旦用户启用了许可和启动位置服务,那么你应该开始扫描。 我注意到,如果你已经扫描,而你启用的权限/打开位置服务,它仍然不会把任何东西在你的onScanResults

我不确定这是否是iBeacons / Bluetooth广告的错误或“function”(注意:广告是指销售产品而不是技术蓝牙广告),以便公司能够看到您的位置并将您引导至所需位置。

希望这能解决你的问题!

编辑我想补充说:你只需要这个扫描。 一旦连接到BLE设备,就可以closures手机上的位置服务,并且仍然会连接到设备。 但是,您无法发现或连接到任何新设备,所有广告设备将从onScanResults

就像@Jacopo Tosi说,你必须要求位置权限。 你可以在这里阅读如何做到这一点。 而且你还必须打开位置。 我不知道为什么这样做。 但这是我设法使其工作的唯一方法。

在我的情况下(HTC M9),我也不得不进入蓝牙下的Android设置菜单,并手动扫描BT设备。