蓝牙开启位于setting中,即 package:com.android.settings.bluetooth
BluetoothSettings.java 中。
菜单选项MENU_ID_SCAN:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_ID_SCAN:
if (mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_ON) {
MetricsLogger.action(getActivity(), MetricsLogger.ACTION_BLUETOOTH_SCAN);
startScanning();
}
return true;
case MENU_ID_RENAME_DEVICE:
MetricsLogger.action(getActivity(), MetricsLogger.ACTION_BLUETOOTH_RENAME);
new BluetoothNameDialogFragment().show(
getFragmentManager(), "rename device");
return true;
case MENU_ID_SHOW_RECEIVED:
MetricsLogger.action(getActivity(), MetricsLogger.ACTION_BLUETOOTH_FILES);
Intent intent = new Intent(BTOPP_ACTION_OPEN_RECEIVED_FILES);
getActivity().sendBroadcast(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
调用startScanning,添加可用设备列表,并将缓存的设备中没有配对的设备清除。调用LocalBluetoothAdapter.startScanning方法开始扫描。
LocalBluetoothAdapter.startScanning
public void startScanning(boolean force) {
// Only start if we're not already scanning
if (!mAdapter.isDiscovering()) {
//如果不是强制扫描,在SCAN_EXPIRATION_MS间隔内,之扫描一次
if (!force) {
// Don't scan more than frequently than SCAN_EXPIRATION_MS,
// unless forced
if (mLastScan + SCAN_EXPIRATION_MS > System.currentTimeMillis()) {
return;
}
// If we are playing music, don't scan unless forced.
//播放音乐时,不扫描
A2dpProfile a2dp = mProfileManager.getA2dpProfile();
if (a2dp != null && a2dp.isA2dpPlaying()) {
return;
}
}
//开始扫描
if (mAdapter.startDiscovery()) {
mLastScan = System.currentTimeMillis();
}
}
}
真在扫描则跳过
如果不是强制开始扫描,在SCAN_EXPIRATION_MS间隔时间内,只扫描一