方案实现:通过使用手机自带的磁场传感器来对实时数据进行处理分析
磁场传感器会返回三个方向的磁感应强度,分别是X,Y,Z,需要对这几个数据做处理得出当前的总磁感应强度
磁感应强度计算公式:
rawTotal = sqrt(x2+y2+z2)
初始化磁场传感器
private var sensorManager: SensorManager? = null
override fun onCreate(savedInstanceState: Bundle?) {
...
//实例化传感器管理
sensorManager = activity?.getSystemService(Context.SENSOR_SERVICE) as SensorManager
//注册磁场传感器监听器
sensorManager?.registerListener(
this@SensorScanActivity,//继承SensorEventListener接口并重写方法,或者新建一个listener对象
sensorManager?.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL)
}
重写Lisenter方法
override fun onSensorChanged(sensorEvent: SensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
//如果当前页面处于前台可见才执行下面的视图更新,否则不执行。
if (!userVisibleHint) return
//保持屏幕常亮
activity?.getWindow()?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
//分别计算三轴磁感应强度
val xLateral = sensorEvent.values[0].toDouble()
val yLateral = sensorEvent.values[1].toDouble()
val zLateral = sensorEvent.values[2].toDouble()
//Log.d(TAG,X_lateral + "");
//计算出总磁感应强度
val rawTotal =
sqrt(xLateral * xLateral + yLateral * yLateral + zLateral * zLateral);
}
}
override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
}
启动和关闭传感器
启动传感器只需要注册监听,而关闭传感器同样仅需要移除监听
sensorManager?.unregisterListener(this)
金属探测器的实现
要实现金属探测器,则需要先假定一个初始磁感应强度,比如在开阔地带的一个计算的初始值,保存下来,再通过实时计算的总磁感应强度做对比,如果高于初始磁感应强度可使用进度条升高进行显示,具体的显示方法和磁场大小敏感度需要自行决定