两个类:
1、SensorTest类,是Acvitivity
2、SensorListenerTest类,实现了SensorEventListener类,
SensorTest.java:
代码
package com.sensor;
import android.app.Activity;
import android.os.Bundle;
public class SensorTest extends Activity {
/** Called when the activity is first created. */
SensorListenerTest sensorListenerTest;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 传参数的时候,用this,不是自己新建的Context
sensorListenerTest = new SensorListenerTest(this);
}
// 添加OnResume和OnStop,注册和取消Sensor服务。
@Override
protected void onResume() {
// 监听服务,在activity和Listener里面都要注册,这是一个难点。不要只在一个地方注册。
// TODO Auto-generated method stub
super.onResume();
sensorListenerTest.enableSensor();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
sensorListenerTest.disableSensor();
}
}
SensorListenerTest.java
代码
package com.sensor;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;
public class SensorListenerTest implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor sensor;
private float mLastX, mLastY, mLastZ;
private Context mContext;
public SensorListenerTest(Context context) {
mContext = context;
// 在构造函数里面注册Sensor服务
enableSensor();
}
// 注册传感器服务,在本java和Activity里面都要注册,但是取消注册的时候,只在activity里面取消注册即可。
public void enableSensor() {
// 在这里真正注册Service服务
mSensorManager = (SensorManager) mContext
.getSystemService(Context.SENSOR_SERVICE);
sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
if (mSensorManager == null) {
Log.v("sensor..", "Sensors not supported");
}
mSensorManager.registerListener(this, sensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
// 取消注册传感器服务
public void disableSensor() {
if (mSensorManager != null) {
mSensorManager.unregisterListener(this);
mSensorManager = null;
}
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if (event.sensor == null) {
return;
}
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
mLastX = event.values[SensorManager.DATA_X];
mLastY = event.values[SensorManager.DATA_Y];
mLastZ = event.values[SensorManager.DATA_Z];
String sX = String.valueOf(mLastX);
String sY = String.valueOf(mLastY);
String sZ = String.valueOf(mLastZ);
Log.v("mLastX==", sX);
Log.v("mLastY==", sY);
Log.v("mLastZ==", sZ);
}
}
}
这样,显示如下图:
总结:在普通的java类里面,获得SensorManager的服务和具体的Sensor,
不像在activity里面(不需要context作为参数,就可以直接获取),
所以用构造函数的context作为参数,让它获得SensorManager的服务和具体的Sensor,在activity里面,传递的context参数,不是像普通的java类那样定义一个context,而是传递this。这点需要注意。
再一个,注册Sensor服务:
1、在普通的java类里面,在构造函数里面执行注册Sensor,这样能够保证用这个java类的时候,Sensor服务就能启动,
2、在activity里面,也要注册Sensor,1、2的注册缺一不可,这个也是一个弄了很久才知道的。至于activity注册Sensor,常在程序刚开始执行的时候,就注册。常在OnResume里面执行注册。