当前位置:主页 > android教程 > Android蓝牙功能

Android学习笔记之蓝牙功能

发布:2023-03-12 16:00:01 59


给网友朋友们带来一篇相关的编程文章,网友梁光济根据主题投稿了本篇教程内容,涉及到Android、蓝牙、Android蓝牙功能相关内容,已被800网友关注,涉猎到的知识点内容可以在下方电子书获得。

Android蓝牙功能

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

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

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

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

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

权限配置:


  

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 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 bluetoothDevices = new ArrayList();//存储搜索到的所有蓝牙设备
    private ArrayAdapter 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 pairedDevices = bluetoothAdapter.getBondedDevices();
        if (pairedDevices.size() > 0) {
            for (BluetoothDevice device : pairedDevices) {
                bluetoothDevices.add(device.getName() + ":" + device.getAddress() + "\n");
            }
        }
        //显示设备在列表上
        arrayAdapter = new ArrayAdapter(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中FileProvider的各种场景应用详解

    发布:2023-03-05

    这篇文章主要为大家介绍了Android中FileProvider的各种场景应用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • Android开发RecyclerView单独刷新使用技巧

    发布:2023-03-13

    本篇文章主要是分享下RecyclerView中子item如何单独刷新以及子item的某一部分内容如何实现单独刷新,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • Android 动态加载 so实现示例详解

    发布:2023-03-05

    这篇文章主要为大家介绍了Android 动态加载 so实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • Android开发之ViewPager实现滑动切换页面

    发布:2023-03-10

    这篇文章主要为大家详细介绍了Android开发之ViewPager实现滑动切换页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • Android Flutter实现精灵图的使用详解

    发布:2023-03-03

    在游戏开发中,精灵图会将一个人物所有动作放置在一张图片中,通过坐标定位选取其中一张图展示。本文就来教你如何使用精灵图,感兴趣的可以了解一下


  • Android基于Mapbox V10 绘制LineGradient轨迹

    发布:2023-03-02

    这篇文章主要介绍了Android基于Mapbox V10 绘制LineGradient轨迹,文章通告介绍一些V10上的用法,最终讲下如何绘制渐变运动记录轨迹,感兴趣的小伙伴可以参考一下


  • Android小工具自定义view课表

    发布:2023-03-09

    这篇文章主要为大家详细介绍了Android小工具自定义view课表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • android显示意图激活另一个Activity的实例代码

    发布:2019-12-17

    下面小编就为大家带来一篇android显示意图激活另一个Activity的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧


网友讨论