百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

AndroidStudio_安卓原生开发_蓝牙扫描设备Mac的另一种方法

bigegpt 2024-08-27 11:59 2 浏览

下面的一个方法是之前写的,但是那种方法有时候会有扫描不到的情况,现在再写一种,这种方法,更简单有效一些.
??????????????AndroidStudio安卓原生开发_Android扫描附近指定的蓝牙设备_通过设备名称过滤_计算距离_离扫描设备近的显示的时候放在前面---Android原生开发工作笔记128_全栈哥的专栏-CSDN博客???????下面这里直接上代码吧,我这边的应用场景是,比如我扫描附近的体重秤,注意,我扫描的时候,需要过滤,只把扫描到的特定型号的,体重秤显示出来,比如附近的手机,血压计等都不能扫描出来.同时比如如果有两台体重秤的话,一台离的近,一台离的远,我需要把离得近的体重秤,在显示的时候,优先显示在上面.根据离扫描设备的距离,做个倒序排序: 这里有个不好的地方,就是,我是用扫描到的设备的蓝牙的名称来进行过滤的,比如体重秤的话,他这个型号的,的蓝牙名称都是以QN- 开头的,我直接判断,我扫描到的蓝牙设备...


1.首先在activity中,去检查有没有定位权限,这里我利用定位,根据蓝牙信号的强弱计算,


设备离平板的距离了.在oncreate中去调用就可以了.


    /**
     * 解决:无法发现蓝牙设备的问题
     *
     * 对于发现新设备这个功能, 还需另外两个权限(Android M 以上版本需要显式获取授权,附授权代码):
     */
    private final int ACCESS_LOCATION=1;
    @SuppressLint("WrongConstant")
    private void getPermission() {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
            int permissionCheck = 0;
            permissionCheck = this.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION);
            permissionCheck += this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION);

            if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
                //未获得权限
                this.requestPermissions( // 请求授权
                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
                                Manifest.permission.ACCESS_COARSE_LOCATION},
                        ACCESS_LOCATION);// 自定义常量,任意整型
            }
        }
    }



2.去初始化蓝牙


    private BluetoothAdapter bluetoothAdapter;
    private BluetoothGatt mBluetoothGatt; //这个可以定义到最上面

  //初始化蓝牙设备
    private void initBluetooth() {
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (bluetoothAdapter == null) {
            Toast.makeText(this, "此设备不支持蓝牙操作", Toast.LENGTH_LONG).show();
            return;
        }
    }



3.写个搜索方法去调用 searchDevices(); 这个方法可以点击某个搜索的按钮的时候调用


 private void searchDevices() {
        bluetoothAdapter.getBluetoothLeScanner().startScan(scanCallback);
    }



4.然后去写回调方法,搜索到设备以后回调方法


  public ScanCallback scanCallback = new ScanCallback() {
        public void onScanResult(int var1, ScanResult var2) {

            String mac_address="";
            String device_name ="";
            mac_address=  var2.getDevice().getAddress();
            device_name = var2.getDevice().getName();

            String deviceAddress = "";
            String deviceName = "";
            double deviceSignal = 0.0;
            boolean isFind = false;

            if(deviceNum.equals("0")){
                isFind = false;
                deviceName = "未知设备";
                //deviceAddress = "未知设备->"+ device.getAddress();
                deviceAddress = mac_address;
            }else if(deviceNum.equals("1") && device_name!=null && device_name.toString().startsWith("QN-")){
                isFind = true;
                deviceName = "体重秤";
                //deviceAddress = "体重秤->"+ mac_address;
                deviceAddress = mac_address;
            }//体重秤2
            else if(deviceNum.equals("7") && device_name!=null && device_name.toString().startsWith("QN-")){
                isFind = true;
                deviceName = "体重秤";
                //deviceAddress = "体重秤->"+ mac_address;
                deviceAddress = mac_address;
            }
            .... 这里可以写很多,看自己有多少设备了,这里我依然是直接用设备名称搜索的
            else{
                isFind = false;
            }

            //找到检测设备以后,添加到设备列表中去
            if(isFind){
                if(strMacLists.contains(deviceAddress)){
                }else{
                    //获取蓝牙信号强度,信号强度强的放在前面
                    //添加到列表
                    int iRssi = var2.getRssi();;
                    // 将蓝牙信号强度换算为距离
                    double power = (iRssi - 59) / 25.0;
                    deviceSignal = power;
                    DeviceInfo deviceInfo = new DeviceInfo();
                    deviceInfo.setAddress(deviceAddress);
                    deviceInfo.setName(deviceName);
                    deviceInfo.setSignal(deviceSignal);
                    macLists.add(deviceInfo);
                    strMacLists.add(deviceAddress); 
                }
            }
        }
    };



5.上面就是搜索到了设备以后,然后构建一个DeviceInfo这个类,然后添加到list中去,这里对象中,带有


rssi也就是deviceSignal这个是表示距离的属性,会根据这个,给搜索到的设备进行距离排序.


然后,某个按钮按下,去调用搜索方法.


 //1.每次搜索前初始化一下设备信息
            macLists = new ArrayList<DeviceInfo>();
   
 //1.显示正在扫描
            BaseApplication.context().showDialog(CommonSettingActivity.this, "正在扫描请稍后...");
            final int[] deviceCount = {0};
            macLists = new ArrayList<DeviceInfo>();
            strMacLists = new ArrayList<String>();

            //定时器循环
            final Timer scanTimer = new Timer();
            TimerTask scanTask = new TimerTask(){
                public void run() {
                    //Looper.prepare();
                    if((deviceCount[0] < macLists.size()) && (macLists.size()>0)){
                        //1.有新设备添加,记录设备数量
                        deviceCount[0] =  macLists.size();
                    }else if((deviceCount[0] == macLists.size()) && (macLists.size() > 0)){
                        //2.已经没有新设备被扫描到,扫描结束
                        BaseApplication.context().closeDialog();
                        scanTimer.cancel();
                        //3.按照信号强度排序
                        Collections.sort(macLists, new ComparatorSort());
                        ArrayList<String> tempDeviceList = new ArrayList<>();

                        for (DeviceInfo macList : macLists) {
                            tempDeviceList.add(macList.getName()+"->"+macList.getAddress());
                        }

                        //搜索蓝牙设备按钮
                        //String[] items3 = new String[]{"苍老湿", "小泽老湿", "波多野结衣老湿", "吉泽明步老湿"};//创建item
                        final String[] items3 = (String[]) tempDeviceList.toArray(new String[tempDeviceList.size()]);//创建item
                        new Thread(){
                            @Override
                            public void run() {
                                Looper.prepare();
                                AlertDialog alertDialog3 = new AlertDialog.Builder(CommonSettingActivity.this)
                                        .setTitle("扫描设备列表:")
                                        .setIcon(R.mipmap.ic_launcher)
                                        .setItems(items3, new DialogInterface.OnClickListener() {//添加列表
                                            @Override
                                            public void onClick(DialogInterface dialogInterface, int i) {
                                                //Toast.makeText(CommonSettingActivity.this, "点的是:" + items3[i], Toast.LENGTH_SHORT).show();
                                                //EditText mac_edit_text = findViewById(R.id.set_edittext_mac);
                                                //获取mac地址
                                                //mac_edit_text.setText(items3[i]);

                                                Message message=new Message();
                                                Bundle bundle=new Bundle();
                                                bundle.putString("deviceMac", items3[i]);
                                                message.setData(bundle);//b
                                                message.what = 310;

                                                setMacHandler.sendMessage(message);
                                            }
                                        })
                                        .create();
                                alertDialog3.show();
                                alertDialog3.getWindow().setLayout(1600,800);

                                Looper.loop();
                            }
                        }.start();

                    }else if(macLists.size() == 0 ){
                        BaseApplication.context().closeDialog();
                        scanTimer.cancel();
                        //Toast.makeText(this,"121",Toast.LENGTH_SHORT).show();
                        new Thread(){
                            @Override
                            public void run() {
                                Looper.prepare();
                                Toast.makeText(CommonSettingActivity.this, "未扫描到设备", Toast.LENGTH_SHORT).show();
                                Looper.loop();
                            }
                        }.start();
                    }
                }
            };

            scanTimer.schedule(scanTask,8000,5000);

            searchDevices();



6.可以看到上面,当按下按钮的时候,实际上去先打开一个timer,timer会每个5秒钟,去执行一次,


会检查搜索到的list的size,如果经过5秒的搜索,size大于0,就先记住这个size,然后再去搜索,


再经过5秒钟搜索如果,上次搜索的已经记下的个数,小于现在macLists这个的size,说明又有新的设备


被扫描到了,就再次记下最新的size,知道记下的size和macLists的size一样的时候,说明已经没有新


设备被扫描到了,就退出这个timer,然后弹出一个弹框,来显示搜索到设备就可以了.




?

相关推荐

【Docker 新手入门指南】第十章:Dockerfile

Dockerfile是Docker镜像构建的核心配置文件,通过预定义的指令集实现镜像的自动化构建。以下从核心概念、指令详解、最佳实践三方面展开说明,帮助你系统掌握Dockerfile的使用逻...

Windows下最简单的ESP8266_ROTS_ESP-IDF环境搭建与腾讯云SDK编译

前言其实也没啥可说的,只是我感觉ESP-IDF对新手来说很不友好,很容易踩坑,尤其是对业余DIY爱好者搭建环境非常困难,即使有官方文档,或者网上的其他文档,但是还是很容易踩坑,多研究,记住两点就行了,...

python虚拟环境迁移(python虚拟环境conda)

主机A的虚拟环境向主机B迁移。前提条件:主机A和主机B已经安装了virtualenv1.主机A操作如下虚拟环境目录:venv进入虚拟环境:sourcevenv/bin/active(1)记录虚拟环...

Python爬虫进阶教程(二):线程、协程

简介线程线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能...

基于网络安全的Docker逃逸(docker)

如何判断当前机器是否为Docker容器环境Metasploit中的checkcontainer模块、(判断是否为虚拟机,checkvm模块)搭配学习教程1.检查根目录下是否存在.dockerenv文...

Python编程语言被纳入浙江高考,小学生都开始学了

今年9月份开始的新学期,浙江省三到九年级信息技术课将同步替换新教材。其中,新初二将新增Python编程课程内容。新高一信息技术编程语言由VB替换为Python,大数据、人工智能、程序设计与算法按照教材...

CentOS 7下安装Python 3.10的完整过程

1.安装相应的编译工具yum-ygroupinstall"Developmenttools"yum-yinstallzlib-develbzip2-develope...

如何在Ubuntu 20.04上部署Odoo 14

Odoo是世界上最受欢迎的多合一商务软件。它提供了一系列业务应用程序,包括CRM,网站,电子商务,计费,会计,制造,仓库,项目管理,库存等等,所有这些都无缝集成在一起。Odoo可以通过几种不同的方式进...

Ubuntu 系统安装 PyTorch 全流程指南

当前环境:Ubuntu22.04,显卡为GeForceRTX3080Ti1、下载显卡驱动驱动网站:https://www.nvidia.com/en-us/drivers/根据自己的显卡型号和...

spark+python环境搭建(python 环境搭建)

最近项目需要用到spark大数据相关技术,周末有空spark环境搭起来...目标spark,python运行环境部署在linux服务器个人通过vscode开发通过远程python解释器执行代码准备...

centos7.9安装最新python-3.11.1(centos安装python环境)

centos7.9安装最新python-3.11.1centos7.9默认安装的是python-2.7.5版本,安全扫描时会有很多漏洞,比如:Python命令注入漏洞(CVE-2015-2010...

Linux系统下,五大步骤安装Python

一、下载Python包网上教程大多是通过官方地址进行下载Python的,但由于国内网络环境问题,会导致下载很慢,所以这里建议通过国内镜像进行下载例如:淘宝镜像http://npm.taobao.or...

centos7上安装python3(centos7安装python3.7.2一键脚本)

centos7上默认安装的是python2,要使用python3则需要自行下载源码编译安装。1.安装依赖yum-ygroupinstall"Developmenttools"...

利用本地数据通过微调方式训练 本地DeepSeek-R1 蒸馏模型

网络上相应的教程基本都基于LLaMA-Factory进行,本文章主要顺着相应的教程一步步实现大模型的微调和训练。训练环境:可自行定义,mac、linux或者window之类的均可以,本文以ma...

【法器篇】天啦噜,库崩了没备份(天啦噜是什么意思?)

背景数据库没有做备份,一天突然由于断电或其他原因导致无法启动了,且设置了innodb_force_recovery=6都无法启动,里面的数据怎么才能恢复出来?本例采用解析建表语句+表空间传输的方式进行...