项目中要用到计步器,大家都在推荐pedometer,可是我导入到项目中,使用android真机测试,没有报错,onStepCount不执行。查看库的源码,看到以下代码:
class SensorStreamHandler() : EventChannel.StreamHandler {
private var sensorEventListener: SensorEventListener? = null
private var sensorManager: SensorManager? = null
private var sensor: Sensor? = null
private lateinit var context: Context
private lateinit var sensorName: String
private lateinit var flutterPluginBinding: FlutterPlugin.FlutterPluginBinding
constructor(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding, sensorType: Int) : this() {
this.context = flutterPluginBinding.applicationContext
this.sensorName = if (sensorType == Sensor.TYPE_STEP_COUNTER) "StepCount" else "StepDetection"
sensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
sensor = sensorManager!!.getDefaultSensor(sensorType)
this.flutterPluginBinding = flutterPluginBinding
}
override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
if (sensor == null) {
events!!.error("1", "$sensorName not available",
"$sensorName is not available on this device");
} else {
sensorEventListener = sensorEventListener(events!!);
sensorManager!!.registerListener(sensorEventListener,
sensor, SensorManager.SENSOR_DELAY_FASTEST);
}
}
override fun onCancel(arguments: Any?) {
sensorManager!!.unregisterListener(sensorEventListener);
}
}
可以看出插件android原生部分,是通过调用系统的计步传感器完成,可是我为什么调用不成功呢?接着面向google编程,在文档有句话:
注意:您必须声明ACTIVITY_RECOGNITION权限,以便您的应用在运行 Android 10 (API 级别 29) 或更高版本的设备上使用此传感器。
原来如此,没有申请权限。在AndroidManifest.xml下添加以下代码:
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
在调用pedometer之前,用permission_handler申请权限:
if (Platform.isAndroid) {
hasPermission = await Permission.activityRecognition.request().isGranted;
if (hasPermission) {...}
}
再次编译运行,果然可以可以获取到步数。
再逼逼几句,计步器传感器获取的自手机上次重启之后的步数,可以根据需求对步数进行计算,再就是大家最关系的,app关闭之后,还可以继续计步,毕竟是官方api,所有烦人Android进程保活可以不用操心了。