Android学习——传感器

传感器(本机传感器)

概述

大多数安卓设备都内置了传感器,用来测量移动,方向和各种环境条件。
Android平台支持以下三类传感器:

  • 这些传感器能够提供精度高且准确的原始数据。
  • 如果要监视三维设备运动或定位,或者监视设备周围的环境变化,那么传感器会极其有用。
  • 例如:游戏可以追踪设备重力感应器的读数来推断复杂的用户手势和动作,比如倾斜,摇晃,旋转或摆动。
  • 同样地,天气应用程序可以使用设备温度传感器和湿度传感器来计算并报告dewpoint,旅行应用程序可以使用地磁传感器和加速计来报告罗盘方位。

1.运动传感器:这些传感器测量三个轴的加速力和旋转力。这一类别包括加速度计,重力感应器,陀螺仪和旋转矢量传感器。
2.环境传感器:这些传感器测量各种环境参数,例如环境空气温度和压力,照明和湿度。此类别包括了气压计,光度计和温度计。
3.位置传感器:这些传感器测量了设备的物理位置。此类别包括方向传感器和磁力计。

Google文档上把传感器类型分为传感器坐标轴、基础传感器和复合传感器(动作传感器、姿势传感器、未校准传感器和互动传感器)

更加具体的可以参考:https://source.android.google.cn/devices/sensors/sensor-types

获取本机支持的传感器

Android传感器框架是android.hardware包的一部分,包含下面的类和接口:

  • SensorManager :你能使用这个类来创建一个传感器服务的实例。这个类提供了各种方法类访问和列举传感器,注册和注销传感器事件监听,并获取相应的信息。这个类也提供了几个传感器的常量,用户报告传感器的精确度,设置数据获取速率,和校准传感器。
  • Sensor :你能使用这个类类创建一个指定传感器的实例。这个类提供了各种方法让你确定传感器的功能。
  • SensorEvent :系统使用这个类来创建一个传感器对象,它提供了关于传感器事件的信息。一个传感器事件包含一下信息:原始传感器数据,这类传感器产生的事件,数据的准确性,和事件的时间戳。
  • SensorEventListener :你能使用这个接口来创建两个回掉方法,当传感器的值改变或者当传感器的精度改变的时候,它接受通知(传感器事件)
        SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

获取本机全部传感器列表

package com.example.sensor;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取系统传感器
        SensorManager sm= (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        //通过传感器获取本机所有的传感器
        List<Sensor> sensors=sm.getSensorList(Sensor.TYPE_ALL);
        for (Sensor s:sensors){
            Log.i("tag",s.toString());
        }
    }
}

在这里插入图片描述

获取指定传感器

可以通过下图的代码来获取指定的传感器, 需要选择合适的传感器类型
在这里插入图片描述
返回一个Sensor对象

        //获取指定的某一个传感器,下面为加速度传感器
        Sensor type_accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        if(type_accelerometer!=null){
            Log.i("type_accelerometer",type_accelerometer.toString());
        }

在这里插入图片描述
传感器监听器

        sm.registerListener(new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
                //传感器数据变化,在该方中我们可以获取传感器变化的值
            }

            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {
                //传感器精度变化
            }
        },type_accelerometer,SensorManager.SENSOR_DELAY_NORMAL);
  • SENSOR_ DELAY _GAME 如果利用传感器开发游戏, 建议使用该值。 一般大多数实时行较高的游戏使用该级别。 (20000微 秒)
  • SENSOR_ DELAY NORMAL默认的获取传感器数据的速度。 标准延迟,对于- -般的益智类游戏或者EASY界别的游戏可以使用,但过低的采样率可能对一些赛车类游戏有跳帧的现象。 (200000微秒)
  • SENSOR DELAY_ _UI 若使用传感器更新U,建议使用该值。(60000微秒)
  • SENSOR DELAY _FASTEST :最低延迟,-般不是特别灵敏的处理不推荐使用,该模式可能造成手机电量大量消耗,而且由于传递的为大量的原始数据,算法处理不好将会影响游戏逻辑和U的性能。(0微秒延迟)不推荐使用

传感器坐标系

通常,传感器框架使用一个标准的3维坐标系来表达数据值。对于大多数传感器, 当设备放置默认的方向(看下图) 的时候,坐标系被定义和设备的屏幕相关。当设备放置为它默认的方向,X轴是水平并指向右边,Y轴是竖直并指向上方,并且Z轴指向屏幕面的外侧。在这个系统,坐标系统有负的2值。这个坐标系被用于下面的传感器:

  • 加速度传感器 (Acceleration sensor)
  • 重力传感器(Gravity sensor)
  • 陀螺仪传感器 (Gyroscope)
  • 线性加速度传感器 (Linear acceleration sensor)
  • 磁场传 感器(Geomagnetic field sensor)

许多传感器的传感器事件值在相对于设备静止的特定坐标系中表示。
在这里插入图片描述

        sm.registerListener(new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
                //传感器数据变化,在该方中我们可以获取传感器变化的值
                float x=event.values[0];
                float y=event.values[1];
                float z=event.values[2];
                textView_content.setText("x="+x+"y="+y+"z="+z);
            }

            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {
                //传感器精度变化
            }
        },type_accelerometer,SensorManager.SENSOR_DELAY_NORMAL);

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/UUUUUltraman/article/details/90177244