Android学习笔记之蓝牙功能

 更新时间:2022年09月20日 12:09:36   作者:RKGG爱吃鱼  
这篇文章主要为大家详细介绍了Android学习笔记之蓝牙功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

本文实例为大家分享了Android学习笔记之蓝牙功能的具体代码,供大家参考,具体内容如下

蓝牙:短距离无线通讯技术标准。蓝牙协议分为4层,即核心协议层、电缆替代协议层、电话控制协议层和其他协议层。其中核心协议层包括基带、链路管理、逻辑链路控制和适应协议四部分。链路管理(LMP)负责蓝牙组件间的建立。逻辑链路控制与适应协议(L2CAP)位于基带协议层上,属于数据链路层,是一个高层传输和应用层协议屏蔽基带协议的适配协议。

1)、第一种打开蓝牙的方式:

Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
?startActivityForResult(enableIntent,1);

2)、第二种打开蓝牙方式(静默)

权限配置:

<uses-permission android:name=”android.permission.BLUETOOTH”/>
? <uses-permission android:name=”android.permission.BLUETOOTH_ADMIN”/>

BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
adapter.enable();//打开
adapter.disable();//关闭

3)、通过代码搜索蓝牙

蓝牙数据传输:与Socket类似,网络中使用Socket和ServerSocket控制客户端和服务端,蓝牙通讯客户端为BluetoothSocket,服务端为BluetoothServerSocket。二者需要一个UUID(全局唯一标示符),格式如下:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX,被分为5段,其中3段字符数相同,都为4,第1段是8字符,最后一段12字符,UUID相当于Socket的端口,而蓝牙地址相当于Socket的IP。

一、搜索蓝牙设备

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.TextView;
import java.util.Set;
?
public class MainActivity extends AppCompatActivity {
?
? ? private BluetoothAdapter bluetoothAdapter;
? ? private TextView tvDevices;
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? tvDevices = (TextView) findViewById(R.id.tvDevices);
? ? ? ? bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
? ? ? ? Set<BluetoothDevice> paireDevices = bluetoothAdapter.getBondedDevices();
? ? ? ? if (paireDevices.size()>0){
? ? ? ? ? ? for (BluetoothDevice devices:paireDevices){
? ? ? ? ? ? ? ? tvDevices.append(devices.getName()+":"+devices.getAddress());
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);//找到一个设备,发送一个广播
? ? ? ? this.registerReceiver(receiver,filter);
?
? ? ? ? filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//整个搜索完后发送广播
? ? ? ? this.registerReceiver(receiver,filter);
? ? }
? ? public void onClick_Search(View view){
? ? ? ? setProgressBarIndeterminateVisibility(true);
? ? ? ? setTitle("正在扫描...");
? ? ? ? if(bluetoothAdapter.isDiscovering()){
? ? ? ? ? ? bluetoothAdapter.cancelDiscovery();
? ? ? ? }
? ? ? ? bluetoothAdapter.startDiscovery();
? ? }
? ? private final BroadcastReceiver receiver = new BroadcastReceiver() {
? ? ? ? @Override
? ? ? ? public void onReceive(Context context, Intent intent) {
? ? ? ? ? ? String action = intent.getAction();
? ? ? ? ? ? if (BluetoothDevice.ACTION_FOUND.equals(action)) {
? ? ? ? ? ? ? ? BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
? ? ? ? ? ? ? ? if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
? ? ? ? ? ? ? ? ? ? tvDevices.append(device.getName() + ":" + device.getAddress() + "\n");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
? ? ? ? ? ? ? ? setProgressBarVisibility(false);
? ? ? ? ? ? ? ? setTitle("搜索完成");
? ? ? ? ? ? }
? ? ? ? }
? ? };
}

真机测试效果图:

二、通过搜索,将搜到的设备连接并实现传输数据

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;
?
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {
? ? private BluetoothAdapter bluetoothAdapter;//蓝牙适配器
? ? private ListView lvDevices;//显示蓝牙搜索控件
? ? private List<String> bluetoothDevices = new ArrayList<String>();//存储搜索到的所有蓝牙设备
? ? private ArrayAdapter<String> arrayAdapter;
? ? private final UUID MY_UUID = UUID.fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3");//手动输入UUID码
? ? private final String NAME = "Bluetooth_Socket";
? ? private BluetoothSocket clientSocket;//服务端
? ? private BluetoothDevice device;
? ? private OutputStream os;
? ? private AcceptThread acceptThread;
?
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//初始化
? ? ? ? lvDevices = (ListView) findViewById(R.id.lvDevices);
?
??? ?//显示配对的蓝牙信息
? ? ? ? Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
? ? ? ? if (pairedDevices.size() > 0) {
? ? ? ? ? ? for (BluetoothDevice device : pairedDevices) {
? ? ? ? ? ? ? ? bluetoothDevices.add(device.getName() + ":" + device.getAddress() + "\n");
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //显示设备在列表上
? ? ? ? arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
? ? ? ? ? ? ? ? android.R.id.text1, bluetoothDevices);
? ? ? ? lvDevices.setAdapter(arrayAdapter);
? ? ? ? lvDevices.setOnItemClickListener(this);
? ? ? ? acceptThread = new AcceptThread();
? ? ? ? acceptThread.start();
? ? }
?
? ? public void onClick_Search(View view) {
? ? ? ? setProgressBarIndeterminateVisibility(true);
? ? ? ? setTitle("正在扫描...");
? ? ? ? if (bluetoothAdapter.isDiscovering()) {
? ? ? ? ? ? bluetoothAdapter.cancelDiscovery();
? ? ? ? }
? ? ? ? bluetoothAdapter.startDiscovery();
? ? }
?
? ? private final BroadcastReceiver receiver = new BroadcastReceiver() {
? ? ? ? @Override
? ? ? ? public void onReceive(Context context, Intent intent) {
? ? ? ? ? ? String action = intent.getAction();
? ? ? ? ? ? if (BluetoothDevice.ACTION_FOUND.equals(action)) {
? ? ? ? ? ? ? ? BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
? ? ? ? ? ? ? ? if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
? ? ? ? ? ? ? ? ? ? bluetoothDevices.add(device.getName()+":"+device.getAddress()+"\n");
? ? ? ? ? ? ? ? ? ? arrayAdapter.notifyDataSetChanged();
// ? ? ? ? ? ? ? ? ? ?tvDevices.append(device.getName() + ":" + device.getAddress() + "\n");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
? ? ? ? ? ? ? ? setProgressBarIndeterminateVisibility(false);
? ? ? ? ? ? ? ? setTitle("连接蓝牙设备");
? ? ? ? ? ? }
? ? ? ? }
? ? };
? ? /*
? ? * 客户端设置
? ? * 单击事件
? ? * */
? ? @Override
? ? public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
? ? ? ? String s = arrayAdapter.getItem(position);
? ? ? ? String address = s.substring(s.indexOf(":") + 1).trim();//获取蓝牙IP
?
? ? ? ? try {
? ? ? ? ? ? if (bluetoothAdapter.isDiscovering()) {
? ? ? ? ? ? ? ? bluetoothAdapter.cancelDiscovery();//若当前蓝牙被使用,则关闭重新启用
? ? ? ? ? ? }
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? if (device == null) {//若未连接,则获得远程设备
? ? ? ? ? ? ? ? ? ? device = bluetoothAdapter.getRemoteDevice(address);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (clientSocket == null) {
? ? ? ? ? ? ? ? ? ? clientSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
? ? ? ? ? ? ? ? ? ? clientSocket.connect();//连接蓝牙
? ? ? ? ? ? ? ? ? ? os = clientSocket.getOutputStream();//客户端向服务端输出文本
?
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? ? ? if (os != null) {
? ? ? ? ? ? ? ? os.write("发送信息到其他设备".getBytes("utf-8"));
? ? ? ? ? ? }
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
/*
* 服务端设置
* 设置一个Handler,用来显示
* */
? ? private android.os.Handler handler = new android.os.Handler() {
? ? ? ? public void handleMessage(Message msg) {
? ? ? ? ? ? Toast.makeText(MainActivity.this, String.valueOf(msg.obj), Toast.LENGTH_LONG).show();
? ? ? ? ? ? super.handleMessage(msg);
? ? ? ? }
? ? };
?? ?//线程类
? ? private class AcceptThread extends Thread {
? ? ? ? private BluetoothServerSocket serverSocket;
? ? ? ? private BluetoothSocket socket;
? ? ? ? private InputStream is;
? ? ? ? private OutputStream os;
?
? ? ? ? public AcceptThread() {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
?
? ? ? ? public void run() {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? socket = serverSocket.accept();
? ? ? ? ? ? ? ? is = socket.getInputStream();
? ? ? ? ? ? ? ? os = socket.getOutputStream();
? ? ? ? ? ? ? ? while (true) {
? ? ? ? ? ? ? ? ? ? byte[] buffer = new byte[128];
? ? ? ? ? ? ? ? ? ? int count = is.read(buffer);
? ? ? ? ? ? ? ? ? ? Message msg = new Message();
? ? ? ? ? ? ? ? ? ? msg.obj = new String(buffer, 0, count, "utf-8");
? ? ? ? ? ? ? ? ? ? handler.sendMessage(msg);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

真机测试效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持程序员之家。

相关文章

  • Android自定义view制作绚丽的验证码

    Android自定义view制作绚丽的验证码

    这篇文章主要介绍了Android自定义view制作绚丽的验证码的相关资料,需要的朋友可以参考下
    2016-03-03
  • Android自定义橡皮擦效果

    Android自定义橡皮擦效果

    这篇文章主要为大家详细介绍了Android自定义橡皮擦效果,橡皮擦擦图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Android实现简单的banner轮播图

    Android实现简单的banner轮播图

    这篇文章主要为大家详细介绍了Android实现简单的banner轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Android 开机充电图标和充电动画效果

    Android 开机充电图标和充电动画效果

    这篇文章主要介绍了Android 开机充电图标和充电动画效果,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Android 广播接收器BroadcastReceiver详解

    Android 广播接收器BroadcastReceiver详解

    ContentProvider是android四大组件之一。它是不同应用程序之间交换数据的标准api,ContentProvider以某种uri的形式对外提供数据,允许其它应用程序对其访问或者修改数据。本文将介绍ContentProvider的基础应用,感兴趣的可以学习一下
    2022-07-07
  • Android实现院系专业三级联动

    Android实现院系专业三级联动

    这篇文章主要为大家详细介绍了Android实现院系专业三级联动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • Android编程中读写私有文件的方法

    Android编程中读写私有文件的方法

    这篇文章主要介绍了Android编程中读写私有文件的方法,结合实例形式分析了Android针对私有文件读写操作相关技巧,需要的朋友可以参考下
    2016-10-10
  • Android 利用ViewPager实现图片可以左右循环滑动效果附代码下载

    Android 利用ViewPager实现图片可以左右循环滑动效果附代码下载

    本文通过一个小demo给大家展示一段代码实现viewpage图片左右循环滑动效果,对viewgager循环滑动相关知识感兴趣的朋友一起学习吧
    2015-11-11
  • Android入门教程之ListView的具体使用详解

    Android入门教程之ListView的具体使用详解

    列表作为最常用的控件之一,还是有必要好好学习的,本章以一个初学者的角度来学习 ListView,ListView的属性,以及BaseAdapter简单定义,至于ListView优化这些, 我们一步步来
    2021-10-10
  • android实现raw文件夹导入数据库代码

    android实现raw文件夹导入数据库代码

    这篇文章主要介绍了android实现raw文件夹导入数据库代码,有需要的朋友可以参考一下
    2013-12-12

最新评论


http://www.vxiaotou.com