HomeActivity.java和activity_home.xml

一、HomeActivity.java

java 复制代码
public class HomeActivity extends AppCompatActivity {
    private static final String TAG = "Bluetooth";
    private BluetoothGatt bluetoothGatt;
    private DeviceAdapter mAdapter1;
    private TextView textView1;
    private ActivityResultLauncher<Intent> activityLauncher;
    private final List<DeviceClass> mbondDeviceList = new ArrayList<>();//搜索到的所有已绑定设备保存为列表 
    // 服务UUID、特征UUID和描述符UUID
    private final UUID serviceUUID = UUID.fromString("0000ff01-0000-1000-8000-00805f9b34fb");
    private final UUID characteristicUUID = UUID.fromString("0000ff02-0000-1000-8000-00805f9b34fb");

    private final UUID descriptorUUID = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");

    @SuppressLint("MissingPermission")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        EdgeToEdge.enable(this);
        changeActionBar();
        setContentView(R.layout.activity_home);
//        show_bondDevice();
        ImageView imageViewConnect = findViewById(R.id.connect);
        imageViewConnect.setOnClickListener(v -> goToNextActivity());
        mAdapter1 = new DeviceAdapter(HomeActivity.this, R.layout.device_item, mbondDeviceList);
        ListView listView1 = findViewById(R.id.listview1);
        listView1.setAdapter(mAdapter1);
        mAdapter1.notifyDataSetChanged();
        textView1 = findViewById(R.id.textView2);


        Button button2 = findViewById(R.id.button2);
        button2.setOnClickListener(v -> send_bond());
        Button button3 = findViewById(R.id.button3);
        button3.setOnClickListener(v -> close_bond());
        activityLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    Log.v(TAG, ".... ---");
                    if (result.getResultCode() == Discoverydevice.RESULT_OK) {
                        // 从 Intent 中获取蓝牙名称
                        Intent data = result.getData();
                        if (data != null) {
                            String bluetoothName = data.getStringExtra("bluetoothName");
                            String bluetoothAddress = data.getStringExtra("bluetoothAddress");


                            Log.v(TAG, "....bluetoothName--接收-" + bluetoothName + "------" + bluetoothAddress);
                            mbondDeviceList.clear();
                            mbondDeviceList.add(new DeviceClass(bluetoothName, bluetoothAddress));
                            mAdapter1.notifyDataSetChanged();
                            textView1.setText("已连接设备");

                            BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
                            BluetoothDevice device = bluetoothAdapter.getRemoteDevice(bluetoothAddress);
                            bluetoothGatt = device.connectGatt(this, false, gattCallback);
                            Log.e(TAG, "device: " + device);
                            bluetoothGatt.discoverServices();
                            // 在这里使用蓝牙名称进行进一步处理,例如更新 UI
                        } else {
                            // 没有返回数据的情况,您可以在这里处理失败的逻辑
                            Log.e(TAG, "....连接失败,未返回数据");
                        }
                    } else {
                        // 连接未成功的情况,您可以在这里处理失败的逻辑
                        Log.e(TAG, "....连接失败");
                    }
                });
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
    }
    private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
        @SuppressLint("MissingPermission")
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                // 连接成功
                bluetoothGatt.discoverServices(); // 发现设备的服务
                Log.v(TAG, "连接成功");
                // 停止扫描
                stopDevice();
                String bluetoothName = gatt.getDevice().getName();
                String bluetoothAddress = gatt.getDevice().getAddress();
                Log.v(TAG, "bluetoothName" + bluetoothName);
                if (bluetoothName != null && bluetoothAddress != null) {
                    Log.v(TAG, " ---" + bluetoothName);
                }


            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                // 连接断开
                Log.v(TAG, ".连接断开");
            }
        }

        @SuppressLint("MissingPermission")
        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            // 发现服务后,可以设置通知
            if (status == BluetoothGatt.GATT_SUCCESS) {
                for (BluetoothGattService bluetoothGattService : gatt.getServices()) {
                    // 我们可以遍历到该蓝牙设备的全部Service对象。然后通过比较Service的UUID,我们可以区分该服务是属于什么业务的
                    Log.d(TAG, "Service_UUID" + bluetoothGattService.getUuid());
                    if (serviceUUID.equals(bluetoothGattService.getUuid())) {
                        for (BluetoothGattCharacteristic characteristic : bluetoothGattService.getCharacteristics()) {
                            BluetoothGattCharacteristic service = gatt.getService(serviceUUID).getCharacteristic(characteristicUUID);
                            if (service != null) { // 添加空值检查
                                gatt.setCharacteristicNotification(service, true);
                                BluetoothGattDescriptor descriptor = characteristic.getDescriptor(descriptorUUID);
                                if (descriptor != null) { // 添加空值检查
                                    descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
                                    gatt.writeDescriptor(descriptor);
                                } else {
                                    Log.e(TAG, "Descriptor not found for characteristic: " + characteristic.getUuid());
                                }
                            } else {
                                Log.e(TAG, "Characteristic not found for UUID: " + characteristicUUID);
                            }
                        }
                        return;//结束循环操作
                    }
                }
            } else {
                Log.e(TAG, "onServicesDiscovered received: " + status);
            }
        }

        @SuppressLint("MissingPermission")
        @Override
        public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
            // 描述符写入成功,现在可以读取特征值
            if (status == BluetoothGatt.GATT_SUCCESS) {
                // 描述符写入成功,现在可以读取特征值
                BluetoothGattCharacteristic characteristic = descriptor.getCharacteristic();
                gatt.readCharacteristic(characteristic);
                Log.v(TAG, " 读取特征值:");

            } else {
                Log.v(TAG, "Descriptor write error: " + status);
            }

        }

        @Override
        public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            // 读取特征值成功
            // 读取特征值后的处理逻辑
            if (status == BluetoothGatt.GATT_SUCCESS) {
                // 读取特征值成功
                byte[] data = characteristic.getValue();
                String dataStr = byteArrayToHexString(data);
                Log.v(TAG, " 读取特征值:" + dataStr);

            } else {
                Log.e(TAG, "Characteristic read error: " + status);
            }
        }

        private String byteArrayToHexString(byte[] bytes) {
            StringBuilder sb = new StringBuilder();
            for (byte b : bytes) {
                sb.append(String.format("%02X", b));
            }
            return sb.toString();
        }

        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            // 特征值变化通知的处理逻辑
            byte[] data = characteristic.getValue();
            String dataStr = byteArrayToHexString(data);
            Log.v(TAG, " 通知:" + dataStr);
        }

        @SuppressLint("MissingPermission")
        @Override
        public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                // 特征值写入成功
                Log.v(TAG, "特征值写入成功");
//                showToast("特征值写入成功");
            } else {
                Log.v(TAG, "特征值写入error");
            }
        }
    };

    // 开启
    @SuppressLint("MissingPermission")
    private void send_bond() {
        Log.v(TAG, "发送信息");
        // 检查是否连接成功
        if (bluetoothGatt == null) {
            Log.v(TAG, "未连接到蓝牙设备");
            return;
        }
        // 获取要发送的数据
        // 将字符 'A' 转换为十六进制字符串
        String message = "A";
        String hexMessage = ToHex.stringToHex(message);
        // 将十六进制字符串转换为字节数组
        byte[] bytes = ToHex.hexStringToByteArray(hexMessage);
        ToHex.byteArrayToHexString(bytes);
        // 获取对应的特征
        BluetoothGattService service = bluetoothGatt.getService(serviceUUID);
        if (service == null) {
            Log.v(TAG, "service == null");
            return;
        }
        BluetoothGattCharacteristic characteristic = service.getCharacteristic(characteristicUUID);
        if (characteristic == null) {
            Log.v(TAG, "characteristic == null");
            return;
        }
        // 设置要发送的数据  将字节数组发送到蓝牙设备
        characteristic.setValue(bytes);
        // 发送数据
        bluetoothGatt.writeCharacteristic(characteristic);
    }
    // 关闭
    @SuppressLint("MissingPermission")
    private void close_bond() {
        // 检查是否连接成功
        if (bluetoothGatt == null) {
            Log.v(TAG, "未连接到蓝牙设备");
            return;
        }
        // 获取要发送的数据
        // 将字符 'A' 转换为十六进制字符串
        String message = "B";
        String hexMessage = ToHex.stringToHex(message);
        // 将十六进制字符串转换为字节数组
        byte[] bytes = ToHex.hexStringToByteArray(hexMessage);
        ToHex.byteArrayToHexString(bytes);
        // 获取对应的特征
        BluetoothGattService service = bluetoothGatt.getService(serviceUUID);
        if (service == null) {
            Log.v(TAG, "service == null");
            return;
        }
        BluetoothGattCharacteristic characteristic = service.getCharacteristic(characteristicUUID);
        if (characteristic == null) {
            Log.v(TAG, "characteristic == null");
            return;
        }
        // 设置要发送的数据  将字节数组发送到蓝牙设备
        characteristic.setValue(bytes);
        // 发送数据
        bluetoothGatt.writeCharacteristic(characteristic);
    }

    // 停止扫描
    @SuppressLint("MissingPermission")
    public void stopDevice() {
        BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (bluetoothAdapter != null && bluetoothAdapter.isDiscovering()) {
            bluetoothAdapter.cancelDiscovery();
            Log.d(TAG, "Bluetooth scan stopped");
        } else {
            Log.d(TAG, "Bluetooth is not currently scanning");
        }
    }


    public void goToNextActivity() {
        Intent intent = new Intent(HomeActivity.this, Discoverydevice.class);
        activityLauncher.launch(intent);
    }

    // 设置修改 ActionBar 的标题 背景颜色
    public void changeActionBar() {
        // 获取 ActionBar 对象
        ActionBar actionBar = getSupportActionBar();
        // 设置要显示的标题字符串
        String title = "TableLayout(表格布局)";
        // 调用自定义方法设置 ActionBar
        ActivityUtils.setupCustomActionBar(actionBar, this, title, "#A9CAFE");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        bluetoothGatt = null;
    }

}

二、activity_home.xml

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".HomeActivity"
    tools:ignore="Orientation">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="32dp">
            <ImageView
                android:id="@+id/connect"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:layout_gravity="center"
                android:background="@drawable/close" />
        </FrameLayout>

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="Bluetooth" />

        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="32dp"
            android:gravity="center">

            <ImageView
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:layout_gravity="center"
                android:background="@drawable/disconnect" />
        </FrameLayout>
    </LinearLayout>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="未连接设备" />

    <ListView
        android:id="@+id/listview1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:background="@drawable/listview_style1" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1">

            <android.widget.Button
                android:id="@+id/button2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:background="@drawable/button_color"
                android:text="开启"
                android:textColor="#000000" />
        </FrameLayout>

        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1">

            <android.widget.Button
                android:id="@+id/button3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/buttom_dis"
                android:text="关闭"
                android:textColor="#000000" />
        </FrameLayout>
    </LinearLayout>
</LinearLayout>
相关推荐
Amarantine、沐风倩✨24 分钟前
设计一个监控摄像头物联网IOT(webRTC、音视频、文件存储)
java·物联网·音视频·webrtc·html5·视频编解码·七牛云存储
路在脚下@1 小时前
spring boot的配置文件属性注入到类的静态属性
java·spring boot·sql
森屿Serien1 小时前
Spring Boot常用注解
java·spring boot·后端
苹果醋33 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
Hello.Reader3 小时前
深入解析 Apache APISIX
java·apache
菠萝蚊鸭3 小时前
Dhatim FastExcel 读写 Excel 文件
java·excel·fastexcel
旭东怪3 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
007php0073 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
∝请叫*我简单先生4 小时前
java如何使用poi-tl在word模板里渲染多张图片
java·后端·poi-tl
ssr——ssss4 小时前
SSM-期末项目 - 基于SSM的宠物信息管理系统
java·ssm