精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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應用

2021-07-08 09:42:04

鴻蒙HarmonyOS應用

2021-11-02 10:10:49

鴻蒙HarmonyOS應用

2015-02-27 16:03:26

Android源碼Bluetooth_4BLE藍牙通信

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-03-26 14:00:27

物聯網藍牙低功耗

2021-11-07 14:29:13

ChromeAPI 藍牙

2009-09-27 13:00:56

Hibernate S

2022-06-07 10:40:05

藍牙鴻蒙

2014-03-14 10:16:30

ModernWindows 8.1
點贊
收藏

51CTO技術棧公眾號

91精品国产乱码久久久久久蜜臀 | 国产福利视频在线观看| 日韩av电影一区| 中文字幕日韩欧美| 免费不卡av网站| 丰满大乳少妇在线观看网站 | 国产精品区一区| 在线天堂中文字幕| 日韩一区二区在线免费| 欧美成人精品福利| 成人一区二区三| av软件在线观看| 久久久综合激的五月天| 91精品综合视频| 五月天综合激情网| 小说区亚洲自拍另类图片专区| 亚洲成人黄色网| 尤物国产在线观看| 色戒汤唯在线观看| 最新不卡av在线| 欧美精品成人一区二区在线观看 | 亚洲第一精品夜夜躁人人爽| 欧美伦理片在线观看| 成年人视频免费在线播放| 亚洲国产精品成人综合| 精品国产乱码久久久久久丨区2区| 久草视频在线免费| 9久re热视频在线精品| 久久天天躁狠狠躁老女人| 精品人妻伦一二三区久| 亚洲精品tv| 在线观看三级视频欧美| 成人在线观看你懂的| 麻豆视频免费在线观看| 91在线porny国产在线看| 92看片淫黄大片欧美看国产片 | 欧美精品在线观看播放| 国产精品免费成人| 成年人在线网站| 亚洲欧美另类久久久精品| 日韩精品资源| 久久精品蜜桃| 91论坛在线播放| 国产日韩精品久久| 成人无码一区二区三区| 国产精一品亚洲二区在线视频| 国产精品青青在线观看爽香蕉| 奇米影视第四色777| 欧美视频成人| 欧美国产第二页| 极品颜值美女露脸啪啪| 手机在线一区二区三区| 自拍亚洲一区欧美另类| 久久国产柳州莫菁门| 国产精品片aa在线观看| 国产婷婷色综合av蜜臀av| 少妇精品一区二区| 天天躁日日躁狠狠躁欧美| 日韩成人中文字幕| 在线观看国产免费视频| 日韩av不卡一区| 日韩成人激情视频| 国产麻豆天美果冻无码视频| 亚洲国产精品嫩草影院久久av| 精品亚洲一区二区三区在线观看| www.日本高清| 国产亚洲电影| 伊人亚洲福利一区二区三区| 性爱在线免费视频| 亚洲国产精品久久久久蝴蝶传媒| 久久夜色精品国产亚洲aⅴ| 欧美人禽zoz0强交| 伊人蜜桃色噜噜激情综合| 91精品国产91久久久久久| 欧美一二三区视频| 久久亚洲欧美| 国产综合在线观看视频| 99久久免费国产精精品| 成人高清免费观看| 免费看污久久久| 成人一区二区不卡免费| 中文字幕一区在线| 日本wwwcom| 午夜激情在线播放| 欧美中文字幕一区| www.桃色.com| 日韩三级视频| 在线精品国产欧美| 成熟的女同志hd| 先锋a资源在线看亚洲| 国产精品一区二区三区免费视频| 国产精品久久久久久久久久久久久久久久久久 | 亚洲国产精品一| 91免费观看在线| 中文字幕在线亚洲三区| 超碰在线中文字幕| 欧美日韩国产首页| 无码国产69精品久久久久网站| 亚洲制服欧美另类| 久久香蕉频线观| 国产精品视频免费播放| 精品一区二区综合| 久久国产精品高清| 欧美午夜电影一区二区三区| 亚洲aaa精品| 蜜臀一区二区三区精品免费视频| 91麻豆精品激情在线观看最新| 日韩激情av在线免费观看| 小嫩苞一区二区三区| 国产亚洲毛片| 7777奇米亚洲综合久久 | 久久女同性恋中文字幕| 艳母动漫在线免费观看| 中老年在线免费视频| 欧美一区二区三区视频在线| 国产熟妇久久777777| 欧美aa国产视频| 国产精品久久久久aaaa九色| 天堂在线中文网| 综合婷婷亚洲小说| 欧美成人精品欧美一级乱| 在线视频亚洲欧美中文| 中文字幕最新精品| 黄色片中文字幕| 国产99一区视频免费| 亚洲国产日韩欧美| 欧美黄色网页| 亚洲经典中文字幕| 青青操视频在线播放| 美女国产一区二区三区| 欧美成ee人免费视频| 丁香花在线影院| 欧美一级日韩不卡播放免费| 国产不卡在线观看视频| 麻豆精品91| 久久久99国产精品免费| av色在线观看| 欧美成人欧美edvon| 成人免费视频国产免费观看| 免费观看久久久4p| 日韩欧美视频第二区| 国产伦精品一区二区三区视频金莲| 精品久久久网站| 久草免费在线视频观看| 国产精品主播直播| 久久久无码中文字幕久...| 欧美性生活一级| 色爱av美腿丝袜综合粉嫩av| 免费黄色一级大片| 国产欧美一区二区三区鸳鸯浴| 免费在线激情视频| 亚洲精品一级二级三级| 欧美亚洲国产成人精品| 午夜视频免费看| 欧美午夜激情视频| 无码人妻精品一区二区三应用大全| 99亚洲一区二区| 欧美18视频| 深夜视频一区二区| 在线观看91久久久久久| 中文字幕一级片| 国产精品久久久久久久久晋中| 中文久久久久久| 久久成人综合| 亚洲伊人久久综合| 性欧美ⅴideo另类hd| 精品欧美黑人一区二区三区| 久久草视频在线| 2022国产精品视频| 黄色免费网址大全| 国产精品久久久久一区二区三区厕所| 成人a在线观看| 亚洲欧美成人影院| 日韩高清中文字幕| 精品一区二区无码| 亚洲欧美福利一区二区| 亚洲av午夜精品一区二区三区| 影音先锋久久精品| 欧美重口乱码一区二区| 日韩毛片免费看| 欧美疯狂做受xxxx高潮| 日本一二三区在线视频| 欧美系列亚洲系列| 天天操天天操天天操天天操天天操| 国模大尺度一区二区三区| 日韩激情视频一区二区| 日本成人中文| 91沈先生作品| 色一区二区三区| 精品国产一区二区三区久久久狼| 精品人妻aV中文字幕乱码色欲| 五月开心婷婷久久| 殴美一级黄色片| 成人免费高清视频在线观看| 国产成人精品无码播放| 四季av一区二区凹凸精品| 成人欧美一区二区三区视频xxx| 欧美gay视频| 美女av一区二区三区| 欧美日韩伦理片| 日韩一二三四区| 国产伦精品一区二区三区视频我| 中文字幕五月欧美| 蜜桃精品一区二区| 国产毛片精品视频| www.xxx亚洲| 狠狠入ady亚洲精品| 午夜老司机精品| 精品久久ai| 亚洲一区中文字幕| 国精产品一区一区三区四川| 欧美日韩电影在线观看| av在线1区2区| 亚洲精品国产精品自产a区红杏吧 亚洲精品国产精品乱码不99按摩 亚洲精品国产精品久久清纯直播 亚洲精品国产精品国自产在线 | 一区二区三区在线观看网站| 四虎永久免费在线观看| 成人高清av在线| 日本一本在线视频| 蜜桃av一区二区| 久久久久久久久久久久久国产精品| 伊人久久大香线| 亚洲一区二区三区精品在线观看| 欧美日韩直播| 高清视频一区二区三区| 日韩一级特黄| 国产精品草莓在线免费观看| 91超碰在线播放| 久久资源免费视频| 成全电影播放在线观看国语| 精品对白一区国产伦| 国产麻豆精品一区| 欧美亚洲高清一区二区三区不卡| 九九视频免费在线观看| 成人欧美一区二区三区白人| 亚洲国产欧美视频| 成人美女在线观看| 激情六月丁香婷婷| 丁香婷婷久久| 亚洲欧美日韩国产成人精品影院 | 好吊妞视频这里有精品 | 精品国产乱子伦| 精品国产成人在线| 综合五月激情网| 国产精品毛片高清在线完整版| 国产婷婷在线观看| 高清久久久久久| 亚洲一区二区图片| 精品在线一区二区| 2019日韩中文字幕mv| 综合在线视频| 亚洲视频精品一区| 国产精品一区二区三区av麻 | 日本人妻伦在线中文字幕| 精品国产美女| 日本不卡二区高清三区| 性欧美lx╳lx╳| 狠狠色狠狠色综合人人| 欧美freesex8一10精品| 国产私拍一区| 国产主播性色av福利精品一区| 99在线国产| 亚洲精品高潮| 99在线影院| 欧洲精品一区二区三区| 国产精品国模在线| 久久久成人av毛片免费观看| 日本三级久久久| 国产精品伦一区二区| 国产精品久久久久久久app| 中文字幕在线高清| 国产精品色午夜在线观看| 国产精品久久久久久妇女| 国产欧美日韩综合精品| 国产精品一区免费在线| 亚洲最大成人在线| 91精品日本| 国产欧美日韩亚洲| 久久av资源| 亚洲高清不卡一区| 999久久久免费精品国产| wwwjizzjizzcom| 亚洲高清激情| 免费激情视频在线观看| 九九久久精品视频| 深夜福利网站在线观看| 成人中文字幕电影| 丁香激情五月少妇| 亚洲图片激情小说| 国产精品二区一区二区aⅴ| 欧美午夜久久久| 一道本在线视频| 日韩欧美电影一二三| 免费a级毛片在线观看| 中文字幕亚洲欧美一区二区三区 | 久久久免费毛片| 欧美综合激情| 国产精品九九| 午夜肉伦伦影院| 精品一区二区免费在线观看| 日本黄色录像片| 国产欧美精品在线观看| 澳门黄色一级片| 欧美亚男人的天堂| 国产成人a人亚洲精品无码| 亚洲精美色品网站| 一区二区三区伦理| 欧美最猛性xxxx| 精品福利在线| 欧美不卡1区2区3区| 亚洲一区欧美| 国产精品99久久免费黑人人妻| 国产一区二区在线电影| 久久无码人妻精品一区二区三区| 中文成人av在线| 中文字幕第15页| 91精品婷婷国产综合久久竹菊| 色综合免费视频| 欧美俄罗斯乱妇| 日韩精品三区| 国产欧美日韩综合一区在线观看| 天天射—综合中文网| 国产a级一级片| 国产成人在线观看免费网站| 四虎国产成人精品免费一女五男| 亚洲高清久久久| 艳妇乳肉豪妇荡乳av| 国产亚洲xxx| 爱啪啪综合导航| 97久草视频| 91综合久久一区二区| 免费观看精品视频| 国产专区欧美精品| 色偷偷www8888| 在线精品视频免费观看| 亚洲AV无码精品自拍| 日韩专区中文字幕| 狠狠操一区二区三区| 成人免费淫片aa视频免费| 精品国产不卡一区二区| 日本在线观看一区二区三区| 亚洲第一伊人| 熟女人妻一区二区三区免费看| 国产精品久久久久一区二区三区共| 午夜精品久久久久久久久久久久久蜜桃| 91麻豆精品国产| 日韩在线资源| 日本久久久久久久久久久| 亚洲欧美tv| 欧美成人一区二区在线观看| 99久久精品免费| www.youjizz.com亚洲| 欧美一二三区在线| av片在线观看网站| 成人av在线天堂| 91视频精品| 日韩欧美国产片| 亚洲色图欧美在线| a毛片在线免费观看| xx视频.9999.com| 日韩激情综合| 日本免费黄色小视频| 精品一区二区免费| 国产高潮国产高潮久久久91 | 精品精品国产毛片在线看| 久久久久久久久久久视频| av动漫一区二区| 国产精品suv一区二区三区| 亚洲精品中文字幕有码专区| 欧美办公室脚交xxxx| 国产精品对白刺激久久久| 一区二区日韩免费看| www.自拍偷拍| 欧美天天综合网| 日本亚洲精品| 91国产在线免费观看| 中国女人久久久| 欧美特黄一区二区三区| 欧美日韩成人一区| 91精品久久久久久粉嫩| 国产99午夜精品一区二区三区 | 久久久久久亚洲精品不卡| 成人性生交大片免费看96| 欧美日韩dvd| wwww国产精品欧美| 国产精品51麻豆cm传媒| 欧美剧在线观看| 加勒比中文字幕精品| 免费大片在线观看| 一区二区三区中文字幕电影| 国产91免费看| 国产精品啪视频| 国内综合精品午夜久久资源| 玖玖爱在线观看| 欧美一区欧美二区| 密臀av在线播放| 777久久精品一区二区三区无码| www..com久久爱| 亚洲天堂男人av| 欧美日韩福利电影| 精品高清在线|