如何进行App蓝牙开发?教程详解!

App蓝牙开发教程

app蓝牙开发教程

蓝牙技术在物联网和移动应用中扮演着至关重要的角色,本文将详细介绍如何在Android平台上进行蓝牙开发,包括UI界面设计、蓝牙搜索与配对连接以及蓝牙通信的实现,通过本文,你将掌握从基础到高级的蓝牙开发技能,能够独立完成一个蓝牙聊天应用的开发。

一、UI界面设计

1. 布局文件(activity_main.xml)

在app/src/main/res/layout目录下创建或修改布局文件activity_main.xml,使用ConstraintLayout进行界面设计:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/buttonCheckBluetooth"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="是否支持蓝牙"
        app:layout_constraintEnd_toStartOf="@+id/guideline2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <Button
        android:id="@+id/buttonBluetoothState"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="当前蓝牙状态"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="@+id/guideline2"
        app:layout_constraintTop_toTopOf="parent" />
    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_begin="205dp" />
    <Button
        android:id="@+id/buttonTurnOnBluetooth"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="打开蓝牙"
        app:layout_constraintEnd_toStartOf="@+id/guideline2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/buttonCheckBluetooth" />
    <Button
        android:id="@+id/buttonTurnOffBluetooth"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="关闭蓝牙"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="@+id/guideline2"
        app:layout_constraintTop_toBottomOf="@+id/buttonBluetoothState" />
    <Button
        android:id="@+id/buttonDiscoverable"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="使蓝牙可见"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/buttonTurnOnBluetooth" />
    <Button
        android:id="@+id/buttonFindDevices"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="搜索设备"
        app:layout_constraintEnd_toStartOf="@+id/guideline2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/buttonTurnOffBluetooth" />
    <ListView
        android:id="@+id/listViewDevices"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/buttonDiscoverable"
        app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

2. MainActivity.java代码

在MainActivity.java中实现按钮点击事件和列表视图的数据绑定:

package com.example.bluetoothchat;
import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.Set;
public class MainActivity extends AppCompatActivity {
    private BluetoothAdapter mBluetoothAdapter;
    private ArrayAdapter<String> mPairedDevicesArrayAdapter;
    private ArrayList<String> mDeviceList = new ArrayList<>();
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button buttonCheckBluetooth = findViewById(R.id.buttonCheckBluetooth);
        Button buttonBluetoothState = findViewById(R.id.buttonBluetoothState);
        Button buttonTurnOnBluetooth = findViewById(R.id.buttonTurnOnBluetooth);
        Button buttonTurnOffBluetooth = findViewById(R.id.buttonTurnOffBluetooth);
        Button buttonDiscoverable = findViewById(R.id.buttonDiscoverable);
        Button buttonFindDevices = findViewById(R.id.buttonFindDevices);
        ListView listViewDevices = findViewById(R.id.listViewDevices);
        mPairedDevicesArrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mDeviceList);
        listViewDevices.setAdapter(mPairedDevicesArrayAdapter);
        // 检查设备是否支持蓝牙
        buttonCheckBluetooth.setOnClickListener(v -> {
            mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
            if (mBluetoothAdapter == null) {
                Toast.makeText(this, "当前设备不支持蓝牙功能", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "设备支持蓝牙功能", Toast.LENGTH_SHORT).show();
            }
        });
        // 获取当前蓝牙状态
        buttonBluetoothState.setOnClickListener(v -> {
            if (mBluetoothAdapter != null) {
                if (mBluetoothAdapter.isEnabled()) {
                    Toast.makeText(this, "蓝牙已开启", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "蓝牙已关闭", Toast.LENGTH_SHORT).show();
                }
            } else {
                Toast.makeText(this, "设备不支持蓝牙功能", Toast.LENGTH_SHORT).show();
            }
        });
        // 打开蓝牙
        buttonTurnOnBluetooth.setOnClickListener(v -> {
            if (mBluetoothAdapter != null && !mBluetoothAdapter.isEnabled()) {
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, 1);
            }
        });
        // 关闭蓝牙
        buttonTurnOffBluetooth.setOnClickListener(v -> {
            if (mBluetoothAdapter != null) {
                mBluetoothAdapter.disable();
                Toast.makeText(this, "蓝牙已关闭", Toast.LENGTH_SHORT).show();
            }
        });
        // 使设备可发现
        buttonDiscoverable.setOnClickListener(v -> {
            if (mBluetoothAdapter != null && !mBluetoothAdapter.isDiscovering()) {
                Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
                discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
                startActivity(discoverableIntent);
                Toast.makeText(this, "设备可被发现", Toast.LENGTH_SHORT).show();
            }
        });
        // 搜索设备
        buttonFindDevices.setOnClickListener(v -> {
            if (mBluetoothAdapter != null) {
                mBluetoothAdapter.startDiscovery();
                IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
                registerReceiver(mReceiver, filter);
                Toast.makeText(this, "开始搜索设备...", Toast.LENGTH_SHORT).show();
            }
        });
    }
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                String deviceName = device.getName() + "
" + device.getAddress();
                mDeviceList.add(deviceName);
                mPairedDevicesArrayAdapter.notifyDataSetChanged();
            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
                Toast.makeText(context, "搜索结束", Toast.LENGTH_SHORT).show();
                unregisterReceiver(this);
            }
        }
    };
}

二、蓝牙搜索与配对连接

1. 添加权限和特性声明(AndroidManifest.xml

在使用蓝牙功能之前,需要在AndroidManifest.xml中声明相关权限和特性:

app蓝牙开发教程

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

2. Constant.java文件内容如下:

package com.example.wyb.btw3.connect;
/**
 * Created by WYB on 2023/4/24.
 */
public class Constant {
    public static final String CONNECTTION_UUID = "00001101-0000-1000-8000-00805F9B34FB";
    /**
     * 开始监听
     */
    public static final int MSG_START_LISTENING = 1;
    /**
     * 结束监听
     */
    public static final int MSG_FINISH_LISTENING = 2;
    /**
     * 有客户端连接
     */
    public static final int MSG_GOT_A_CLINET = 3;
    /**
     * 连接到服务器
     */
    public static final int MSG_CONNECTED_TO_SERVER = 4;
    /**
     * 获取到数据
     */
    public static final int MSG_GOT_DATA = 5;
    /**
     * 出错
     */
    public static final int MSG_ERROR = -1;}

3. BluetoothController.java文件内容如下:

package com.example.wyb.btw3;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by WYB on 2023/4/24.
 */
public class BlueToothController {
    private BluetoothAdapter mAdapter;
    public BlueToothController(){
        mAdapter = BluetoothAdapter.getDefaultAdapter();
    }/*打开蓝牙设备*/public void turnOnBlueTooth(Activity activity, int requestCode){Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);activity.startActivityForResult(intent, requestCode);}/*查找未绑定的蓝牙设备*/public void findDevice(){assert (mAdapter!=null);mAdapter.startDiscovery();}/*查看已绑定的蓝牙设备*/public List<BluetoothDevice> getBondedDeviceList(){return new ArrayList<>(mAdapter.getBondedDevices());}}```

各位小伙伴们,我刚刚为大家分享了有关“app蓝牙开发教程”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/686533.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2024-11-28 23:55
Next 2024-11-29 00:00

相关推荐

  • 如何开发支持蓝牙功能的Android应用?

    如何使用蓝牙开发Android应用程序?一、概述在现代移动设备中,蓝牙技术已经成为一种重要的无线通信手段,Android操作系统提供了丰富的API支持,使得开发者能够轻松地在应用中集成蓝牙功能,本文将详细介绍如何在Android平台上使用蓝牙技术开发应用程序,包括基本概念、权限设置、主要API的使用以及具体实现……

    2024-11-24
    02
  • App网络权限究竟是什么含义?

    什么是App网络权限?一、App网络权限的定义与作用App网络权限是指应用程序访问互联网并执行各种网络操作的权限,它允许应用程序发送和接收数据、访问网络资源、进行远程通信等,这一权限在现代智能手机应用中至关重要,因为许多功能和服务都需要联网才能实现,如在线浏览、社交媒体互动、实时通讯、云存储同步等,二、如何检查……

    2024-11-28
    02
  • 如何在Android设备上开启网络权限?

    Android开启网络权限在现代移动应用开发中,网络访问权限是至关重要的一环,Android操作系统通过权限机制来控制应用程序对设备资源的访问,包括网络资源,本文将详细介绍如何在Android应用中开启网络权限,包括其必要性、实现方法以及一些常见问题的解决方案,一、网络权限的必要性网络权限允许应用程序通过互联网……

    2024-11-03
    022
  • 如何编写Android代码来接收短信?

    Android收短信代码在Android开发中,接收短信是一项常见的功能,本文将详细介绍如何在Android应用中实现接收短信的功能,包括权限申请、广播接收器、以及如何处理收到的短信, 权限申请要在Android应用中接收短信,首先需要在AndroidManifest.xml文件中声明所需的权限:<use……

    2024-11-05
    06
  • Android设备如何实现开机自启动应用?——一份详细示例分享

    Android 开机自启动App示例分享在Android设备上,实现应用的开机自启动是一项常见需求,本文将详细介绍如何通过编程实现这一功能,并提供相应的代码示例和注意事项,一、什么是开机自启动?开机自启动指的是当Android设备重新启动时,某个应用能够自动启动并运行特定的任务或服务,这通常用于需要持续后台运行……

    2024-11-03
    018
  • android_activity_

    Android_activity_是Android开发中的一个基本组件,用于表示应用程序中的一个屏幕或页面。

    2024-06-08
    056

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入