我是靠谱客的博主 曾经茉莉,最近开发中收集的这篇文章主要介绍Android_这点事_传感器Android_这点事_传感器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Android_这点事_传感器

传感器的坐标体系

安卓中的传感器中的传感数据都是以下图所示的坐标体系进行传递的,这张图是Android传感器的基础
在这里插入图片描述
X轴 从设备的左边到右边
Y轴 从设备的底部到顶部
Z轴 从设备的背面穿过设备指向屏幕

加速度传感器

加速度传感器又叫G_Sensor,是能够测量加速力的电设备,加速力就是物体在加速过程中施加给物体的一种力
返回设备的X轴,Y轴,Z轴方向上的加速度值
工作原理:惯性原理
举例:重力加速度为 9.8m/s,即当物体自由下落的时候的物体的加速度为9.8

磁场传感器

磁场传感器返回设备在X轴,Y轴,Z轴的磁力值
单位:uT 即微特斯拉
应用:指南针罗盘

陀螺仪

返回设备在围绕X轴,Y轴,Z轴的角速度值
单位:弧度
说明:返回的是一个速度值,这个值反应设备翻转的快慢

相关传感器代码

package com.hengda.insdemo.ins.controller

import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.util.Log
import com.hengda.insdemo.ins.callback.SensorCallback

/**
 * 作者:hanshizhe
 * 邮箱:hanshizhe@foxmail.com
 * 时间:2018/12/5 9:05
 * 描述:方向传感器(加速度、地磁)控制器
 *
 *
 * 加速度传感器              -->  返回X轴Y轴Z轴方向的加速度值,      单位为m/S2
 * 接近传感器               --> 返回是否有物体接近它,一些传感器也可以告诉你距离有多远通常作用范围只有5厘米
 * 地磁传感器               --> 返回设备在X轴或Y轴或Z轴的磁力值,   单位为 ut 即微特斯拉  应用为:指南针,罗盘
 * 陀螺仪                  --> 返回设备围绕X轴或Y轴或Z轴的角速度值,单位为 弧度     <这里返回的是一个速度值>
 */
class SensorController(var manager: SensorManager, var callback: SensorCallback) : SensorEventListener {

    companion object {
        const val DEGREE_ARRAY_SIZE = 100
    }
    //用来保存加速度传感器的值
    private var accelerometerValues = FloatArray(3)
    //用来保存地磁传感器的值
    private var magneticValues = FloatArray(3)
    //用来保存最终的结果
    private var values = FloatArray(3)
    //
    private var r = FloatArray(9)
    //保存角度
    private var degreeArray = DoubleArray(DEGREE_ARRAY_SIZE)
    private var arrayIndex = 0
    /*
    * 注册传感器监听
    *  以下为硬件传感器的采样频率,采样评率依次变慢
    *  SensorManager.SENSOR_DELAY_FASTEST
    *  SensorManager.SENSOR_DELAY_GAME
    *  SensorManager.SENSOR_DELAY_UI
    *  SensorManager.SENSOR_DELAY_NORMAL
    */
    fun register(): Boolean {
        if (manager == null) return false
        //加速度传感器
        val r1 = manager.registerListener(this, manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI)
        //磁场传感器
        val r2 = manager.registerListener(this, manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI)
        //陀螺仪
        val r3 = manager.registerListener(this, manager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR), SensorManager.SENSOR_DELAY_NORMAL)
        return r1 && r2 && r3
    }

    /*
    * 取消注册
    */
    fun unregister() {
        try {
            manager.unregisterListener(this)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    /*
    * 取消注册
    */
    override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {

    }

    /*
    * 传感器发生变化
    */
    override fun onSensorChanged(event: SensorEvent) {
        if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
            //加速度值
            accelerometerValues = event.values.clone()
            callback.onAccs(event.values.clone())
        } else if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) {
            //地磁传感器
            magneticValues = event.values.clone()
            callback.onMagnetic(magneticValues)
        } else if (event.sensor.type == Sensor.TYPE_ROTATION_VECTOR) {
            //陀螺仪
            callback.onRot(Math.toDegrees(event.values[0].toDouble()))
        }
        //通过加速度值与地磁传感器的值计算出数组为9的大小的矩阵
        SensorManager.getRotationMatrix(r, null, accelerometerValues, magneticValues)
        //根据旋转矩阵计算设备的方向 输出弧度 values
        SensorManager.getOrientation(r, values)
        //通过弧度计算出角度
        var degree = Math.toDegrees(values[0].toDouble())
        //计算角度
        if (degree < 0) degree += 360
        //获取100个角度数据计算平均值
        degreeArray[arrayIndex] = degree
        arrayIndex++
        if (arrayIndex == DEGREE_ARRAY_SIZE) {
            degree = computeAvgDegree(degreeArray)
            //回调角度
            callback.onAngle(degree)
            arrayIndex = 0
        }
    }

    /*
    * 计算平均角度(冒泡排序取中间值)
    */
    private fun computeAvgDegree(degreeArray: DoubleArray): Double {
        val array = degreeArray.clone()
        val count = array.size
        for (i in 0 until count - 1) {
            for (j in 0 until count - i - 1) {
                if (array[j] > array[j + 1]) {
                    val a = array[j + 1]
                    array[j + 1] = array[j]
                    array[j] = a
                }
            }
        }
        return array[count / 2]
    }
}

参考

Android手机中的加速度计与陀螺仪
Android操作系统11种传感器介绍

最后

以上就是曾经茉莉为你收集整理的Android_这点事_传感器Android_这点事_传感器的全部内容,希望文章能够帮你解决Android_这点事_传感器Android_这点事_传感器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部