两个类:
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。这点需要注意。
【以上转自 :http://www.j2megame.com/html/xwzx/ty/2704.html】
有用参考:
Android教程之实现动作感应技术
4.SensorListener必须实现两个方法
这篇博客详细介绍了在Android中如何实现动作感应技术,主要涉及SensorTest Activity和实现SensorEventListener的SensorListenerTest类。文章指出在非Activity类中需要通过构造函数传入context来获取SensorManager服务。同时,重点讲解了SensorListener接口的两个关键方法:onAccuracyChanged和onSensorChanged,用于处理传感器数据变化和精度变化。

941

被折叠的 条评论
为什么被折叠?



