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

Posted 小狗蛋ing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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币下载! 下载地址

以上是关于Android 蓝牙连接,蓝牙配对,自动连接蓝牙的主要内容,如果未能解决你的问题,请参考以下文章

Android蓝牙协议-蓝牙配对与连接

syu android蓝牙连接方法

win10蓝牙已配对手柄,但无法自动连接,也没有连接按钮?

Android蓝牙自动配对Demo,亲测好使!!!

android蓝牙配对 如何自动配对设置PIN码

android的蓝牙匹配连接