百摩网
当前位置: 首页 生活百科

安卓studio开发环境(AndroidStudio安卓原生开发蓝牙扫描设备Mac的另一种方法)

时间:2023-08-17 作者: 小编 阅读量: 3 栏目名: 生活百科

AndroidStudio安卓原生开发蓝牙扫描设备Mac的另一种方法下面的一个方法是之前写的,但是那种方法有时候会有扫描不到的情况,现在再写一种,这种方法,更简单有效一些.​​​​​​​​​​​​​​AndroidStudio安卓原生开发_Android扫描附近指定的。

下面的一个方法是之前写的,但是那种方法有时候会有扫描不到的情况,现在再写一种,这种方法,更简单有效一些.​​​​​​​​​​​​​​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;}//体重秤2else 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[]{"苍老湿", "小泽老湿", "波多野结衣老湿", "吉泽明步老湿"};//创建itemfinal String[] items3 = (String[]) tempDeviceList.toArray(new String[tempDeviceList.size()]);//创建itemnew Thread(){@Overridepublic void run() {Looper.prepare();alertDialog alertDialog3 = new AlertDialog.Builder(CommonSettingActivity.this).setTitle("扫描设备列表:").setIcon(R.mipmap.ic_launcher).setItems(items3, new DialogInterface.OnClickListener() {//添加列表@Overridepublic 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);//bmessage.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(){@Overridepublic 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,然后弹出一个弹框,来显示搜索到设备就可以了.

    推荐阅读
  • 大熊猫擅长什么(大熊猫简介)

    动物的运动方式是与其生活的环境而相适应,大熊猫具有发达的四肢,运动方式通常是用四肢来爬行,其爬树行为通常是临近求婚期,或逃避危险,或彼此相遇时弱者借以回避强者的一种方式。大熊猫属于食肉目、熊科、大熊猫亚科和大熊猫属唯一的哺乳动物,仅有二个亚种。大熊猫被誉为活化石和中国国宝,是世界自然基金会的形象大使,也是世界生物多样性保护的旗舰物种。大熊猫是中国特有种,主要栖息地是中国四川、陕西和甘肃山区。

  • 连云港就业困难人员灵活就业社保补贴是什么?

    就业困难人员灵活就业后缴纳社会保险费的,按其实际缴纳社会保险费的不低于1/2,不高于2/3给予补贴,补贴期限最长不超过3年。就业困难人员灵活就业社保补贴享受3年期满,仍未能实现稳定就业的,可将其享受灵活就业社会保险补贴的期限一次性延长,延长期限不超过1年。其中,距法定退休年龄不足5年的,最多可以享受到退休。就业困难人员指哪些群体?

  • dota2冷门版本(DOTA29月16日更新2G)

    今天客户端更新了一个2G/3G的文件,主要是更新了自定义地图工具,DOTA2的RPG时代离我们已经越来越近了。HOHO其他问题:1.有关创意工坊工具对32位和DX9的支持:这次更新,很多有关32位和DX9的支持文件也加入,所以32位系统的吧友耐性等待,这步工作已经在进行。HOHO目前就这样,自定义游戏还是有很多很有趣的,还是推荐吧友能下载的就先下载了。HOHO我因为有装创意工坊工具,这次更新里面却只显示了10MB,然后这次3G主要是创意工坊的更新。

  • 波依定能保持几小时(八千块的依波路)

    湖州的朱先生买了一块依波路品牌的手表,说是戴了一个多月,表扣的一侧按钮掉了,要自费维修。朱先生:“掉了一个扣,打不开,我当天晚上9点钟就赶过来,维修工强行把它拆开了,他说这个要寄到售后鉴定。”最近,朱先生接到店员的通知,说表扣按钮掉了,是人为原因导致的,维修需要自费五百块钱。朱先生不认可,过了几天,店员又有新回复。商场方面联系了店长,经过协调,店家愿意承担朱先生的手表维修费用。

  • 无罪作品(无罪作品介绍)

    无罪作品无罪,百度文学旗下作家,纵横中文网作者人气排行榜魁首,中国网游竞技小说第一人。代表作有《流氓高手》《仙魔变》《剑王朝》《仙侠世界》等。《仙魔变》以3002万阅读、758万推荐、13万收藏的成绩,打破纵横中文网玄幻小说推荐、收藏记录,并成为首部获得月票三连冠的作品。《冰火破坏神》页游和手游由完美世界开发《仙侠世界》游戏和影视由巨人网络开发《剑王朝》影视和动漫由爱奇艺开发。

  • 实木餐桌怎么选(实木餐桌怎么选:三看背面结构)

    还需要看看款式,树木餐桌的款式其实并不是完全一样的,有些款式是比较新颖的,会有一些雕刻,有些则比较单调,这个根据我们的喜爱来选择就可以了。最后,我们还需要考虑一下价格,实木餐桌的价格差异还是比较大的,一般我们不要选择价格最低的,往往质量上面会有问题,价格特别高的也不要选择,可能是品牌效应,适中价格是最好的选择。

  • 一根甘蔗能榨几斤汁(一条甘蔗能榨出五瓶汁)

    下班了放学了搞杯甘甜可口的甘蔗汁那不是美滋滋的~怎一个爽字了得!而说到甘蔗汁在人流密集的地方常常能看见推着车子榨甘蔗汁的小贩但你如果知道甘蔗汁背后的真相的话还甘甜?这样的甘蔗汁,也让围观群众大为摇头。

  • 祖玛珑香水哪款最值得购买(闻过就忘不掉的祖玛珑香水)

    难怪,从诞生之日起,就是英国名媛绅士们聚会用的“沙龙香”。商城特惠价199市场参考价239元JoMaloneLondon祖玛珑,可以说典雅香氛的鼻祖了,是享誉全球的英国香氛世家。与其他名家香水相比,祖玛珑更有自己的特色。作为祖玛珑的热销款,英国梨与小苍兰香水的人气仅次于蓝风铃。图为100ml装,本品9ml前调黑莓、葡萄柚、柚子花。

  • 最近厦门岛内发生的事情(这段岛内疯传)

    视频中,陈时中未佩戴口罩引吭高歌,网友纷纷质疑违反防疫相关规定。当天晚间,陈时中紧急澄清,表示聚会是在去年6月15日,并非三级警戒期间,并且强调自己“只唱了两首歌就离开”。正是陈时中以防疫为由,要求对台湾传统八大行业严格管制,至今尚未完全开放。

  • 只刷白墙有甲醛吗(只刷白墙有甲醛吗可以查血常规吗)

    有,刷白墙所使用的材料本身并不含有甲醛,但是在粉刷白墙过程中,正常情况下都需要使用胶水进行调剂,而甲醛是胶水的原材料,所以墙面上就算只刷白墙也是会或多或少含有甲醛,所以就算只粉刷白墙也要开窗通风尽量不要提早入住尤其是有孕妇、老人、孩子,在房间放置甲醛检测仪,等到数值稳定在对人体无害后再选择入住,也可以在屋内多种植一些绿色盆栽如绿萝、芦荟、常春藤等等。