#1. Android 手机自带系统级的 运动健康App
于是我整理一份列表,如下:
- 三星手机上的 “三星健康” ; 三星开发者平台:SDK: Hello Health Data | Samsung Developers
- 华为手机上的“运动健康”;华为开发者平台:SDK 文档中心
- 小米手机上的“小米运动健康”; 小米开放平台:接入网址 小米健康云开放平台
- 魅族手机上的: 计步器; ( 😭 还没找到...)
- oppo手机上的: 运动计步; ( 😭 还没找到...)
- vivo手机不自带“记步数”功能的
⚠️ 数据同步 需要相应的手机官方授权,见上列表,我目前找到了 三星/ 华为/ 小米(因为计步器是华米出品)对接授权平台,链接中如何对接 一有尽有!
如华为示例:(这里就偷懒截图显示了)
⚠️ 注意:以上对接 需要去申请账号,创建应用,获取密钥之类的数据来授权!
对于第三方应用同步数据,比如: 微信 - 微信运动 开启后能获取到对于手机上的步数,这里我试了华为手机和oppo手机,发现“微信运动”都能显示出手机系统级的健康运动类应用的步数;但是我在vivo手机上刚开启微信运动后,步数显示 0,但是之后你的步数会实时记录显示。
阐明理解:(属于个人理解)
1. 微信是通过对接相应的授权平台,开启“微信运动”后,如果手机存在系统级的计步器,即同步手机自带计步器的步数显示。
2. 对于手机不存在系统级的计步器,如vivo手机,开启“微信运动”后,也无法获取到已经运动的步数,只会显示0;但是后面会显示步数,是可以通过实现Android自带的 步测器传感器 来记录步数。
(备注:具体记录步数的灵明度数值,步数统计算法... 微信的高大上,我也不知道具体的实现,就不去做过多猜想)
3. 另外,我们也值得注意,微信已经是手机常驻型级别的应用,所以它在手机的后台进程中会存在后台服务,这也为 记录步数 这样行为提供了监听的环境。
4. 虽然 Android自带的计步传感器(Sensor.TYPE_STEP_COUNTER)可以在应用关闭的时候继续工作,因为是Android系统自带的,但是它是重启以来用户迈出的步数,所以这个统计出来的数据并不是每天的步数,只是个总数,而且每次手机重启后,都会置0!所以需要实现 持久的监听步数,就需要存在常驻型的服务,得到手机系统的认可,不会杀掉你的进程,这对于现在对于Android 权限越来越重视的情况下,我研究不来这样的“技术”!(欢迎讨论...)
5. 如果我们的App必须要实现实时准确隔天计步的功能,其实还有一个方式可以,对接微信运动小程序来同步微信运动的数据,具体怎么对接,欢迎去百度,Google。
如果要实现打开App来准确计步的功能:其实也可以用Android自带传感器来实现;
以下简单介绍下两个传感器:
#2. Android自带传感器
1. 使用计步器传感器
以下代码展示如何获取默认计步器传感器的实例:
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
val sensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER)
计步器传感器 提供自已激活传感器后最后一次重启以来用户迈出的步数。与步测器传感器相比,计步器的延迟时间更长(最多 10 秒),但精确度更高。
⚠️ 注意:如要保护运行应用的设备上的电池,您应使用
JobScheduler
类,从而以特定的时间间隔从计步器传感器检索当前值。尽管不同类型的应用需要不同的传感器读取间隔,但是除非您的应用需要来自传感器的实时数据,否则应尽可能延长此间隔。
⚠️ 注意:因为是重启以来用户迈出的步数,所以这个数据并不是每天的步数,只是个总数,而且每次手机重启后,都会置0!
2. 使用步测器传感器
以下代码展示如何获取默认步测器传感器的实例:
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
val sensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR)
每次用户迈步时,步测器传感器都会触发事件。延迟时间预计将低于 2 秒。
⚠️ 注意:使用 传感器 您必须声明 ACTIVITY_RECOGNITION 权限,以便您的应用在运行 Android 10 (API 级别 29) 或更高版本的设备上使用此传感器。
需要在manifest中添加:
<!-- 您必须声明 ACTIVITY_RECOGNITION 权限,以便您的应用在运行 Android 10 (API 级别 29) 或更高版本的设备上使用此传感器。--><uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
在需要的地方(Activity)中添加申请权限:
private const val COARSE_REQUEST = 1001/*** Permissions required to make the app work!*/private val CHECK_PERMISSIONS = arrayOf(Manifest.permission.ACTIVITY_RECOGNITION)// 请求权限private fun requestPermissions() {ActivityCompat.requestPermissions(this,CHECK_PERMISSIONS,COARSE_REQUEST)}// 处理权限后回调方法override fun onRequestPermissionsResult(requestCode: Int,permissions: Array<out String>,grantResults: IntArray) {when (requestCode) {COARSE_LOCATION_REQUEST -> {if (allPermissionsGranted()) {// 同意了授权}else{// 拒绝了授权}}}}/*** Check if all permission specified in the manifest have been granted*/private fun allPermissionsGranted(): Boolean {return CHECK_PERMISSIONS.all {ContextCompat.checkSelfPermission(baseContext, it) == PackageManager.PERMISSION_GRANTED}}