HarmonyOS Sample之Bluetooth传统蓝牙的使用

开发 前端 OpenHarmony
主要是针对蓝牙本机的基本操作,包括:打开和关闭蓝牙、设置和获取本机蓝牙名称、扫描和取消扫描周边蓝牙设备、获取本机蓝牙profile对其他设备的连接状态、获取本机蓝牙已配对的蓝牙设备列表。

[[424760]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

1.介绍

本示例演示了如何对蓝牙进行基本操作,

传统蓝牙本机管理:

主要是针对蓝牙本机的基本操作,包括:打开和关闭蓝牙、设置和获取本机蓝牙名称、扫描和取消扫描周边蓝牙设备、获取本机蓝牙profile对其他设备的连接状态、获取本机蓝牙已配对的蓝牙设备列表。

传统蓝牙远端管理操作:

主要是针对远端蓝牙设备的基本操作,包括:获取远端蓝牙设备地址、类型、名称和配对状态,以及向远端设备发起配对。

传统蓝牙和BLE的的概念请参考 蓝牙开发概述

还有一个小知识点,

调用蓝牙的打开接口需要ohos.permission.USE_BLUETOOTH权限,

调用蓝牙扫描接口需要ohos.permission.LOCATION权限和ohos.permission.DISCOVER_BLUETOOTH权限。

2.搭建环境

安装DevEco Studio,详情请参考DevEco Studio下载

设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:

如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作

如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境

下载源码后,使用DevEco Studio 打开项目,模拟器运行即可。

真机运行需要将config.json中的buddleName修改为自己的,如果没有请到AGC上进行配置,参见 使用模拟器进行调试

3.代码结构

HarmonyOS Sample 之 Bluetooth 传统蓝牙的使用-鸿蒙HarmonyOS技术社区

4.实例讲解

4.1.界面布局

 布局效果

HarmonyOS Sample 之 Bluetooth 传统蓝牙的使用-鸿蒙HarmonyOS技术社区HarmonyOS Sample 之 Bluetooth 传统蓝牙的使用-鸿蒙HarmonyOS技术社区

4.2.后台代码

4.2.1 涉及的相关类

SDK提供的核心类:

BluetoothHost.java//蓝牙主机,可以管理蓝牙,提供了蓝牙的基本操作,打开/关闭/获取状态等。

BluetoothRemoteDevice.java//蓝牙对象,用于建立与对端设备的连接并查询名称、设备类型和配对状态等信息。

自定义的类:

BluetoothItemProvider.java//蓝牙设备列表项提供程序

BluetoothEventListener.java//蓝牙事件监听接口

BluetoothPlugin.java//蓝牙插件

BluetoothDevice.java//蓝牙对象简易模型

4.2.2 BluetoothPlugin.java 蓝牙插件提供的功能

a.初始化BluetoothHost蓝牙主机对象getDefaultHost

  1. /** 
  2. * 初始化蓝牙主机对象和监听器 
  3. * Initializes the Bluetooth Host on device. 
  4. * @param eventListener interface to update the Bluwettoth events 
  5. */ 
  6. public void initializeBluetooth(BluetoothEventListener eventListener) { 
  7.   bluetoothEventListener = eventListener; 
  8.   btHost = BluetoothHost.getDefaultHost(mainSliceContext); 
  9.   LogUtil.info(TAG, "initializeBluetooth, btHost:"+btHost); 

b.开启/关闭蓝牙/获取蓝牙状态enableBt/disableBt/getBtState

  1. /** 
  2. * 开启蓝牙 
  3. * 低功耗蓝牙(BLE ,Bluetooth Low Energy),LE是2010年才提出的 
  4. * 经典蓝牙(classic Bluetooth),包括BR,EDR和HS(AMP)三种模式 
  5. * Enables the Bluetooth on device. 
  6. */ 
  7. public void enableBluetooth() { 
  8.   LogUtil.info("enableBluetooth""getBtState:"+btHost.getBtState()); 
  9.   //获取蓝牙主机的状态 
  10.   if (btHost.getBtState() == STATE_OFF || 
  11.           btHost.getBtState() == STATE_TURNING_OFF || 
  12.           btHost.getBtState() ==STATE_BLE_ON) { 
  13.       LogUtil.info("enableBluetooth""enableBt:"+btHost.getBtState()); 
  14.       //开启蓝牙 
  15.       btHost.enableBt(); 
  16.   } 
  17.   //事件通知蓝牙状态发生改变 
  18.   bluetoothEventListener.notifyBluetoothStatusChanged(btHost.getBtState()); 
  19. /** 
  20. * 关闭蓝牙 
  21. * Disables the Bluetooth on device. 
  22. */ 
  23. public void disableBluetooth() { 
  24.   if (btHost.getBtState() == STATE_ON || btHost.getBtState() == STATE_TURNING_ON) { 
  25.       btHost.disableBt(); 
  26.   } 
  27.   bluetoothEventListener.notifyBluetoothStatusChanged(btHost.getBtState()); 
  28.  
  29. /** 
  30. * 获取蓝牙状态 
  31. * Obtains the status of the Bluetooth on device. 
  32. * @return status of Bluetooth on device 
  33. */ 
  34. public int getBluetoothStatus() { 
  35.   LogUtil.info("getBluetoothStatus""getBluetoothStatus:"+btHost.getBtState()); 
  36.   //获取蓝牙状态 
  37.   return btHost.getBtState(); 

c.开始蓝牙发现startBtDiscovery

还要注意的是蓝牙发现操作需要申请位置权限。

  1. /** 
  2. * 开始蓝牙发现 
  3. * Scans the currently available bluetooth devices 
  4. */ 
  5. public void startBtDiscovery() { 
  6.   if (!btHost.isBtDiscovering()) { 
  7.       //开始发现设备,大约需要12.8s 
  8.       btHost.startBtDiscovery(); 
  9.   } 
  10.  
  11. /** 
  12. *判断是否有权限 
  13. */ 
  14. private boolean hasPermission() { 
  15.   return mainSliceContext.verifySelfPermission(Constants.PERM_LOCATION) == IBundleManager.PERMISSION_GRANTED; 
  16.  
  17. /** 
  18. * 启动蓝牙扫描 
  19. * Scans the currently available bluetooth devices 
  20. */ 
  21. public void startBtScan() { 
  22.   LogUtil.info("startBtScan""getBtState:"+btHost.getBtState()); 
  23.   int btStatus = btHost.getBtState(); 
  24.  
  25.   if (btStatus == STATE_ON) { 
  26.       if (hasPermission()) { 
  27.           startBtDiscovery(); 
  28.       } else { 
  29.           requestPermission(); 
  30.       } 
  31.   } 

d.蓝牙设备配对及获取已配对的设备列表startPair/getPairedDevices

  1. /** 
  2. * 启动与给定地址的蓝牙设备配对。 
  3. * initiate pairing with bluetooth device of given address. 
  4. * @param pairAddress address of the bluetooth device 
  5. */ 
  6. public void startPair(String pairAddress) { 
  7.   Optional<BluetoothRemoteDevice> optBluetoothDevice = getSelectedDevice(pairAddress); 
  8.   optBluetoothDevice.ifPresent(BluetoothRemoteDevice::startPair); 
  9.  
  10. /** 
  11. * 获取要配对的设备 
  12. * @param pairAddress 
  13. * @return 
  14. */ 
  15. private Optional<BluetoothRemoteDevice> getSelectedDevice(String pairAddress) { 
  16.   if (pairAddress != null && !pairAddress.isEmpty()) { 
  17.       for (BluetoothRemoteDevice device : availableDevices) { 
  18.           if (device.getDeviceAddr().equals(pairAddress)) { 
  19.               return Optional.ofNullable(device); 
  20.           } 
  21.       } 
  22.   } 
  23.   return Optional.empty(); 
  24.  
  25. /** 
  26. * 获取已配对的蓝牙设备列表 
  27. * Obtains the paired Bluetooth device list. 
  28. * @return paired Bluetooth devices 
  29. */ 
  30. public List<BluetoothDevice> getPairedDevices() { 
  31.   //btHost.getPairedDevices() 
  32.   Set<BluetoothRemoteDevice> pairedDevices = new HashSet<>(btHost.getPairedDevices()); 
  33.   return getBluetoothDevices(pairedDevices); 

e.蓝牙事件的订阅/取消 及 相关事件的处理

在处理蓝牙事件的同时,通过BluetoothEventListener通知MainAbilitySlice。

  1. /** 
  2. * 订阅蓝牙事件 
  3. * Subscribe for Events of Bluetooth using CommonEvents 
  4. */ 
  5. public void subscribeBluetoothEvents() { 
  6.   MatchingSkills matchingSkills = new MatchingSkills(); 
  7.   //表示蓝牙状态改变时上报的事件。 
  8.   matchingSkills.addEvent(BluetoothHost.EVENT_HOST_STATE_UPDATE); 
  9.   //指示蓝牙扫描开始时报告的事件。 
  10.   matchingSkills.addEvent(BluetoothHost.EVENT_HOST_DISCOVERY_STARTED); 
  11.   //指示蓝牙扫描完成时报告的事件。 
  12.   matchingSkills.addEvent(BluetoothHost.EVENT_HOST_DISCOVERY_FINISHED); 
  13.   //表示发现远程蓝牙设备时上报的事件。 
  14.   matchingSkills.addEvent(BluetoothRemoteDevice.EVENT_DEVICE_DISCOVERED); 
  15.   //远程蓝牙设备配对时上报的事件。 
  16.   matchingSkills.addEvent(BluetoothRemoteDevice.EVENT_DEVICE_PAIR_STATE); 
  17.  
  18.   //用于创建 CommonEventSubscriber 实例并传递 subscribeInfo 参数的构造函数。 
  19.   CommonEventSubscribeInfo subscribeInfo = new CommonEventSubscribeInfo(matchingSkills); 
  20.  
  21.   //订阅者 
  22.   commonEventSubscriber = new CommonEventSubscriber(subscribeInfo) { 
  23.       @Override 
  24.       public void onReceiveEvent(CommonEventData commonEventData) { 
  25.           Intent intent = commonEventData.getIntent(); 
  26.           handleIntent(intent); 
  27.       } 
  28.   }; 
  29.   try { 
  30.       //完成订阅 
  31.       CommonEventManager.subscribeCommonEvent(commonEventSubscriber); 
  32.   } catch (RemoteException e) { 
  33.       LogUtil.error(TAG, "RemoteException while subscribe bluetooth events."); 
  34.   } 
  35.  
  36. /** 
  37. * 取消订阅蓝牙事件 
  38. * UnSubscribe for Bluetooth Events 
  39. */ 
  40. public void unSubscribeBluetoothEvents() { 
  41.   if (commonEventSubscriber != null) { 
  42.       try { 
  43.           CommonEventManager.unsubscribeCommonEvent(commonEventSubscriber); 
  44.       } catch (RemoteException e) { 
  45.           LogUtil.error(TAG, "RemoteException while unsubscribing bluetooth events."); 
  46.       } 
  47.       commonEventSubscriber = null
  48.   } 
  49.  
  50.  
  51.  
  52. private void handleIntent(Intent intent) { 
  53.   if (intent == null) { 
  54.       return
  55.   } 
  56.  
  57.   String action = intent.getAction(); 
  58.   switch (action) { 
  59.       //状态更新 
  60.       case BluetoothHost.EVENT_HOST_STATE_UPDATE: 
  61.           handleHostStateUpdate(); 
  62.           break; 
  63.       //扫描开始 
  64.       case BluetoothHost.EVENT_HOST_DISCOVERY_STARTED: 
  65.           handleDeviceDiscoveryState(true); 
  66.           break; 
  67.       //表示发现远程蓝牙设备时上报的事件。 
  68.       case BluetoothRemoteDevice.EVENT_DEVICE_DISCOVERED: 
  69.           handleBluetoothDeviceDiscovered(intent); 
  70.           break; 
  71.       // 扫描完成 
  72.       case BluetoothHost.EVENT_HOST_DISCOVERY_FINISHED: 
  73.           handleDeviceDiscoveryState(false); 
  74.           break; 
  75.       //表示远程蓝牙设备配对时上报的事件。 
  76.       case BluetoothRemoteDevice.EVENT_DEVICE_PAIR_STATE: 
  77.           handleDevicePairState(intent); 
  78.           break; 
  79.       default
  80.           LogUtil.info(TAG, "Action not handled : " + action); 
  81.   } 
  82.  
  83. private void handleDevicePairState(Intent intent) { 
  84.   BluetoothRemoteDevice btRemoteDevice = intent.getSequenceableParam(BluetoothRemoteDevice.REMOTE_DEVICE_PARAM_DEVICE); 
  85.   if (btRemoteDevice.getPairState() == BluetoothRemoteDevice.PAIR_STATE_PAIRED) { 
  86.       //更新2个设备列表 
  87.       updateAvailableDeviceList(btRemoteDevice); 
  88.       updatePairedDeviceList(); 
  89.   } 
  90.  
  91. private void handleDeviceDiscoveryState(boolean isStarted) { 
  92.   //处理扫描状态变化事件通知 
  93.   bluetoothEventListener.notifyDiscoveryState(isStarted); 
  94.  
  95. /** 
  96. * 处理蓝牙状态变化通知 
  97. */ 
  98. private void handleHostStateUpdate() { 
  99.  
  100.   int status = getBluetoothStatus(); 
  101.   bluetoothEventListener.notifyBluetoothStatusChanged(status); 
  102.  
  103. /** 
  104. * 处理蓝牙发现事件 
  105. * @param intent 
  106. */ 
  107. private void handleBluetoothDeviceDiscovered(Intent intent) { 
  108.   BluetoothRemoteDevice btRemoteDevice = 
  109.           intent.getSequenceableParam(BluetoothRemoteDevice.REMOTE_DEVICE_PARAM_DEVICE); 
  110.  
  111.   //未配对的设备 
  112.   if (btRemoteDevice.getPairState() != BluetoothRemoteDevice.PAIR_STATE_PAIRED) { 
  113.       //发现后添加到可用的蓝牙设备 
  114.       availableDevices.add(btRemoteDevice); 
  115.   } 
  116.   bluetoothEventListener.updateAvailableDevices(getAvailableDevices()); 
  117.  
  118.  
  119. /** 
  120. * 更新可用设备列表 
  121. * @param remoteDevice 
  122. */ 
  123. private void updateAvailableDeviceList(BluetoothRemoteDevice remoteDevice) { 
  124.   //移除以配对的蓝牙 
  125.   availableDevices.removeIf(device -> device.getDeviceAddr().equals(remoteDevice.getDeviceAddr())); 
  126.   bluetoothEventListener.updateAvailableDevices(getAvailableDevices()); 
  127.  
  128. private void updatePairedDeviceList() { 
  129.   //刷新已配对的蓝牙列表 
  130.   bluetoothEventListener.updatePairedDevices(getPairedDevices()); 
  131.  
  132. public List<BluetoothDevice> getAvailableDevices() { 
  133.   return getBluetoothDevices(availableDevices); 
  134.  
  135. /** 
  136. * 获取已配对的蓝牙设备列表 
  137. * Obtains the paired Bluetooth device list. 
  138. * @return paired Bluetooth devices 
  139. */ 
  140. public List<BluetoothDevice> getPairedDevices() { 
  141.   //btHost.getPairedDevices() 
  142.   Set<BluetoothRemoteDevice> pairedDevices = new HashSet<>(btHost.getPairedDevices()); 
  143.   return getBluetoothDevices(pairedDevices); 
  144.  
  145. private List<BluetoothDevice> getBluetoothDevices(Set<BluetoothRemoteDevice> remoteDeviceList) { 
  146.   List<BluetoothDevice> btDevicesList = new ArrayList<>(); 
  147.   if (remoteDeviceList != null) { 
  148.       // 
  149.       btDevicesList = remoteDeviceList.stream().map(BluetoothDevice::new).collect(Collectors.toList()); 
  150.   } 
  151.   return btDevicesList; 

4.2.3 BluetoothEventListener.java 自定义的蓝牙事件监听器接口

  1. public interface BluetoothEventListener { 
  2.  void updateAvailableDevices(List<BluetoothDevice> bluetoothDevice); 
  3.  
  4.  void updatePairedDevices(List<BluetoothDevice> bluetoothDevice); 
  5.  
  6.  void notifyBluetoothStatusChanged(int bluetoothStatus); 
  7.  
  8.  void notifyDiscoveryState(boolean isStarted); 
  9.  } 

4.2.4 BluetoothItemProvider.java 蓝牙设备列表提供程序

这个可以作为一个标准件了,每个ListContainer都可以用它,包括了列表的通用操作,像数据更新,点击事件等。

  1. public class BluetoothItemProvider extends BaseItemProvider { 
  2.  private final AbilityContext context; 
  3.  
  4.  private List<BluetoothDevice> bluetoothDeviceList; 
  5.  
  6.  public BluetoothItemProvider(AbilityContext context, List<BluetoothDevice> itemList) { 
  7.      this.context = context; 
  8.      bluetoothDeviceList = itemList; 
  9.  } 
  10.  
  11.  @Override 
  12.  public int getCount() { 
  13.      return bluetoothDeviceList.size(); 
  14.  } 
  15.  
  16.  @Override 
  17.  public Object getItem(int position) { 
  18.      return bluetoothDeviceList.get(position); 
  19.  } 
  20.  
  21.  @Override 
  22.  public long getItemId(int position) { 
  23.      return position; 
  24.  } 
  25.  
  26.  @Override 
  27.  public Component getComponent(int position, Component component, ComponentContainer componentContainer) { 
  28.      return getRootComponent(position); 
  29.  } 
  30.  
  31.  private Component getRootComponent(int position) { 
  32.  
  33.      //List item 布局组件 
  34.      Component rootComponent = LayoutScatter.getInstance(context) 
  35.              .parse(ResourceTable.Layout_list_item, nullfalse); 
  36.  
  37.      Text deviceName = (Text) rootComponent.findComponentById(ResourceTable.Id_bluetooth_device_name); 
  38.  
  39.      //蓝牙设备名称 
  40.      BluetoothDevice bluetoothDevice = bluetoothDeviceList.get(position); 
  41.      deviceName.setText(bluetoothDevice.getName()); 
  42.  
  43.      //设置点击监听事件,开始配对 
  44.      rootComponent.setClickedListener(component -> { 
  45.          LogUtil.info("BluetoothItemProvider""startPair:" + bluetoothDevice.getAddress()); 
  46.          //表示对端设备未配对。 
  47.          if (bluetoothDevice.getPairState() == BluetoothRemoteDevice.PAIR_STATE_NONE) { 
  48.              //启动与给定地址的蓝牙设备配对。 
  49.              BluetoothPlugin.getInstance(context).startPair(bluetoothDevice.getAddress()); 
  50.          } 
  51.      }); 
  52.  
  53.      return rootComponent; 
  54.  } 
  55.  
  56.  /** 
  57.   * 更新蓝牙设备列表 
  58.   * updates available Bluetooth devices in UI 
  59.   * 
  60.   * @param devices list of Bluetooth devices 
  61.   */ 
  62.  public void updateDeviceList(List<BluetoothDevice> devices) { 
  63.      bluetoothDeviceList = devices; 
  64.      notifyDataChanged(); 
  65.  } 

4.2.5 MainAbilitySlice.java 主能力页面操作

a.首先是实现了几个相关的接口

Component.ClickedListener 用于实现按钮的点击事件

BluetoothEventListener 用于实现蓝牙事件通知的处理

CheckedStateChangedListener 用于实现switch开关的处理

  1. public class MainAbilitySlice extends AbilitySlice 
  2.     implements Component.ClickedListener, BluetoothEventListener, AbsButton.CheckedStateChangedListener { 

b.初始化工作

在onActive生命周期函数中

初始化蓝牙插件/初始化容器列表/初始化组件/订阅蓝牙事件

  1. /** 
  2. * 初始化蓝牙插件 
  3. */ 
  4. private void initializeBluetoothHost() { 
  5.   // 
  6.   BluetoothPlugin.getInstance(this).initializeBluetooth(this); 
  7.  
  8. private void initComponents() { 
  9.   //'开始发现' 按钮,用来搜索附件的蓝牙设备 
  10.   Button btnStartDiscovery = (Button) findComponentById(ResourceTable.Id_btn_start_discovery); 
  11.   //因为implements Component.ClickedListener 所以可以这样写 
  12.   btnStartDiscovery.setClickedListener(this); 
  13.  
  14.   initListContainer(); 
  15.   //蓝牙状态文本组件 
  16.   textBluetoothStatus = (Text) findComponentById(ResourceTable.Id_bluetooth_status); 
  17.  
  18.   //蓝牙开关组件 
  19.   bluetoothSwitch = (Switch) findComponentById(ResourceTable.Id_bt_switch); 
  20.   //设置状态监听事件 
  21.   bluetoothSwitch.setCheckedStateChangedListener(this); 
  22.  
  23.   //根据系统蓝牙状态设置开关 
  24.   updateBluetoothStatus(BluetoothPlugin.getInstance(this).getBluetoothStatus()); 
  25.  
  26.   //附件的蓝牙设备容器列表 
  27.   containerLists = (DirectionalLayout) findComponentById(ResourceTable.Id_container_lists); 
  28.   //根据蓝牙状态控制是否显示附件的蓝牙设备容器列表 
  29.   containerLists.setVisibility(isBluetoothEnabled() ? Component.VISIBLE : Component.HIDE); 
  30.  
  31.   //环形进度条组件 
  32.   progressBar = (ProgressBar) findComponentById(ResourceTable.Id_progressbar); 
  33.  
  34. /** 
  35. * 订阅蓝牙事件 
  36. */ 
  37. private void subscribeBluetoothEvents() { 
  38.   // 
  39.   BluetoothPlugin.getInstance(this).subscribeBluetoothEvents(); 
  40.  
  41. /** 
  42. * 初始化容器列表 
  43. */ 
  44. private void initListContainer() { 
  45.   ListContainer availableDevicesContainer = 
  46.       (ListContainer) findComponentById(ResourceTable.Id_list_available_devices); 
  47.  
  48.   //1.获取可用的蓝牙设备 
  49.   availableDevicesItemProvider = new BluetoothItemProvider(this, 
  50.       BluetoothPlugin.getInstance(this).getAvailableDevices()); 
  51.   //设置提供程序 
  52.   availableDevicesContainer.setItemProvider(availableDevicesItemProvider); 
  53.  
  54.   //2.获取已配对的蓝牙设备 
  55.   ListContainer pairedDevicesContainer = (ListContainer) findComponentById(ResourceTable.Id_list_paired_devices); 
  56.   pairedDevicesItemProvider = new BluetoothItemProvider(this, 
  57.       BluetoothPlugin.getInstance(this).getPairedDevices()); 
  58.   //设置提供程序 
  59.   pairedDevicesContainer.setItemProvider(pairedDevicesItemProvider); 
  60.  
  61. /** 
  62. * 更新蓝牙状态开关和文本 
  63. * @param bluetoothStatus 
  64. */ 
  65. private void updateBluetoothStatus(int bluetoothStatus) { 
  66.   LogUtil.info("MainAbilitySlice""updateBluetoothStatus:" + bluetoothStatus); 
  67.   //开关 
  68.   bluetoothSwitch.setChecked(isBluetoothEnabled()); 
  69.   //状态文本 
  70.   textBluetoothStatus.setText(getBluetoothStatusString(bluetoothStatus)); 
  71.  
  72.  
  73. /** 
  74. * 显示环形进度条 
  75. * 用定时器实现了一个进度条,遗憾的是有一定的卡顿 
  76. * @param isShow 
  77. */ 
  78. private void showProgressBar(boolean isShow) { 
  79.   LogUtil.info("MainAbilitySlice""isShow:" + isShow); 
  80.   LogUtil.info("MainAbilitySlice""timer=" + timer); 
  81.   if(isShow){ 
  82.       //显示进度条 
  83.       progressBar.setVisibility(Component.VISIBLE); 
  84.       if(timer==null){ 
  85.           timer = new Timer(); 
  86.       } 
  87.       if(timerTask==null){ 
  88.           timerTask= new TimerTask() { 
  89.               @Override 
  90.               public void run() { 
  91.                   if(percent==10){ 
  92.                       percent=1; 
  93.                       progressBar.setProgressValue(0); 
  94.                   }else
  95.                       percent++; 
  96.                   } 
  97.                   LogUtil.info("MainAbilitySlice""percent:" + percent); 
  98.                   getContext().getUITaskDispatcher().asyncDispatch(new Runnable() { 
  99.                       @Override 
  100.                       public void run() { 
  101.                           progressBar.setProgressValue(percent*10); 
  102.                       } 
  103.                   }); 
  104.               } 
  105.           }; 
  106.           // 
  107.           timer.schedule(timerTask, 0, 1000); 
  108.       } 
  109.   }else { 
  110.       //隐藏进度条 
  111.       progressBar.setProgressValue(0); 
  112.       progressBar.setVisibility(Component.HIDE); 
  113.  
  114.       if(timer!=null){ 
  115.           LogUtil.info("MainAbilitySlice""timer set null"); 
  116.           timer.cancel(); 
  117.           timerTask.cancel(); 
  118.           timer=null
  119.           timerTask=null
  120.       } 
  121.   } 
  122.  
  123.  
  124. /** 
  125. * 获取蓝牙状态 
  126. * @return 
  127. */ 
  128. private boolean isBluetoothEnabled() { 
  129.  
  130.   int status = BluetoothPlugin.getInstance(this).getBluetoothStatus(); 
  131.   LogUtil.info("isBluetoothEnabled""isBluetoothEnabled:"+status); 
  132.   return status == BluetoothHost.STATE_ON; 
  133.  
  134.  
  135. private String getBluetoothStatusString(int bluetoothStatus) { 
  136.   LogUtil.info("bluetoothStatus""bluetoothStatus:"+bluetoothStatus); 
  137.   switch (bluetoothStatus) { 
  138.  
  139.       case BluetoothHost.STATE_OFF: 
  140.  
  141.       case BluetoothHost.STATE_BLE_TURNING_OFF: 
  142.           //disabled 不可用 
  143.           return Constants.BT_DISABLED; 
  144.  
  145.       case BluetoothHost.STATE_TURNING_ON: 
  146.           //turning on 开启 
  147.           return Constants.BT_TURNING_ON; 
  148.  
  149.       case BluetoothHost.STATE_ON: 
  150.           //enabled 可用的 
  151.           return Constants.BT_ENABLED; 
  152.  
  153.       case BluetoothHost.STATE_TURNING_OFF: 
  154.           //turning off 关闭 
  155.           return Constants.BT_TURNING_OFF; 
  156.  
  157.       default
  158.           //undefined 未定义 
  159.           return Constants.BT_UNDEFINED; 
  160.   } 

c.实现BluetoothEventListener接口相关函数

  1. @Override 
  2. public void updateAvailableDevices(List<BluetoothDevice> list) { 
  3.   //implements BluetoothEventListener 
  4.   //更新容器数据 
  5.   availableDevicesItemProvider.updateDeviceList(list); 
  6.  
  7. @Override 
  8. public void updatePairedDevices(List<BluetoothDevice> list) { 
  9.   //implements BluetoothEventListener 
  10.   //更新容器数据 
  11.   pairedDevicesItemProvider.updateDeviceList(list); 
  12.  
  13. @Override 
  14. public void notifyBluetoothStatusChanged(int bluetoothStatus) { 
  15.   LogUtil.info("notifyBluetoothStatusChanged""bluetoothStatus:"+bluetoothStatus); 
  16.   //蓝牙状态改变事件通知 
  17.   updateBluetoothStatus(bluetoothStatus); 
  18.  
  19. @Override 
  20. public void notifyDiscoveryState(boolean isStarted) { 
  21.   //蓝牙发现状态的事件通知 
  22.   showProgressBar(isStarted); 

d.实现CheckedStateChangedListener接口相关函数

  1. @Override 
  2. public void onCheckedChanged(AbsButton absButton, boolean isChecked) { 
  3.   //开关状态改变事件触发 
  4.   if (absButton.getId() == ResourceTable.Id_bt_switch && containerLists != null) { 
  5.       if (isChecked) { 
  6.           LogUtil.info("onCheckedChanged""enableBluetooth"); 
  7.           //开启蓝牙 
  8.           BluetoothPlugin.getInstance(this).enableBluetooth(); 
  9.           containerLists.setVisibility(Component.VISIBLE); 
  10.       } else { 
  11.           //关闭蓝牙 
  12.           BluetoothPlugin.getInstance(this).disableBluetooth(); 
  13.           containerLists.setVisibility(Component.HIDE); 
  14.  
  15.  
  16.       } 
  17.   } 

e.实现ClickedListener接口相关函数,开始发现蓝牙

  1. @Override 
  2. public void onClick(Component component) { 
  3.   LogUtil.info("MainAbilitySlice""startBtScan..."); 
  4.   //开始发现  扫描蓝牙设备 
  5.   if (component.getId() == ResourceTable.Id_btn_start_discovery) { 
  6.       LogUtil.info("MainAbilitySlice""startBtScan..."); 
  7.       BluetoothPlugin.getInstance(this).startBtScan(); 
  8.   } 

5.完整代码

附件直接下载

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2021-08-17 10:20:14

鸿蒙HarmonyOS应用

2021-09-15 14:55:49

鸿蒙HarmonyOS应用

2021-09-17 14:43:54

鸿蒙HarmonyOS应用

2021-09-24 09:25:01

鸿蒙HarmonyOS应用

2021-11-23 09:58:35

鸿蒙HarmonyOS应用

2015-02-27 16:03:26

Android源码Bluetooth_4BLE蓝牙通信

2021-07-08 09:42:04

鸿蒙HarmonyOS应用

2021-11-02 10:10:49

鸿蒙HarmonyOS应用

2021-07-29 14:03:35

鸿蒙HarmonyOS应用

2021-12-10 15:06:56

鸿蒙HarmonyOS应用

2021-11-30 14:51:11

鸿蒙HarmonyOS应用

2021-12-02 10:11:44

鸿蒙HarmonyOS应用

2021-08-24 15:13:06

鸿蒙HarmonyOS应用

2021-06-02 00:15:41

C# PC蓝牙

2023-04-17 16:10:14

鸿蒙蓝牙

2021-11-07 14:29:13

ChromeAPI 蓝牙

2021-03-26 14:00:27

物联网蓝牙低功耗

2022-06-07 10:40:05

蓝牙鸿蒙

2009-09-27 13:00:56

Hibernate S

2011-08-22 13:46:15

iPhone开发GameKit 蓝牙
点赞
收藏

51CTO技术栈公众号