使用Android 6.0的BluetoothLeScanner.startScan无法发现设备

时间:2015-10-08 10:56:22

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

我尝试使用函数 BluatoothLeScanner.startScan 而不是弃用的 BluetoothAdapter.startLeScan 。 昨天我将我的Nexus 5更新到Android 6.0,从那时起我的应用程序就不再起作用了。 我首先添加 ACCESS_COARSE_LOCATION 所需的首选项,如https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id所示。 然后我按照此处所述添加了权限:https://developer.android.com/training/permissions/requesting.html。 但最后它似乎无法正常工作,它不会发送回设备。

这是我的代码:

清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.stm.sensitronapp">
          <uses-sdk android:maxSdkVersion="23"/>
          <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

          <uses-permission android:name="android.permission.BLUETOOTH"/>
          <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
          <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>`

DeviceScanActivity

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
...

if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION)
            != PackageManager.PERMISSION_GRANTED){
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.ACCESS_COARSE_LOCATION)) {
        } else {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                    MY_PERMISSIONS_REQUEST_ACCESS_COARSE);
        }
    }

// Device scan callback.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            mScanCallback = new ScanCallback() {
                @Override
                public void onScanResult(int callbackType, ScanResult result) {
                    super.onScanResult(callbackType, result);
                    mLeDeviceListAdapter.addDevice(result.getDevice());
                    mLeDeviceListAdapter.notifyDataSetChanged();
                }
            };
        }
    } 
}
final BluetoothManager bluetoothManager =
            (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();

if (mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) {
        mSwipeRefreshLayout.setRefreshing(true);
        mLeDeviceListAdapter.clear();
        mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
        if(ContextCompat.checkSelfPermission(this,
                    Manifest.permission.ACCESS_COARSE_LOCATION ) == PackageManager.PERMISSION_GRANTED) {
                mBluetoothLeScanner.startScan(mScanCallback);
            }
        }
编辑:解决这个问题我只打开了GPS。在this way中以编程方式轻松完成。

6 个答案:

答案 0 :(得分:20)

如果授予权限,请尝试:打开GPS。

答案 1 :(得分:8)

您的应用是否在启动时提示“位置”权限?如果不是,请在其他地方处理代码,以便提示它。

此外,您可以检查此项以测试您的应用是否正常运行:

打开设置&gt;应用&gt; YourApplication&gt;权限 并启用位置,然后尝试扫描结果。

仅当您在清单上提供了ACCESS_COARSE_LOCATION时,才会在权限下列出位置。

答案 2 :(得分:4)

使用上面提供的解决方案有效,但副作用是您必须为不需要它的东西启用位置服务。一个丑陋且令人不满意的工作是在清单中指定目标版本

机器人:targetSdkVersion =&#34; 21&#34;

即使安装的版本是6.0.1,它也允许在我的Nexus 7上进行扫描。我不知道针对较低版本的副作用是什么,而不是安装版本,但至少扫描工作。可能是无GPS设备的唯一解决方案(如果存在此类设备)。

谷歌应该为此钉死十字架。

答案 3 :(得分:0)

一个 - 不完美的答案是,一旦你启用了新的运行时位置权限,你仍然可以使用相同的旧方法BT扫描方法。

            mBluetoothAdapter.startDiscovery();

.......

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();

                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                mDeviceList.add(device);


            }
        }
    };

答案 4 :(得分:0)

这是一个老问题,但我会回答帮助某人 不幸的是,ACCESS_COARSE_LOCATION和targetSdkVersion 22的组合在某些设备上不起作用。
这不是一个好方法,但我在不使用运行时权限的情况下通过以下方式解决了它(ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION)

  1. 将'targetSdkVersion'设置为19(我想也许api19~api22可能)
  2. 将以下权限添加到清单文件

    <uses-permission android:name="android.permission.READ_OWNER_DATA" />
    <uses-permission android:name="android.permission.WRITE_OWNER_DATA" />
    
  3. 测试到Android 4.4~7.1.1

答案 5 :(得分:-3)

设置你的minSdkVersion&#39;到18岁 targetSdkVersion 22