传感器编程

Android手机发展到今天,已经远远超出原来“打电话”的基本功能。现代的Android手机作为一个移动计算设备,不仅能够浏览网络,播放多媒体文件,还带有大量传感器,如磁场,加速度等。手机厂商为这些传感器提供了驱动程序,Android系统提供了这些驱动程序的API。

传感器就像人类的感官一样,能够接收数据,交由处理器分析。Android中使用传感器的步骤都是通用的,无非就是注册传感器并设置一些参数,然后设置监听器,编写如何处理数据的回调函数。

获取所有可用传感器

package com.gacfox.sensordemo;

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
{

    private SensorManager sensorManager;

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

        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        List<Sensor> sensorList = sensorManager.getSensorList(Sensor.TYPE_ALL);
        for(Sensor sensor : sensorList)
        {
            Log.v("sensorDemo", "sensorName:" + sensor.getName());
        }
    }
}

上面代码可以查看手机当前支持哪些传感器。

输出结果:

07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:LIS3DSH Accelerometer
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:AKM Calibration Lib
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:AK09911 Magnetometer Uncalibrated
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:L3GD20 Gyroscope
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:L3GD20 Gyroscope Uncalibrated
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:RPR0521 Proximity & Light
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:RPR0521 Proximity & Light
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Gravity
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Linear Acceleration
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Rotation Vector
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Step Detector
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Step Counter
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Significant Motion Detector
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Game Rotation Vector
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Geomagnetic Rotation Vector
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Orientation
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:AMD
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:RMD
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Basic Gestures
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Facing
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Tilt
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Pedometer
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:PEDESTRIAN-ACTIVITY-MONITOR
07-16 13:17:02.104 1668-1668/com.gacfox.sensordemo V/sensorDemo: sensorName:Motion Accel

例子:使用加速度传感器

package com.gacfox.sensordemo;

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.widget.TextView;

import java.text.DecimalFormat;


public class MainActivity extends AppCompatActivity implements SensorEventListener
{

    private SensorManager sensorManager;
    private TextView textView;

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

        textView = (TextView) findViewById(R.id.tv);

        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    }

    @Override
    protected void onResume()
    {
        super.onResume();
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
    }

    @Override
    protected void onStop()
    {
        sensorManager.unregisterListener(this);
        super.onStop();
    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent)
    {
        float[] values = sensorEvent.values;
        DecimalFormat decimalFormat=new DecimalFormat("####.00");
        textView.setText("X:" + decimalFormat.format(values[0]) + " Y:" + decimalFormat.format(values[1]) + " Z:" + decimalFormat.format(values[2]));
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i)
    {
    }
}

注意:建议在onResume()中注册传感器的监听器,在onStop()中取消注册监听器。要求传感器一直捕获数据是比较占用资源的。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。