Android 6.0上的蓝牙低功耗startScan找不到设备

时间:2015-10-09 16:57:07

标签: android bluetooth bluetooth-lowenergy android-6.0-marshmallow

我正在使用Nexus 5开发一款具有蓝牙低功耗的应用程序。它在Lollipop上运行,现在它不适用于Marshmallow。 我在清单和活动中的runTime上设置了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();

这些是我的回调:

 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);

它开始扫描但没有找到任何设备。 请帮帮我!!!!

3 个答案:

答案 0 :(得分:64)

我在同样的问题上挣扎。要修复它,你必须启用&#34;位置&#34; (GPS)在手机设置中以及在运行时请求应用中的位置权限。两者都需要完成扫描才能正常工作。

要请求位置权限,请将以下内容放入对话框或类似内容中:

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

并处理用户选择的任何内容。您还需要执行以下操作才能打开设备的位置服务:

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

在手机设置中应如下所示:

Location (GPS) services enabled in Phone Settings

或者在快速设置下拉列表中这样:

Location (GPS) services enabled in drop down settings

用户启用权限并启动了位置服务后,您应该开始扫描。我注意到,如果您在启用权限/启用位置服务时已经在扫描它仍然不会在onScanResults

中添加任何内容

我不确定这是一个错误还是一个&#34;功能&#34;对于iBeacons /蓝牙广告(注意:广告与销售产品而非技术蓝牙广告一样),以便公司能够查看您的位置并将您引导到他们想要的位置。

希望这可以解决您的问题!

修改 我想补充一点:你只需要这个扫描。连接到BLE设备后,您可以关闭手机上的位置服务,但仍然可以连接到您的设备。但是,您无法发现或连接到任何新设备,所有广告设备都将从onScanResults

中删除

答案 1 :(得分:2)

喜欢@Jacopo Tosi说你必须要求获得位置许可。 您可以阅读here如何操作。 而你也必须打开位置。我不知道为什么这样做。但这是我设法使其发挥作用的唯一方式。

答案 2 :(得分:0)

在我的情况下(HTC M9)我还必须进入蓝牙下的Android设置菜单并手动扫描BT设备。