Android感应器Sensor的使用

Android SDKでは、以下のような種類のセンサー(Sensor)をサポートしており、
Android1.0/1.1和Android1.5的API略有不同。

支持的感应器种类
Android1.5
Sensor.TYPE_ACCELEROMETER・・・加速度感应器
Sensor.TYPE_MAGNETIC_FIELD・・・地磁感应器
Sensor.TYPE_ORIENTATION・・・方向感应器
Sensor.TYPE_GYROSCOPE・・・陀螺仪感应器
Sensor.TYPE_LIGHT・・・亮度感应器
Sensor.TYPE_PRESSURE・・・压力感应器
Sensor.TYPE_TEMPERATURE・・・温度感应器
Sensor.TYPE_PROXIMITY・・・近程感应器

Android1.0/1.1
SensorManager.SENSOR_ORIENTATION・・・方向感应器
SensorManager.SENSOR_ACCELEROMETER・・・加速度感应器
SensorManager.SENSOR_TEMPERATURE・・・温度感应器
SensorManager.SENSOR_MAGNETIC_FIELD・・・地磁感应器
SensorManager.SENSOR_LIGHT・・・亮度感应器
SensorManager.SENSOR_PROXIMITY・・・近程感应器
SensorManager.SENSOR_TRICORDER・・・三度仪感应器
SensorManager.SENSOR_ORIENTATION_RAW・・・方向感应器

※简单地说
Android1.0/1.1/1.5都支持的有,加速度,地磁,方向,亮度,温度,近程感应器
只支持Android1.5的有,陀螺仪,压力感应器
只支持Android1.0/1.1的有,三度仪感应器

感应器的使用方法
按照下列顺序来使用感应器センサーを使用するには、以下のような手順が必要です。
1.取得SensorManager实例
2.向SensorManager实例登录接受感应器信号的Listener
3.追加响应接收到的感应器动作

1.取得SensorManager实例
SensorManagerは、android.hardwareパッケージに含まれていますが、
SensorManagerのインスタンスは、newで作成するのでなく、
ActivityクラスのメソッドにあるgetSystemService(SENSOR_SERVICE)を呼び出すことで、
SensorManagerのインスタンスを取得します。

2.向SensorManager实例登录接受感应器信号的Listener
Android里接受感应器信号的Listener有
Android1.5中的SensorEventListener、
Android1.0/1.1中的SensorListener

Listener的登录,调用SensorManager实例的registerListener()方法。
Android1.5
第1个参数,接收信号的Listener实例
第2个参数,想接收的感应器类型的列表(List<Sensor>)。
第3个参数,接收频度。
Android1.0/1.1
第1个参数,接收信号的Listener实例
第2个参数,想接收的感应器类型的列表(List<Sensor>)和接受频度的BitField

在不同的设备上,能够使用的感应器是不一样的。
动手之前,最好确认一下想使用的感应器在该设备上能不能被使用。

可以通过确认下列值,来判断感应器能不能被使用。
Android1.5里,SensorManger类getSensorList()方法的返回值里包含的感应器
Android1.0/1.1里,SensorManger类getSensorList()方法的返回的BitField

3.追加响应接收到的感应器动作
在上面的处理2中作为接受感应器信号的Listener,必须在下面的2个方法里追加相应的处理
onAccuracyChanged()、onSensorChanged()がありますので、
具体的可以参照下面的源代码。
package com.adakoda.sensortest;

import java.util.List;

import android.app.Activity;
import android.hardware.Sensor;    // 1.5
import android.hardware.SensorEvent;    // 1.5
import android.hardware.SensorEventListener;    // 1.5
//import android.hardware.SensorListener; // 1.1
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;

public class SensorTestActivity extends Activity
implements SensorEventListener { // 1.5
//    implements SensorListener { // 1.1

private boolean mRegisteredSensor;
private SensorManager mSensorManager;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

mRegisteredSensor = false;
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
}

@Override
protected void onResume() {
super.onResume();

// 1.5
{
List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION);

if (sensors.size() > 0) {
Sensor sensor = sensors.get(0);
mRegisteredSensor = mSensorManager.registerListener(this,
sensor,
SensorManager.SENSOR_DELAY_FASTEST);
}
}

//        // 1.1
//        {
//            int sensors = mSensorManager.getSensors();
//            if ((sensors | SensorManager.SENSOR_ORIENTATION) != 0) {
//                mRegisteredSensor = mSensorManager.registerListener(this,
//                        SensorManager.SENSOR_ORIENTATION,
//                        SensorManager.SENSOR_DELAY_FASTEST);
//            }
//        }
}

@Override
protected void onPause() {
if (mRegisteredSensor) {
mSensorManager.unregisterListener(this);
mRegisteredSensor = false;
}

super.onPause();
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) { // 1.5
//    public void onAccuracyChanged(int sensor, int accuracy) { // 1.1
}

@Override
public void onSensorChanged(SensorEvent event) { // 1.5
//    public void onSensorChanged(int sensor, float[] values) { // 1.1

// 1.5
{
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
// values[0]:
// Azimuth, angle between the magnetic north direction and the Y axis,
// around the Z axis (0 to 359). 0=North, 90=East, 180=South, 270=West
// values[1]:
// Pitch, rotation around X axis (-180 to 180),
// with positive values when the z-axis moves toward the y-axis.
// values[2]:
// Roll, rotation around Y axis (-90 to 90),
// with positive values when the x-axis moves away from the z-axis.           
Log.v(”ORIENTATION”,
String.valueOf(event.values[0]) + “, ” +
String.valueOf(event.values[1]) + “, ” +
String.valueOf(event.values[2]));
}
}

//        // 1.1
//        {
//            if (sensor == SensorManager.SENSOR_ORIENTATION) {
//                // values[0]:
//                // Azimuth, rotation around the Z axis (0<=azimuth<360).
//                // 0 = North, 90 = East, 180 = South, 270 = West
//                // values[1]:
//                // Pitch, rotation around X axis (-180<=pitch<=180),
//                // with positive values when the z-axis moves toward the y-axis.
//                // values[2]:
//                // Roll, rotation around Y axis (-90<=roll<=90),
//                // with positive values when the z-axis moves toward the x-axis.
//                Log.v(”ORIENTATION”,
//                    String.valueOf(values[0]) + “, ” +
//                    String.valueOf(values[1]) + “, ” +
//                    String.valueOf(values[2]));
//            }
//        }
}
}

还可以参照下列资源
Android1.5
[Android] Redesigned Sensor Manager APIs(Android1.5) | The type SensorListener is deprecated – adakoda
Androi1.0/1.1
[Android] センサーマネージャー(SensorManager) – adakoda
关于感应器三轴的理解
[Android] センサー(Sensor)のAzimuth/Pitch/Roll – adakoda

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值