Android传感器的简单使用-1

本文介绍如何在Android应用中实现对传感器事件的监测,包括加速度传感器、重力传感器、临近传感器及光照传感器的数据读取与处理。通过实现SensorEventListener接口的方法,如onAccuracyChanged()和onSensorChanged(),可以响应传感器精度变化及数据更新。
摘要由CSDN通过智能技术生成

监视传感器事件

要监视原始的传感器数据,你需要实现两个通过SensorEventListener接口暴露的回调方法:onAccuracyChanged()onSensorChanged()。Android系统在任何发生下列事情的时候都会调用这两个方法:

  • 传感器精度的改变:

这种情况中,系统会调用onAccuracyChanged()方法,它提供了你要引用的发生精度变化的Sensor对象。精度使用以下四个状态常量之一来代表的:

SENSOR_STATUS_ACCURACY_LOW

SENSOR_STATUS_ACCURACY_MEDIUM

SENSOR_STATUS_ACCURACY_HIGH

SENSOR_STATUS_UNRELIABLE
  • 传感器报告新的值:

这种情况中,系统会调用onSensorChanged()方法,它提供了一个SensorEvent对象。SensorEvent对象包含了有关新的传感器数据的信息,包括:数据的精度、产生数据的传感器、产生数据时的时间戳、以及传感器记录的新的数据。

package com.senmar;

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity implements SensorEventListener {

    private TextView tvSensors,tvSensors1,tvSensors2;
    private SensorManager sensorManager;
    private float[] gravity = new float[3];//保存重力传感器数据

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //显示数据控件
        tvSensors = (TextView) findViewById(R.id.tvSensors);
        tvSensors1 = (TextView) findViewById(R.id.tvSensors1);
        tvSensors2 = (TextView) findViewById(R.id.tvSensors2);
        // 获取传感器服务
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {
        // 当传感器的精度发生改变时调用此方法

    }

    @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]) + "\nY:"
                    + (event.values[1] - gravity[1]) + "\nZ:"
                    + (event.values[2] - gravity[2]);
            tvSensors.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:// 临近传感器
            // 显示在标题
            tvSensors1.setText("临近\n"+String.valueOf((event.values[0])));
            break;
        case Sensor.TYPE_LIGHT:// 临近传感器
            // 显示在标题
            tvSensors2.setText("光照\n"+String.valueOf(event.values[0]));
            break;
        default:
            break;
        }
    }

//生命周期函数
    @Override
    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_UI);
        // 光照传感器
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),
                SensorManager.SENSOR_DELAY_UI);
    }

//生命周期函数
    @Override
    protected void onPause() {
        super.onPause();
        // 取消传感器监听
        sensorManager.unregisterListener(this);
    }

}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走到无路可退

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值