【Android开发基础】蓝牙信息的获取(Bluetooth)

这篇具有很好参考价值的文章主要介绍了【Android开发基础】蓝牙信息的获取(Bluetooth)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、引言

  • 描述:蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。蓝牙使当前的一些便携移动设备和计算机设备能够不需要电缆就能连接到互联网,并且可以无线接入互联网。在生活中也是得到广泛的应用,比如:车载蓝牙、公共洗衣机。
  • 频段:2.4—2.485GHz的ISM波段
  • 特点:(摘选引用自百度百科)
    1、蓝牙技术的适用设备多,无需电缆,通过无线使电脑和电信连网进行通信。
    2、蓝牙技术的工作频段全球通用,适用于全球范围内用户无界限的使用,解决了蜂窝式移动电话的国界障碍。
    3、蓝牙技术的安全性和抗干扰能力强,由于蓝牙技术具有跳频的功能,有效避免了ISM频带遇到干扰源。
    4、现阶段,蓝牙技术的主要工作范围在10米左右,经过增加射频功率后的蓝牙技术可以在100米的范围进行工作,只有这样才能保证蓝牙在传播时的工作质量与效率,提高蓝牙的传播速度。
  • 知识点:
    1、Bluetooth
    2、广播
  • 难度:初级
  • 效果:
    【Android开发基础】蓝牙信息的获取(Bluetooth)

二、操作

        因为进度问题,防止劝退初学者,所以此篇博客只会描述如何开启蓝牙、打开可检测设置和搜索蓝牙,关于蓝牙连接和蓝牙通信我会将TCP和UDP数据通信放在一起,综合成一篇进阶中级难度的博客。

1、权限

         需要在 AndroidManifest.xml 中添加以下权限,防止开启蓝牙失败,并接收不到提醒。

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

        主界面.java 权限二次判断,在SDK23以上的版本都需要加上这个权限判断,要不然第一次拒绝之后,可能无法再次弹出提醒,需要用户手动开启权限。

	private void requestPermission() {
        if (Build.VERSION.SDK_INT >= 23 && !isPermissionR){
            isPermissionR = true;
            ArrayList<String> permissionsList = new ArrayList<>();
            String[] permissions = {
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION,
            };
            for (String perm : permissions) {
                if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(MainActivity.this,perm)) {
                    permissionsList.add(perm);
                }
            }
            if (!permissionsList.isEmpty()) {
                String[] strings = new String[permissionsList.size()];
                ActivityCompat.requestPermissions(MainActivity.this , permissionsList.toArray(strings),0);
            }
        }
    }

2、开启蓝牙

通过Intent机制发送请求,开启蓝牙。

   //获得BluetoothAdapter对象,启动API
   BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
   
   //判断本机是否有蓝牙设备
   if (bluetoothAdapter == null) {
       text.setText("本机无蓝牙设备\n");
   } else if (!bluetoothAdapter.isEnabled()) {
       //若手机蓝牙未开启,将启动蓝牙设备
       Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
       //发送请求,开启蓝牙
       startActivityForResult(intent , 300);
       bluetoothAdapter.cancelDiscovery();
       requestPermission();
   } else {
       Toast.makeText(MainActivity.this , "蓝牙已开启", Toast.LENGTH_SHORT).show();
   }

3、可检测

只有打开可检测才能被其他应用所检测到。

    if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
        showToast("请先开启本机蓝牙");
        return;
    }
    if (bluetoothAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
        //不可被检测性
        Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
        //使本机可在 500秒 内可被检测到
        intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,500);
        startActivity(intent);
    } else {
        showToast("本机已处于被检测状态!!");
    }

4、搜索蓝牙

这里使用Set方法获取到蓝牙信息。

    if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
        showToast("请先开启本机蓝牙");
        return;
    }
    foundInfo = "发现蓝牙设备:\n"; // 将搜索结果字符串恢复成初始值
    bluetoothAdapter.startDiscovery();
    // 收集蓝牙信息
    Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
    if(pairedDevices.size()>0)
    {
        String pairedInfo = "可配对的蓝牙设备:\n";
        for(Iterator<BluetoothDevice> it = pairedDevices.iterator(); it.hasNext();)
        {
            BluetoothDevice pairedDevice = (BluetoothDevice)it.next();
            //显示出远程蓝牙设备的名字和物理地址
            pairedInfo += pairedDevice.getName()+"  "+pairedDevice.getAddress()+"\n";
        }
        text.setText(pairedInfo);
    }

	class BluetoothReceiver extends 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);
            foundInfo += device.getName()+"  "+device.getAddress()+"\n";
        }
        else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { //搜索结束
            if (foundInfo.equals("发现蓝牙设备:\n")) {
                Toast.makeText(MainActivity.this , "没有搜索到蓝牙设备" , Toast.LENGTH_SHORT).show();
            }
            else {
                //显示搜索结果
                text.setText(foundInfo);
                text.setMovementMethod(ScrollingMovementMethod.getInstance());
            }
        }

5、广播

广播是蓝牙检测中最重要的一环。文章来源地址https://www.toymoban.com/news/detail-486108.html

		//创建蓝牙广播信息
        bluetoothReceiver = new BluetoothReceiver();
        //设定广播接收的filter
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        //注册广播接收器,当设备被发现时调用函数
        registerReceiver(bluetoothReceiver , filter);
        //设定另一事件广播
        filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        //注册广播接收器
        registerReceiver(bluetoothReceiver,filter);

三、附件

1、UI界面设计

<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_kq"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="打开蓝牙"
        android:background="@drawable/shape"/>

    <Button
        android:id="@+id/btn_jcx"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="启动附近可检测"
        android:background="@drawable/shape"/>

    <Button
        android:id="@+id/btn_ss"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="搜索附近可配对"
        android:background="@drawable/shape"/>

    <TextView
        android:id="@+id/bluetooth_text"
        android:layout_width="match_parent"
        android:layout_marginTop="40dp"
        android:scrollbars="vertical"
        android:fadeScrollbars="false"
        android:layout_height="wrap_content"/>

</LinearLayout>

2、总代码

public class MainActivity extends AppCompatActivity {

    private Button btnDk,btnKj,btnSs;
    private TextView text;
    private String foundInfo = null;
    //获得BluetoothAdapter对象,启动API
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    BluetoothReceiver bluetoothReceiver;
    private boolean isPermissionR = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();
    }

    private void init() {
        text = findViewById(R.id.bluetooth_text);
        //开启蓝牙
        btnDk = findViewById(R.id.btn_kq);
        btnDk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //判断本机是否有蓝牙设备
                if (bluetoothAdapter == null) {
                    text.setText("本机无蓝牙设备\n");
                } else if (!bluetoothAdapter.isEnabled()) {
                    //若手机蓝牙未开启,将启动蓝牙设备
                    Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                    //发送请求,开启蓝牙
                    startActivityForResult(intent , 300);
                    bluetoothAdapter.cancelDiscovery();
                    requestPermission();
                } else {
                    showToast("蓝牙已开启");
                }
            }
        });

        btnKj = findViewById(R.id.btn_jcx);
        btnKj.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
                    showToast("请先开启本机蓝牙");
                    return;
                }
                if (bluetoothAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
                    //不可被检测性
                    Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
                    //使本机可在 500秒 内可被检测到
                    intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,500);
                    startActivity(intent);
                } else {
                    showToast("本机已处于被检测状态!!");
                }
            }
        });

        btnSs = findViewById(R.id.btn_ss);
        btnSs.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
                    showToast("请先开启本机蓝牙");
                    return;
                }
                foundInfo = "发现蓝牙设备:\n"; //将搜索结果字符串恢复成初始值
                bluetoothAdapter.startDiscovery();
                Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
                if(pairedDevices.size()>0)
                {
                    String pairedInfo = "可配对的蓝牙设备:\n";
                    for(Iterator<BluetoothDevice> it = pairedDevices.iterator(); it.hasNext();)
                    {
                        BluetoothDevice pairedDevice = (BluetoothDevice)it.next();
                        //显示出远程蓝牙设备的名字和物理地址
                        pairedInfo += pairedDevice.getName()+"  "+pairedDevice.getAddress()+"\n";
                    }
                    text.setText(pairedInfo);
                }
            }
        });

        //创建蓝牙广播信息
        bluetoothReceiver = new BluetoothReceiver();
        //设定广播接收的filter
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        //注册广播接收器,当设备被发现时调用函数
        registerReceiver(bluetoothReceiver , filter);
        //设定另一事件广播
        filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        //注册广播接收器
        registerReceiver(bluetoothReceiver,filter);
    }


    class BluetoothReceiver extends 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);
                foundInfo += device.getName()+"  "+device.getAddress()+"\n";
            }
            else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { //搜索结束
                if (foundInfo.equals("发现蓝牙设备:\n")) {
                    Toast.makeText(MainActivity.this , "没有搜索到蓝牙设备" , Toast.LENGTH_SHORT).show();
                }
                else {
                    //显示搜索结果
                    text.setText(foundInfo);
                    text.setMovementMethod(ScrollingMovementMethod.getInstance());
                }
            }
        }
    }

    public void showToast(String string) {
        Toast.makeText(MainActivity.this , string , Toast.LENGTH_SHORT).show();
    }

    private void requestPermission() {
        if (Build.VERSION.SDK_INT >= 23 && !isPermissionR){
            isPermissionR = true;
            ArrayList<String> permissionsList = new ArrayList<>();
            String[] permissions = {
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION,
            };
            for (String perm : permissions) {
                if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(MainActivity.this,perm)) {
                    permissionsList.add(perm);
                }
            }
            if (!permissionsList.isEmpty()) {
                String[] strings = new String[permissionsList.size()];
                ActivityCompat.requestPermissions(MainActivity.this , permissionsList.toArray(strings),0);
            }
        }
    }
}

到了这里,关于【Android开发基础】蓝牙信息的获取(Bluetooth)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android连接蓝牙设备问题(android.permission.BLUETOOTH)

            近期遇到一个问题,之前发布的APP连接蓝牙都是正常的,现在有人反映连不上了。经过测试发现:android 12 和 harmonyOS 3.0.0 都会有这个问题,而之前的版本就不会有这个。         经过网上一番查找,原来是因为最近Google发布的Android 12,新引入了 BLUETOOTH_SCAN、

    2024年01月16日
    浏览(47)
  • Android Bluetooth(一)——蓝牙的开启和搜索

    Android 平台包含蓝牙网络堆栈支持,此支持能让设备以无线方式与其他蓝牙设备交换数据。应用框架提供通过 Android Bluetooth API 访问蓝牙功能的权限。这些 API 允许应用以无线方式连接到其他蓝牙设备,从而实现点到点和多点无线功能。 Android 应用可通过 Bluetooth API 执行以下操

    2024年01月16日
    浏览(44)
  • Android Studio 简要实现蓝牙(Bluetooth)通信(附加作业)

    1.两台设备可以通过蓝牙进行通信 2.模拟Client 和Server端实现简单的通信。 如果想让应用启动设备发现或操纵蓝牙设置,则除了 BLUETOOTH 权限以外,还必须声明 BLUETOOTH_ADMIN 权限。大多数应用只是需利用此权限发现本地蓝牙设备。除非应用是根据用户请求修改蓝牙设置的“超级

    2024年02月03日
    浏览(52)
  • 【Bluetooth蓝牙开发】一、开篇词 | 打造全网最详细的Bluetooth开发教程

    我的圈子: 高级工程师聚集地 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强企业! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 大家好,我是董哥! 随着物联网技术的快速发展, WiFi 、蓝牙成了物联网通信主

    2024年01月18日
    浏览(35)
  • Android蓝牙使能流程图(Android Bluetooth enable) -- java & jni层

    在介绍Android enable流程之前,我们首先来看下Android的流程图 以上图示是android8以上的,主要跟Android8之前的架构在于Bluetooth stack跟vendor层之间增加一层HIDL,主要是抽象硬件层的作用 OK,回归主题,我们来看下Android的enable流程,首先上一张架构图 另外声明下:我们做了一些列

    2024年02月09日
    浏览(44)
  • 【Bluetooth蓝牙开发】九、BLE协议之GATT

    个人主页:董哥聊技术 我是董哥,嵌入式领域新星创作者 创作理念:专注分享高质量嵌入式文章,让大家读有所得!   【所有文章汇总】  

    2024年01月22日
    浏览(39)
  • RK3288 Android11 RTL8723DS WiFi 和 蓝牙Bluetooth 适配

      瑞芯微RK系列对“REALTEK瑞昱公司”的wifi、蓝牙双模的模组都有内置适配的,因此HAL层、Framework层、协议栈及库文件都不需要移植适配,只需修改设备树和一些配置文件即可。 补充: RTL8723DS时钟输入源讲解   RTL8723DS模组的第24号引脚是模组的时钟输入源,需要给此提供

    2024年02月07日
    浏览(78)
  • 【Bluetooth蓝牙开发】十一、一文秒懂 | 超详细的Bluez交叉编译

    个人主页:董哥聊技术 我是董哥,嵌入式领域新星创作者 创作理念:专注分享高质量嵌入式文章,让大家读有所得!   【所有文章汇总】   前面几篇文章,主要讲解了蓝牙协议栈层面的内容,本篇来从源码层面来分析! 蓝牙协议栈,如何在代码层面将其落地?用的最多的

    2024年02月02日
    浏览(41)
  • 【Bluetooth蓝牙开发】七、BLE协议之L2CAP

    个人主页:董哥聊技术 我是董哥,嵌入式领域新星创作者 创作理念:专注分享高质量嵌入式文章,让大家读有所得!   【所有文章汇总】  

    2023年04月09日
    浏览(39)
  • android设置打开蓝牙时报错:java.lang.SecurityException: Need android.permission.BLUETOOTH_CONNECT permission

    我的手机是三星s10,Android12,遇到的这个问题,供参考 问题出现场景,我是最近在研究一下蓝牙相关的,找了文档学习但是触动mBluetoothAdapter.enable();开启或者打开蓝牙的时候就报了下面这个错: 开始解错: 表面提示就是需要许可证/就是权限之类的缺少, 然后我就顺着这个错误去网上

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包