Android实现传感器功能

作者:RKGG爱吃鱼 时间:2022-05-26 02:50:10 

Android传感器概述:动作传感器、环境传感器、位置传感器等,如方向传感器(电子罗盘)、重力传感器(横纵切换)。Android SDK支持的传感器并不是每一部Android手机均支持。

动作传感器:在三个轴上测量加速度和旋转角度,包括加速度、重力、陀螺仪;

环境传感器:测量环境参数,包括湿度、光线、温度;

位置传感器:测量设备物理位置,包括方向、磁力。

ASF(Android传感器框架)功能:确定当前Android设备内置传感器;确定传感器技术指标,如传感器测量的最大范围、制造商等;获取传感器回传数据,以及定义回传数据的精度;注册和注销传感器事件 * ,用于监听数据回传。

硬件传感器:加速、温度、陀螺仪、光线、磁场、重力(视情况而定)、线性加速(视情况而定)、湿度、压力、临近、旋转向量

软件传感器:方向。

SensorManager类:创建sensor service实例。访问、枚举、注册、注销 * 、精度、频率等。

Sensor类:提供获取传感器参数。

SensorEvent类:创建传感器事件对象,该对象提供与传感器有关信息,事件对象包括的信息有原始传感器回传数据、类型、精度以及触发事件。

SensorEventListener接口:包含两个回调方法,当传感器回传值或精度发生变化时,系统调用这两个方法。

动作传感器(Motion):监听设备动作的传感器有5个,加速、陀螺仪纯硬件传感器,重力、线性加速、旋转。监测Android手机的动作,如倾斜、震动等。设备的移动通常是对用户输入的直接反应,如游戏中控制小球;设备所处物理环境也会反应在设备的动作上,如手机放在车上。所有动作传感器均会返回3个浮点数值(长度为3的数组)。

重力Demo:设备从左到右推动,X轴加速度为正值;反向Y轴加速度为正值,若向上以Am/s方加速度推动,则Z轴加速度为A+9.81,若计算实际加速度,需要减9.81。

位置传感器:磁场、方向传感器,邻近传感器(测量设备正面到某一个邻近物体的距离)。对于确定设备在真实世界中的物理位置非常有用。前两者返回三个值,邻近返回一个值。

方向传感器:

SensorEvent.values[0]:绕着Z轴旋转的角度。若Y轴正对北方(正常拿手机方向),该值为0,反之,为南,该值180,Y轴指向东方,该值90,反之270。

SensorEvent.values[1]:绕着X轴旋转的角度,当从Z轴正方向朝Y轴正方向,该值为正值,反之,为负值,该值在-180到180中间变动。

SensorEvent.values[2]:绕着Y轴旋转的角度。当从Z轴正方向朝X轴正方向,该值为正值,反之,为负值,该值在-180到180中间变动。

邻近传感器:SensorEvent.values[0]:手机正面距离邻近物体的距离(CM)。

环境传感器:Android提供了4个传感器检测外部环境,如湿度、温度、压强、光线,并不是所有传感器均有,需要提前判断。环境传感器只返回一个值。

TYPE_AMBIENT_TEMPERATURE:event.values[0]  ℃  温度

TYPE_LIGHT:event.values[0]  lx  光线

TYPE_PRESSURE:event.values[0]  hPa  压强

TYPE_RELATIVE_HUMIDITY:event.values[0]  RH(%)  湿度

一、获得当前设备所有的传感器列表

import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.util.List;
 
public class MainActivity extends AppCompatActivity {
    private TextView tvSensor;
    private SensorManager sensorManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvSensor = (TextView) findViewById(R.id.tvSensor);
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
        for (Sensor sensor:sensors){
            tvSensor.append(sensor.getName()+"\n");
        }
    }
}

二、动作传感器示例

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity implements SensorEventListener {
    private TextView tvAccelerometer;
    private SensorManager sensorManager;
    private float[] gravity = new float[3];
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvAccelerometer = (TextView) findViewById(R.id.tvAccelerometer);
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    }
 
    @Override
    public void onSensorChanged(SensorEvent event) {
        switch (event.sensor.getType()){
            case Sensor.TYPE_ACCELEROMETER:
                final float alpha = (float)0.8;
                gravity[0] = alpha*gravity[0]+(1-alpha)*event.values[0];
                gravity[1] = alpha*gravity[1]+(1-alpha)*event.values[1];
                gravity[2] = alpha*gravity[2]+(1-alpha)*event.values[2];
                String accelerometer = "加速度\n"+"X:"+(event.values[0]-gravity[0])+"\n"+"Y:"+
                        (event.values[1]-gravity[1])+"\n"+"Z:"+(event.values[2]-gravity[2]);
                Log.d("Z",String.valueOf((event.values[2]-gravity[2])));
                tvAccelerometer.setText(accelerometer);
                break;
            case Sensor.TYPE_GRAVITY:
                gravity[0] = event.values[0];
                gravity[1] = event.values[1];
                gravity[2] = event.values[2];
                break;
            case Sensor.TYPE_PROXIMITY:
                setTitle(String.valueOf(event.values[0]));
            default:
                break;
        }
    }
 
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
 
    }
    protected void onResume(){
        super.onResume();
        sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_UI);
        sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),
                SensorManager.SENSOR_DELAY_FASTEST);
        sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),
                SensorManager.SENSOR_DELAY_NORMAL);
    }
    protected void onPause(){
        super.onPause();
        sensorManager.unregisterListener(this);
    }
}

以下是小米2s测试效果:

Android实现传感器功能

来源:https://blog.csdn.net/xiaoxun2802/article/details/60866340

标签:Android,传感器
0
投稿

猜你喜欢

  • Android的ImageButton当显示Drawable图片时就不显示文字

    2023-11-25 17:40:00
  • java导出Excel通用方法实例

    2023-10-27 04:43:33
  • Java(基于Struts2) 分页实现代码

    2023-11-04 05:58:58
  • Spring中多配置文件及引用其他bean的方式

    2023-07-01 17:31:03
  • Android中删除Preference详解

    2021-08-09 21:41:19
  • React Native学习之Android的返回键BackAndroid详解

    2023-04-19 14:15:28
  • Java提取两个字符串中的相同元素方法

    2023-05-16 14:18:00
  • SQLServer批量插入数据的三种方式及性能对比

    2022-07-01 12:05:07
  • Android USB转串口通信开发实例详解

    2022-01-05 15:28:17
  • Java Spring AOP源码解析之事务实现原理

    2023-09-10 02:39:46
  • c# 类成员的可访问性代码详解

    2022-03-14 22:43:59
  • 详解Java中的Lambda表达式

    2021-08-17 00:06:00
  • Android实现沉浸式导航栏实例代码

    2023-02-18 02:15:17
  • Android中 动态改变对话框值的方法

    2023-08-17 19:44:30
  • 举例讲解设计模式中的访问者模式在Java编程中的运用

    2022-04-04 08:00:45
  • C#实现五子棋游戏

    2022-07-26 12:55:34
  • Android Volley框架使用源码分享

    2023-09-10 09:43:44
  • Java中BigDecimal类的add()的使用详解

    2023-03-07 16:12:11
  • android同时控制EditText输入字符个数和禁止特殊字符输入的方法

    2021-08-01 14:16:46
  • Android RecycleView添加head配置封装的实例

    2021-09-14 00:05:58
  • asp之家 软件编程 m.aspxhome.com