Android 蓝牙连接,蓝牙配对,自动连接蓝牙

趁热打铁,这篇文章写于刚写完蓝牙配对Demo,主要介绍配对蓝牙的具体编码步骤,开整!
首先上效果图,看一下是否符合读者现在的需求
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
主要核心代码没有想象中那么复杂,首先要去申请一下权限,不仅需要蓝牙权限,还需要位置权限哦

  1. 清单文件中
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  1. 代码中动态获取,这里主要获取位置权限,目前蓝牙权限不需要动态申请,如果某年之后需要动态申请与位置权限相似添加上即可
/*动态申请权限操作*/
    private boolean isPermissionRequested = false;
    public void requestPermission() {
        if (Build.VERSION.SDK_INT >= 23 && !isPermissionRequested) {
            isPermissionRequested = 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 != checkSelfPermission(perm)) {
                    permissionsList.add(perm);
                    // 进入这里代表没有权限.
                }
            }

            if (!permissionsList.isEmpty()) {
                String[] strings = new String[permissionsList.size()];
                requestPermissions(permissionsList.toArray(strings), 0);
            }
        }
    }

权限就如入场券,有了权限才能大胆进行其他操作

蓝牙操作的主要核心都是围绕蓝牙设备适配器 BluetoothAdapter 来进行的,想要获取到蓝牙设备适配器,首先要先创建蓝牙设备管理器 BluetoothManager

 BluetoothManager bluetoothmanger = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
 BluetoothAdapter bluetoothadapter = bluetoothmanger.getAdapter();

拿到蓝牙设备适配器你就可以 “为所欲为” 了,具体怎么个任性法呢,通过这个适配器你可以判断当前设备是否支持蓝牙,可以判断当前设备蓝牙是否开启,可以开启关闭蓝牙,可以进行蓝牙搜索与取消搜索,等等…

具体表现在:

bluetoothadapter == null 当前设备不支持蓝牙,反之
bluetoothadapter.getName() 本机蓝牙名称
bluetoothadapter.getAddress() 本机蓝牙地址
bluetoothadapter.getBondedDevices() 获取当前设备蓝牙已经连接的设备信息
bluetoothadapter.isEnabled() 蓝牙是否开启
bluetoothadapter.enable() 开启蓝牙
bluetoothadapter.disable() 关闭蓝牙
bluetoothadapter.isDiscovering() 当前蓝牙是否正在进行搜索
bluetoothadapter.startDiscovery() 开启搜索附近蓝牙设备
bluetoothadapter.cancelDiscovery() 关闭搜索附近蓝牙设备

其实上面的几个方法就能完成前面的效果图功能了,当然还有当前设备已连接的数据和附近设备的数据呢,别急,他来了!

首先上述方法中的 bluetoothadapter.getBondedDevices() 方法为获取当前设备,他返回的是一个 Set 集合,其中的参数类型为 BluetoothDevice 字面意思为 蓝牙设备,这就已经明示了,这个集合装的是 一条条的设备信息,既然是设备信息,怎么获取到当前设备的名字和地址呢?
在这里插入图片描述
是的,就是这么直接, getName() 和 getAddress() 方法就能获取相应信息

以上是获取当前设备已连接信息,那怎么获取附近设备信息呢?

首先考虑的一点就是,要想设备与其他设备进行交流该用什么方式呢,你直接在代码里写方法,肯定是与其他设备联系不到的,这里就用到了广播,通过广播的形式去找各个设备的蓝牙信息,如果找到了就把他的蓝牙信息返回过来,我们拿到了蓝牙信息中的地址就能去相应的蓝牙设备进行交流,完结,撒花!

/**
     *注释:
     * 广播,寻找其他蓝牙设备
     */
    private BroadcastReceiver searchDevices = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(BluetoothDevice.ACTION_FOUND)) { //found device
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                if (device.getName() != null){//没有名称时不添加
                    String str = "名称: "+device.getName() + " 地址:" + device.getAddress();
                    System.out.println("BlueTooth搜索到的设备:"+str);
                    //如果List中没有str元素则返回-1
                    if (myEveryList.indexOf(str) == -1){// 防止重复添加
                        myEveryList.add(device); // 获取设备名称和mac地址
                    }
                }
            } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_STARTED)) {
                Toast.makeText(getBaseContext(), "正在扫描,请耐心等待", Toast.LENGTH_SHORT).show();
                tv_now_search.setVisibility(View.VISIBLE);//显示等待标识
                lv_every.setVisibility(View.GONE);//列表先隐藏掉
                tv_fu.setText("附近的蓝牙设备("+myEveryList.size()+")");
            } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
                tv_now_search.setVisibility(View.GONE);//隐藏等待标识
                lv_every.setVisibility(View.VISIBLE);//列表显示
                Toast.makeText(getBaseContext(), "扫描完成,点击列表中的设备来尝试连接", Toast.LENGTH_SHORT).show();
                tv_fu.setText("附近的蓝牙设备("+myEveryList.size()+")");
                lv_every.setAdapter(new MyFuListAdapter(myEveryList));
            }
        }
    };

以上就是蓝牙配对的编码过程,下面介绍一下如何进行蓝牙配对与取消配对,以上操作的基础都是你要有对应蓝牙设备信息,就是上述的BluetoothDevice

蓝牙配对:

  Method method = BluetoothDevice.class.getMethod("createBond");
  method.invoke(myEveryList.get(i));//这里面的参数就是BluetoothDevice  

取消配对

  Method method = BluetoothDevice.class.getMethod("removeBond");
  method.invoke(myNowList.get(i));//这里面的参数就是BluetoothDevice 

好了,将上述文章的相关方法拼凑起来就构成了从 开启关闭蓝牙、搜索蓝牙设备、进行设备连接、进行取消连接的一条龙操作。

源码也发布到资源里面去了, 1 C币下载! 壹 C币下载! 下载地址

  • 21
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值