1、情景
? ? ? ? 本機設備只打開藍牙開關,但不停留在設置里面藍牙頁面時,其他設備掃描不到本機設備。
2、Android7.1中,默認的行為是,只有在設置里面的藍牙頁面,才會開啟藍牙的可見性;如果只是打開下拉欄的藍牙快捷開關,是不會開啟藍牙可見性的。
3、需求:
? ? ? ? (1)打開藍牙時,直接打開藍牙可見性
? ? ? ? (2)不停留在設置里面藍牙頁面時,要掃描到本機設備
4、需求一的解決方案:
????????打開藍牙時,直接打開藍牙可見性。如下:
路徑:****/packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterProperties.java
void onBluetoothReady() {Log.d(TAG, "ScanMode = " + mScanMode );Log.d(TAG, "State = " + getState() );// When BT is being turned on, all adapter properties will be sent in 1// callback. At this stage, set the scan mode.synchronized (mObject) {if (getState() == BluetoothAdapter.STATE_TURNING_ON &&mScanMode == BluetoothAdapter.SCAN_MODE_NONE) {/* mDiscoverableTimeout is part of theadapterPropertyChangedCallback received beforeonBluetoothReady */if (mDiscoverableTimeout != 0)//setScanMode(AbstractionLayer.BT_SCAN_MODE_CONNECTABLE);setScanMode(AbstractionLayer.BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE);else /* if timeout == never (0) at startup */setScanMode(AbstractionLayer.BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE);/* though not always required, this keeps NV up-to date on first-boot after flash */setDiscoverableTimeout(mDiscoverableTimeout);}}}
? ? 如上圖:? ? 將? setScanMode(AbstractionLayer.BT_SCAN_MODE_CONNECTABLE);? 改為
????????setScanMode(AbstractionLayer.BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE);即可。
5、需求二的解決方案,如下:
路徑:******/packages/apps/Settings/src/com/android/settings/bluetooth/BluetoothSettings.java
@Overridepublic void onPause() {super.onPause();if (mBluetoothEnabler != null) {mBluetoothEnabler.pause();}// Make the device only visible to connected devices.//mLocalAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);if (isUiRestricted()) {return;}getActivity().unregisterReceiver(mReceiver);}
如上圖,在onPause()方法中將mLocalAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);注釋掉即可。