android 蓝牙的enable流程

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
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android蓝牙模块是指在Android设备上用于支持蓝牙功能的硬件和软件组件。通过蓝牙模块,Android设备可以与其他蓝牙设备进行通信和交互。 以下是关于Android蓝牙模块的介绍和演示: 1. 获取BluetoothAdapter对象: ```java BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); ``` 这个方法返回一个BluetoothAdapter对象,用于管理设备的蓝牙功能。 2. 检查设备是否支持蓝牙: ```java if (mBluetoothAdapter == null) { showToast("没有发现蓝牙模块"); return; } ``` 通过判断BluetoothAdapter对象是否为null,可以确定设备是否支持蓝牙功能。 3. 打开或关闭蓝牙: ```java if (!mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } ``` 可以使用isEnabled()方法检查蓝牙是否已经打开。如果蓝牙打开,可以通过ACTION_REQUEST_ENABLE意图请求用户打开蓝牙。 4. 搜索蓝牙设备: ```java mBluetoothAdapter.startDiscovery(); ``` 使用startDiscovery()方法开始搜索附近的蓝牙设备。 5. 连接蓝牙设备: ```java BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); BluetoothSocket socket = device.createRfcommSocketToServiceRecord(uuid); socket.connect(); ``` 可以使用getRemoteDevice()方法获取要连接的蓝牙设备对象,然后使用createRfcommSocketToServiceRecord()方法创建一个BluetoothSocket对象,并使用connect()方法连接到设备。 6. 发送和接收数据: ```java OutputStream outputStream = socket.getOutputStream(); outputStream.write(data); InputStream inputStream = socket.getInputStream(); byte[] buffer = new byte[1024]; int bytesRead = inputStream.read(buffer); ``` 可以使用getOutputStream()方法获取输出流,然后使用write()方法发送数据。使用getInputStream()方法获取输入流,然后使用read()方法接收数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值