android 蓝牙的enable流程

本文详细解析了在Android 7.0 Qcom8909平台上开启蓝牙的过程,从APP层的SwitchBar事件到Framework层的BluetoothAdapter,再到BluetoothManagerService和Bluetooth.apk中的AdapterState状态机。在开启蓝牙的过程中,会检查权限,通过AdapterService和IBluetooth接口进行操作,并在PendingCommandState中处理USER_TURN_ON消息,启动支持的蓝牙协议服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android 蓝牙的enable流程


本篇介绍从settings enable蓝牙的流程,按照蓝牙的代码的位置分成 APP层Framework层Bluetooth.apk三个部分。
这里的enable其实只是启动上层协议,使协议处于listen的状态。
蓝牙的driver的启动流程在下一篇博客中。
借用网上的一张图片,该篇只涉及左边半部分。
在这里插入图片描述

前提

  1. 这篇文章的codes和分析的流程基于Android 7.0的Qcom8909平台。
  2. 该平台支撑传统蓝牙和BLE。

APP

在这里插入图片描述
开关是个SwitchBar,监听事件callback到onSwitchChanged,调用mLocalAdapter.setBluetoothEnabled(isChecked),mLocalAdapter是个com.android.settingslib.bluetooth.LocalBluetoothAdapter的一个实例:

    public boolean enable() {
   
   
        return mAdapter.enable();
    }

这里的mAdapter是BluetoothAdapter的实例,在LocalBluetoothAdapter的构造函数中初始化。

framework

  1. 然后到framework层的BluetoothAdapter,该类api多多,简单来说就是分装了面向APP层的几乎所有蓝牙相关的API。
    @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
    public boolean enable() {
   
   
        android.util.SeempLog.record(56);
        if (isEnabled()) {
   
   
            if (DBG) Log.d(TAG, "enable(): BT already enabled!");
            return true;
        }
        try {
   
   
            return mManagerService.enable(ActivityThread.currentPackageName());
        } catch (RemoteException e) {
   
   Log.e(TAG, "", e);}
        return false;
    }
private final IBluetoothManager mManagerService;

这个mManagerService是BluetoothManagerService的binder的代理。

  1. BluetoothManagerService是在SystemServer中被拉起,跑在SystemServer进程中。
    public boolean enable(String packageName) throws RemoteException {
   
   
        final int callingUid = Binder.getCallingUid();
        final boolean callerSystem = UserHandle.getAppId(callingUid) == Process.SYSTEM_UID;

        if (!callerSystem) {
   
   
            if (!checkIfCallerIsForegroundUser()) {
   
   
                Slog.w(TAG, "enable(): not allowed for non-active and non system user");
                return false;
            }

            mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
                    "Need BLUETOOTH 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值