主要是api的说明,嫌啰嗦的可以直接看demo,demo中有个检测锁屏时间重复开启扫描的代码,主要是如果APP没有获得电量或者后台运行的权限,只能持续后台运行几小时。

这个demo的作用是实现8.0以后的后台监测到特定蓝牙信号自动唤醒APP的功能,首先需要另外一个装了可以发射蓝牙信号软件的手机,我这边是选取的ios平台上的lightblue,然后在这个软件里面新建一个虚拟设备名称是要demo搜索的蓝牙模块名称。然后把app杀掉,过一段时间打开lightblue发射蓝牙信号,然后关掉,再次打开demo,会发现demo中记录的时间就是你发射蓝牙信号的时间,说明被杀后它还是在监测蓝牙信号的

先看gif的效果

Demo的Github地址如下

https://github.com/TracyEminem/BleSingle

在Android 8.0以上的版本中,Google提供了一种可以在后台持续扫描的方式,如果不给后台运行的权限,也是可以在锁屏后持续进行蓝牙扫描,可以持续大概几个小时,还可以利用传的intent来从后台唤醒APP。。。我做了尝试,如果把app从任务栏删掉,再发出蓝牙信号也可以让app自动运行唤醒。。。如果你给与了电量限制,后台运行相关的权限,那么这个扫描是可以持续很久的,使用前台service我做到过5天保持扫描一直在运行。而且这个耗电量很低,基本上忽略不计。。原理有点类似于IOS上的IBEACON唤醒APP,虽然Android也有类似的Eddystone,但是Eddystone不支持后台持续监测,Eddystone可以利用Google nearby的api检测到甚至IBEACON也是可以检测的,但是google nearby的检测方式依赖于你何时按下锁屏按钮的,如果你在beacon附近没有按锁屏按钮,那么是不会再后台检测BEACON信号的。。

唤醒的api如下

很明显,也是利用了ScanFilter来检测指定的设备,来实现这个后台扫描的功能的,实际上单纯只是锁屏后台持续扫描的API还有另外一个,也是利用了ScanFilter。。另外一个api如下

下面是如何使用 首先是一堆权限

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

然后是创建一个Penddingintent来执行唤醒操作

   callbackIntent = PendingIntent.getForegroundService(this,1,new Intent("com.hungrytree.receiver.BleService").setPackage(getPackageName()),PendingIntent.FLAG_UPDATE_CURRENT );

这个callbackIntent在开启和关闭蓝牙扫描时也要用到,然后开启蓝牙的扫描,这一步可以在Activity中操作,也可以在service中操作。。。

    public void onOpen(){//BluetoothManager是向蓝牙设备通讯的入口BluetoothManager bluetoothManager = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();//指定需要识别到的蓝牙设备List<ScanFilter> scanFilterList = new ArrayList<>();ScanFilter.Builder builder2 = new ScanFilter.Builder();builder2.setDeviceName("test2");//你要扫描的设备的名称,如果使用lightble这个app来模拟蓝牙可以直接设置name,这个只是filter的一种,你可以指定uuid,这个只是指定设备名ScanFilter scanFilter2 = builder2.build();//        scanFilterList.add(scanFilter);scanFilterList.add(scanFilter2);//指定蓝牙的方式,这里设置的ScanSettings.SCAN_MODE_LOW_POWER是比较节电的扫描方式,而且在效率方面没有很大的影响,而且相当省电ScanSettings.Builder settingBuilder = new ScanSettings.Builder();settingBuilder.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER);settingBuilder.setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE);settingBuilder.setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES);settingBuilder.setLegacy(true);ScanSettings settings = settingBuilder.build();//启动蓝牙扫描bluetoothAdapter.getBluetoothLeScanner().startScan(scanFilterList,settings,callbackIntent);// bluetoothAdapter.getBluetoothLeScanner().startScan(scanFilterList,settings,mScanCallback);}

后面是关闭蓝牙扫描

   public void onClose(){BluetoothManager bluetoothManager = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();bluetoothAdapter.getBluetoothLeScanner().stopScan(callbackIntent);//这个callbackintent必须是之前创建的那个,不然无法关闭扫描}

下面是接收蓝牙扫描的结果,在Service中接收结果,并且处理

     <service android:name=".TestService"><intent-filter><action android:name="com.hungrytree.receiver.BleService"/><category android:name="android.intent.category.DEFAULT"/></intent-filter></service>

处理是在service的onstartcommand方法中,结果会不断的回调该方法,在该方法中进行处理

  @Overridepublic int onStartCommand(Intent intent, int flags, int startId) {if (intent.getAction() == null) {return START_STICKY;}//获取返回的错误码int errorCode = intent.getIntExtra(BluetoothLeScanner.EXTRA_ERROR_CODE, -1);//ScanSettings.SCAN_FAILED_*//获取到的蓝牙设备的回调类型int callbackType = intent.getIntExtra(BluetoothLeScanner.EXTRA_CALLBACK_TYPE, -1);//ScanSettings.CALLBACK_TYPE_*if (errorCode == -1) {//扫描到蓝牙设备信息List<ScanResult> scanResults = (List<ScanResult>) intent.getSerializableExtra(BluetoothLeScanner.EXTRA_LIST_SCAN_RESULT);if (scanResults != null) {for (ScanResult result : scanResults) {Utils.writeFile(getApplicationContext(),"wakeup.log",Integer.toString(numRSSI));Log.i("Wakeup", "onScanResult2: name: " + result.getDevice().getName() +", address: " + result.getDevice().getAddress() +", rssi: " + result.getRssi() + ", scanRecord: " + result.getScanRecord());}}} else {//此处为扫描失败的错误处理}return START_STICKY;}

如果中途关闭蓝牙,那么扫描会自动恢复。。如果被杀了,你关闭蓝牙,那么无法再执行唤醒的操作。。。如果要利用手机发出特定的蓝牙信号,可以安装LightBlue 这个app,要发出beacon信号的话,请安装玩转Beacon。。这两个app都是ios平台的

Android 8.0 蓝牙唤醒 Ble 锁屏 保活 后台 持续扫描 进程拉活 自动唤醒相关推荐

  1. aptx android8,秒杀苹果无线音频!Android 8.0蓝牙音质支持aptxHD/LDAC

    原标题:秒杀苹果无线音频!Android 8.0蓝牙音质支持aptxHD/LDAC [TechWeb报道]8月25日消息,本周将迎来Android 8.0"奥利奥"系统推送,目前已 ...

  2. android布局管理器模仿qq登录效果,Android程序开发仿新版QQ锁屏下弹窗功能

    新版的qq,可以在锁屏下弹窗显示qq消息,正好目前在做的项目也需要这一功能.经过各种试验和资料查找,终于实现,过程不难,但是却有一些地方需要注意. 下面是实现过程. 1.使用Activity,而不是V ...

  3. 解决unity 打包在Android 8.0上启动出现黑屏问题(Android权限弹窗问题)

    解决unity 打包在Android 8.0上启动出现黑屏问题 本文链接:https://blog.csdn.net/baidu_34248947/article/details/89377983 我 ...

  4. Android 9.0 蓝牙功能之一:蓝牙音乐

    Android 9.0 蓝牙功能之一:蓝牙音乐 本章节记录如何构建蓝牙音乐. 文章目录 Android 9.0 蓝牙功能之一:蓝牙音乐 主要流程 相关代码 其他要点: 蓝牙AG_EVENT广播 (手机 ...

  5. android 6.0蓝牙服务开启,Android应用开发之Android 6.0 蓝牙搜索不到设备原因,MIUI权限申请机制方法...

    本文将带你了解Android应用开发Android 6.0 蓝牙搜索不到设备原因,MIUI权限申请机制方法,希望本文对大家学Android有所帮助. 为提供更高的数据保护   Android6.0版本 ...

  6. Android仿网易云音乐中锁屏后在开锁界面插屏功能

    这个功能实现起来应该有多种方式,可以使用WindowManager创建window的方法. 在本文中我们使用开启一个Activity来充当锁屏界面. 实现步骤有以下两步: 一.后台开启一个Servic ...

  7. Android 系统(271)---进程、守护进程的实现及进程拉活

    进程.守护进程的实现及进程拉活 1,概念 1)守护进程(Daemon) 是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某些任务.android中守护进程的实现主要由Service来完成. ...

  8. android 6.0锁屏,安卓 Android 6.0~9.0 手机/平板清除锁屏密码教程 —— 让您瞬间变大神!...

    摘要 生活中总是有不少粗枝大叶的马大哈,一不小心操作失误或睡的太久就把锁屏密码给忘了!焦急.懊恼.彷徨--都已经于事无补!还是试试本教程吧!本教程只对安卓 Android 6.0~9.0 并且已经 R ...

  9. android Ble4.0蓝牙开发之搜索慢、startLeScan()过时,6.0以上不需要定位权限也能快速搜索到蓝牙设备

    项目中需要用到android Ble蓝牙4.0开发技术,于是开启了蓝牙填坑之旅,说实话,蓝牙开发坑真多,跳出一个又进入下一个,每次遇到 问题,就觉得不可能解决了,还好在自己的摸索中,都一一的化解了,以 ...

最新文章

  1. java jeditorpane 自动换行_JDIC 中利用WebBrowser内置浏览器到java application中 | 学步园...
  2. python图像边缘提取_python通过robert、sobel、Laplace算子实现图像边缘提取详解
  3. 传智播客JavaWeb day11--事务的概念、事务的ACID、数据库锁机制、
  4. c语言分配内存空间方法,C语言之动态分配内存空间
  5. leetcode538 把二叉搜索树转换成累加树
  6. CentOS 6.3 下用ntfs-3g挂载Windows NTFS分区
  7. jvm类加载机制是怎么样的
  8. 解题报告:hdu1248寒冰王座 - 完全背包模板
  9. APP签名MD5获取
  10. ims系统 呈现服务器,基于IMS的呈现服务器的设计与实现
  11. JavaScript中通过点击单选框动态显示和隐藏组件
  12. 自己用到的相关Linux命令,谨以记录
  13. 局域网下的两个 QQ 好友进行在线文件传输抓包
  14. 弹力球C语言课程设计,弹力球游戏c语言代码
  15. A1339. JZPLCM(顾昱洲)|树状数组|hash表|逆元|分解质因数
  16. 【修身养性】那些看不见的教养
  17. shell打开wifi命令_shell WIFI
  18. 全球与中国具有集成保护功能的共模滤波器(CMF)市场深度研究分析报告
  19. 400 : perceived to be a client error 错误
  20. python 灰度改二值_python实现图片二值化及灰度处理方式

热门文章

  1. 海外SDK之----------苹果支付
  2. 好架构是进化来的,不是设计来的(58架构演进)
  3. 【Java基础快速入门】概述及开发环境搭建
  4. 手写签名更改为透明背景png图片
  5. 服务器怎么安装exis系统,exis 服务器安装
  6. Excel查找2列相同的数据,并且返回对应列的另1列数据
  7. linux ps4模拟器下载地址,PS4模拟器PC版下载
  8. Teams下载安装教程
  9. 使用阿里云提供的短信服务发送短信(个人版)
  10. office2007的Excel当中如何打开两个独立窗口