Android Studio开发学习(七、蓝牙模块java)

打印 上一主题 下一主题

主题 986|帖子 986|积分 2958

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
弁言

        上篇我们已经先容了蓝牙模块相干布局Android Studio开发学习(六、蓝牙模块xml)-CSDN博客,以是,今天我们来学习一下功能实现,如何打开关闭蓝牙。(这里DataActivity为蓝牙列表点击设备名连接后跳转界面函数,这里临时没有设置,只是默认空缺界面)

先来先容一下蓝牙相干概念
        蓝牙是一种无线技术标准,用于短间隔内的数据交换。在 Android 设备上,蓝牙技术允许进行设备发现、配对、连接以及数据传输。它广泛应用于音频设备连接、数据同步、远程控制等多个范畴。
           在 Android Studio中 进行蓝牙开发,重要是通过调用 Android 平台提供的蓝牙 API,实现设备间的搜刮、配对、连接以及数据传输功能。这包括在 AndroidManifest.xml 中声明须要的蓝牙权限,使用 BluetoothAdapter 和 BluetoothSocket(对于经典蓝牙)或 BluetoothGatt(对于BLE)等类进行编程,同时处置惩罚用户授权、兼容性问题、电量消耗和数据安全等挑衅。
  添加允许、权限

        为了确保应用能够安全地访问设备上的特定功能或数据,而不会对其他应用或用户隐私造成潜在威胁,我们必要在 AndroidManifest.xml 中添加蓝牙相干权限。


点击处置惩罚

设置和设置一个 ListView 来显示蓝牙设备信息,并处置惩罚 ListView 的点击事件。

        为打开、关闭蓝牙、获取蓝牙状态按钮添加点击结果

        为按钮设置点击监听器,用于更新显示已绑定蓝牙设备列表的UI。在点击事件中,它首先尝试获取须要的权限,然后清空现有设备列表,并查询所有已绑定的蓝牙设备。对于每个设备,根据其绑定状态,将设备名称和地址添加到列表中,并立即通知适配器数据已更改。

打开关闭蓝牙

       BlueToothController()方法:用于初始化蓝牙适配器 (BluetoothAdapter)。它调用 BluetoothAdapter.getDefaultAdapter() 来获取当前设备的蓝牙适配器实例,并将其存储在成员变量 BtAdapter 中,这是后续所有蓝牙操作的底子。
   turnOnBuleTooth() 方法:用于打开蓝牙。它首先查抄蓝牙是否已启用,如果没有,则通过 Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)哀求用户开启蓝牙。这里,它使用 activity.startActivityForResult(intent,requestCode); 来启动一个活动结果(Activity Result)的Intent,如许当蓝牙状态改变时,可以通过哀求的 requestCode 在 activity 的 onActivityResult 方法中接收回调。
   turnOffBlueTooth() 方法:用于关闭蓝牙。它首先查抄蓝牙是否已启用,如果是,则调用 BtAdapter.disable() 方法来禁用蓝牙。


蓝牙状态

   getBlueToothStatus() 方法:用于获取当前蓝牙的状态(启用或禁用)。它使用 assert 语句来确保 BtAdapter 不为 null(尽管在构造函数中已经进行了初始化,但这是一个好风俗以增强代码的结实性)。然后,它返回 BtAdapter.isEnabled() 的结果,该结果指示蓝牙是否已启用。

蓝牙列表

   getBondedDeviceList() 方法:这个方法用于获取与设备配对的所有蓝牙设备列表。它调用 BtAdapter.getBondedDevices() 来获取一个 Set<BluetoothDevice> 聚集,然后将其转换为一个 ArrayList<BluetoothDevice> 以便更灵活地操作。这个列表包罗了所有已配对的蓝牙设备信息。
   find_device 方法用于在蓝牙适配器 (BtAdapter) 中查找具有指定地址 (addr) 的蓝牙设备。它通过调用 BluetoothAdapter 的 getRemoteDevice(String address) 方法来实现这一点,该方法返回一个代表指定蓝牙地址的 BluetoothDevice 对象(如果找到的话),大概在没有找到匹配设备时返回 null。

动态申请权限


实机演示




完整代码

BlueTooth.java

  1. package com.example.login.BlueTooth;
  2. import android.Manifest;
  3. import android.annotation.SuppressLint;
  4. import android.app.Activity;
  5. import android.bluetooth.BluetoothAdapter;
  6. import android.bluetooth.BluetoothDevice;
  7. import android.content.Intent;
  8. import android.os.Build;
  9. import android.os.Bundle;
  10. import android.view.View;
  11. import android.widget.AdapterView;
  12. import android.widget.ArrayAdapter;
  13. import android.widget.Button;
  14. import android.widget.ListView;
  15. import android.widget.TextView;
  16. import android.widget.Toast;
  17. import androidx.appcompat.app.AppCompatActivity;
  18. import androidx.core.app.ActivityCompat;
  19. import com.example.login.R;
  20. import java.util.ArrayList;
  21. @SuppressLint("Registered")
  22. public class BlueToothActivity extends AppCompatActivity {
  23.     // 实例化蓝牙控制器
  24.     public BlueToothController btController = new BlueToothController();
  25.     // 蓝牙权限列表
  26.     public ArrayList<String> requestList = new ArrayList<>();
  27.     // 弹窗
  28.     private Toast mToast;
  29.     public ArrayAdapter adapter1;
  30.     //定义一个列表,存蓝牙设备地址,用于显示。
  31.     public ArrayList<String> device = new ArrayList<>();
  32.     @Override
  33.     protected void onCreate(Bundle savedInstanceState) {
  34.         super.onCreate(savedInstanceState);
  35.         setContentView(R.layout.activity_bluetooth);
  36.         // 获取ListView组件
  37.         ListView listView = (ListView) findViewById(R.id.listView1);
  38.         // 实例化ArrayAdapter对象
  39.         adapter1 = new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1, device);
  40.         // 添加到ListView组件中
  41.         listView.setAdapter(adapter1);
  42.         //ListView的列表点击事件
  43.         listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  44.             @SuppressLint("MissingPermission")
  45.             @Override
  46.             public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
  47.                 CharSequence content = ((TextView) view).getText();
  48.                 //获取蓝牙的名称的地址
  49.                 String con = content.toString();
  50.                 //已换行为切割
  51.                 String[] conArray = con.split("\n");
  52.                 //获取蓝牙地址
  53.                 String rightStr = conArray[1].substring(5,conArray[1].length());
  54.                 BluetoothDevice device1 = btController.find_device(rightStr);
  55.                 if (device1.getBondState() == 12){
  56.                     String S = "设备名:" + device1.getName() + "\n" + "设备地址:" + device1.getAddress();
  57.                     if (device.contains(S)){
  58.                         Intent intent = new Intent(BlueToothActivity.this, DataActivity.class);
  59.                         Bundle bundle = new Bundle();
  60.                         bundle.putString("deviceAddr",device1.getAddress());
  61.                         intent.putExtras(bundle);
  62.                         startActivity(intent);
  63.                         finish();
  64.                     }
  65.                 }
  66.             }
  67.         });
  68.         Button open_Bt = (Button) findViewById(R.id.openBT);
  69.         open_Bt.setOnClickListener(new View.OnClickListener() {
  70.             @Override
  71.             public void onClick(View view) {
  72.                 turnOnBt();
  73.             }
  74.         });
  75.         Button close_Bt = (Button) findViewById(R.id.closeBT);
  76.         close_Bt.setOnClickListener(new View.OnClickListener() {
  77.             @Override
  78.             public void onClick(View view) {
  79.                 getPermision();
  80.                 // 关闭蓝牙
  81.                 btController.turnOffBlueTooth();
  82.             }
  83.         });
  84.         Button state_Bt = (Button) findViewById(R.id.stateBT);
  85.         state_Bt.setOnClickListener(new View.OnClickListener() {
  86.             @Override
  87.             public void onClick(View view) {
  88.                 getPermision();
  89.                 // 判断当前蓝牙状态
  90.                 boolean ret = btController.getBlueToothStatus();
  91.                 // 弹窗显示结果
  92.                 showToast("当前蓝牙状态:" + ret);
  93.             }
  94.         });
  95.         Button update_list = (Button) findViewById(R.id.updateList);
  96.         update_list.setOnClickListener(new View.OnClickListener() {
  97.             @SuppressLint("MissingPermission")
  98.             @Override
  99.             public void onClick(View view) {
  100.                 getPermision();
  101.                 //初始化列表
  102.                 device.clear();
  103.                 adapter1.notifyDataSetChanged();
  104.                 //获取已绑定蓝牙列表
  105.                 ArrayList<BluetoothDevice> bluetoothDevices = btController.getBondedDeviceList();
  106.                 //更新列表、
  107.                 for (int i=0;i<bluetoothDevices.size();i++){
  108.                     BluetoothDevice device1 = bluetoothDevices.get(i);
  109.                     if (device1.getBondState() == 12){
  110.                         device.add("设备名:" + device1.getName() + "\n" + "设备地址:" + device1.getAddress());
  111.                     }else {
  112.                         device.add("设备名:" + device1.getName() + "\n" + "设备地址:" + device1.getAddress() + "\n" + "连接状态:未知" + "\n");
  113.                     }
  114.                     adapter1.notifyDataSetChanged();
  115.                 }
  116.             }
  117.         });
  118.     }
  119.     public static class BlueToothController{
  120.         private BluetoothAdapter BtAdapter;
  121.       
  122.         public BlueToothController() {
  123.             // 获取本地的蓝牙适配器
  124.             BtAdapter = BluetoothAdapter.getDefaultAdapter();
  125.         }
  126.         @SuppressLint("MissingPermission")
  127.         //打开蓝牙
  128.         public void turnOnBlueTooth(Activity activity, int requestCode){
  129.             if (!BtAdapter.isEnabled()){
  130.                 Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
  131.                 activity.startActivityForResult(intent,requestCode);
  132.             }
  133.         }
  134.         @SuppressLint("MissingPermission")
  135.         //关闭蓝牙
  136.         public void turnOffBlueTooth(){
  137.             if (BtAdapter.isEnabled()) {
  138.                BtAdapter.disable();
  139.            }
  140.         }
  141.         //获取蓝牙状态
  142.         public boolean getBlueToothStatus() {
  143.             // 断言,避免BtAdapter为bull导致return出错
  144.             assert (BtAdapter != null);
  145.             // 蓝牙状态
  146.             return BtAdapter.isEnabled();
  147.         }
  148.         @SuppressLint("MissingPermission")
  149.         //获取设备信息
  150.         public ArrayList<BluetoothDevice> getBondedDeviceList() {
  151.             return new ArrayList<BluetoothDevice>(BtAdapter.getBondedDevices());
  152.         }
  153.          //根据蓝牙地址找到相应的设备
  154.         public BluetoothDevice find_device(String addr) {
  155.             return BtAdapter.getRemoteDevice(addr);
  156.         }
  157.     }
  158.     public void turnOnBt(){
  159.         getPermision();
  160.         //打开蓝牙
  161.         btController.turnOnBlueTooth(this,1);
  162.     }
  163.     public void getPermision(){
  164.         if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S){
  165.             requestList.add(Manifest.permission.BLUETOOTH_SCAN);
  166.             requestList.add(Manifest.permission.BLUETOOTH_ADVERTISE);
  167.             requestList.add(Manifest.permission.BLUETOOTH_CONNECT);
  168.             requestList.add(Manifest.permission.ACCESS_FINE_LOCATION);
  169.             requestList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
  170.             requestList.add(Manifest.permission.BLUETOOTH);
  171.         }
  172.         if(requestList.size() != 0){
  173.             ActivityCompat.requestPermissions(this, requestList.toArray(new String[0]), 1);
  174.         }
  175.     }
  176.    
  177.     public void showToast(String text){
  178.         // 若Toast控件未初始化
  179.         if( mToast == null){
  180.             // 则初始化
  181.             mToast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
  182.         }
  183.         // 否则
  184.         else{
  185.             // 修改显示文本
  186.             mToast.setText(text);
  187.         }
  188.         // 显示
  189.         mToast.show();
  190.     }}
复制代码
activity_bluetooth.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     android:background="@drawable/background1"
  8.     tools:context=".BlueTooth.BlueToothActivity">
  9.     <androidx.constraintlayout.widget.Guideline
  10.         android:id="@+id/guideline1"
  11.         android:layout_width="wrap_content"
  12.         android:layout_height="wrap_content"
  13.         android:layout_marginBottom="136dp"
  14.         android:orientation="vertical"
  15.         app:layout_constraintBottom_toTopOf="@+id/listView1"
  16.         app:layout_constraintGuide_end="206dp"
  17.         app:layout_constraintTop_toTopOf="parent" />
  18.     <Button
  19.         android:id="@+id/openBT"
  20.         android:layout_width="wrap_content"
  21.         android:layout_height="wrap_content"
  22.         android:layout_marginTop="16dp"
  23.         android:text="打开蓝牙"
  24.         app:layout_constraintBottom_toTopOf="@+id/stateBT"
  25.         app:layout_constraintEnd_toStartOf="@id/guideline1"
  26.         app:layout_constraintHorizontal_bias="0.567"
  27.         app:layout_constraintStart_toStartOf="parent"
  28.         app:layout_constraintTop_toTopOf="parent" />
  29.     <Button
  30.         android:id="@+id/closeBT"
  31.         android:layout_width="wrap_content"
  32.         android:layout_height="wrap_content"
  33.         android:layout_marginTop="16dp"
  34.         android:text="关闭蓝牙"
  35.         app:layout_constraintEnd_toEndOf="parent"
  36.         app:layout_constraintHorizontal_bias="0.473"
  37.         app:layout_constraintStart_toEndOf="@id/guideline1"
  38.         app:layout_constraintTop_toTopOf="parent" />
  39.     <Button
  40.         android:id="@+id/stateBT"
  41.         android:layout_width="wrap_content"
  42.         android:layout_height="wrap_content"
  43.         android:text="蓝牙状态"
  44.         app:layout_constraintEnd_toStartOf="@id/guideline1"
  45.         app:layout_constraintHorizontal_bias="0.567"
  46.         app:layout_constraintStart_toStartOf="parent"
  47.         app:layout_constraintTop_toBottomOf="@id/openBT" />
  48.     <Button
  49.         android:id="@+id/updateList"
  50.         android:layout_width="wrap_content"
  51.         android:layout_height="wrap_content"
  52.         android:text="更新列表"
  53.         app:layout_constraintEnd_toEndOf="parent"
  54.         app:layout_constraintHorizontal_bias="0.473"
  55.         app:layout_constraintStart_toEndOf="@id/guideline1"
  56.         app:layout_constraintTop_toBottomOf="@id/closeBT" />
  57.    
  58.     <TextView
  59.         android:id="@+id/textView1"
  60.         android:layout_width="307dp"
  61.         android:layout_height="46dp"
  62.         android:layout_marginTop="92dp"
  63.         android:background="#2196F3"
  64.         android:gravity="center"
  65.         android:text="蓝牙列表"
  66.         android:textSize="24dp"
  67.         app:layout_constraintEnd_toEndOf="parent"
  68.         app:layout_constraintHorizontal_bias="0.495"
  69.         app:layout_constraintStart_toStartOf="parent"
  70.         app:layout_constraintTop_toBottomOf="@id/stateBT" />
  71.     <ListView
  72.         android:id="@+id/listView1"
  73.         android:layout_width="332dp"
  74.         android:layout_height="350dp"
  75.         android:layout_marginTop="8dp"
  76.         app:layout_constraintBottom_toBottomOf="parent"
  77.         app:layout_constraintEnd_toEndOf="parent"
  78.         app:layout_constraintHorizontal_bias="0.491"
  79.         app:layout_constraintStart_toStartOf="parent"
  80.         app:layout_constraintTop_toBottomOf="@id/textView1"
  81.         app:layout_constraintVertical_bias="0.316" />
  82. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

何小豆儿在此

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表