这一节简单介绍android 使用硬件资源中的传感器的一般流程
一、使用准备
1、接口
Android系统要使用硬件资源的传感器,要依赖于android.hardware.SensorEventListener接口,通过此接口可以监听传感器的各种事件。
SensorEventListener的接口代码为:
package android.hardware
public interface SensorEventListener
{
public void onSensorChanged(SensorEvent event);
public void onAccuracyChanged(Sensor sensor,int accuracy);
}
2、相关定义
2.1 X、Y、Z 定义
X轴: 传感器在水平面,延水平方向,从左向右的直线方向 。
Y轴: 传感器在水平面,垂直与水平X轴方向,从近端到远端的方向。
Z轴: 传感器平放在桌面(与重力成90度),指向天空的方向。
二、使用方法:
1、导入相关依赖文件
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
2、注册
SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mSensorMagager.registerListener(this,mSensorManager .getDefaultSensor(Sensor.TYPE_ORIENTATION,SensorManager.SENSOR_DELAY_FASTEST);
3、使用(以方向及加速度传感器等为例)
@Override
public void onSensorChanged(SensorEvent event)
{
if(event.sensor.getType() == Sensor.TYPE_ORIENTATION)
{
str = String.format("%03.04f",event.values[0]);
textView2.setText(str);
str = String.format("%03.04f",event.values[1]);
textView3.setText(str);
str = String.format("%3.4f",event.values[2]);
textView4.setText(str);
}
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
{
str = String.format("%3.4f",event.values[0]);
textView5.setText(str);
str = String.format("%3.4f",event.values[1]);
textView6.setText(str);
str = String.format("%3.4f",event.values[2]);
textView7.setText(str);
}
}
说明:根据不同的传感器类型,会不同。
方向传感器参数
event.values[0]:绕着Z轴旋转的角度。0度(正北) 90度(正东) 180(正南) 270度(正西)
event.values[1]:绕着X轴旋转的角度。水平0,range(-180 ~ + 180),后高前低为正,前高后低为负
event.values[2]:绕着Y轴旋转的角度。水平为0,range(-90 ~ +90) 左边高右边低为负值 ,右边高左边低为正值
加速度传感器
event.values[0]:绕着Z轴旋转的角度。0度(正北) 90度(正东) 180(正南) 270度(正西)
event.values[1]:绕着X轴旋转的角度。水平0,range(-180 ~ + 180),后高前低为正,前高后低为负
event.values[2]:绕着Y轴旋转的角度。水平为0,range(-90 ~ +90) 左边高右边低为负值 ,右边高左边低为正值
4、注销
mSensorMagager.unregisterListener(this);
注意:
1、上文件中有一个this,指向结构本身的指针。
这样写法时要在入口加入加 implements SensorEventListener
如:public class MainActivity extends Activity implements SensorEventListener {}
此种方法注册与注销时,使用this指针,
SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mSensorMagager.registerListener(this,mSensorManager .getDefaultSensor(Sensor.TYPE_ORIENTATION,SensorManager.SENSOR_DELAY_FASTEST);
@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy)
{
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
switch(event.sensor.getType())
{
case Sensor.TYPE_ORIENTATION:
break;
case Sensor.TYPE_ACCELEROMETER:
break;
}
if(event.sensor.getType() == Sensor.TYPE_ORIENTATION)
{
if(event.values[2] > 8)
{
step_flag_p = true;
step_flag_n = false;
//textView1.setText("up");
}
if(event.values[2] < -8)
{
step_flag_n = true;
step_flag_n = false;
//textView1.setText("down");
}
str = String.format("%03.04f",event.values[0]);
textView2.setText(str);
str = String.format("%03.04f",event.values[1]);
textView3.setText(str);
str = String.format("%3.4f",event.values[2]);
textView4.setText(str);
}
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
{
if(flag)
{
lastPoint = event.values[1];
flag = false;
}
if(Math.abs(event.values[1]-lastPoint) > 8)
{
lastPoint =event.values[1];
textView1.setText(String.valueOf(++count));
}
if(event.values[0]>lastX)
lastX = event.values[0];
if(event.values[1]>lastX)
lastY = event.values[0];
if(event.values[2]>lastX)
lastZ = event.values[0];
str = String.format("%3.4f",event.values[0]);
textView5.setText(str);
str = String.format("%3.4f",event.values[1]);
textView6.setText(str);
str = String.format("%3.4f",event.values[2]);
textView7.setText(str);
str = String.format("%3.4f",lastX);
accMaxX.setText(str);
str = String.format("%3.4f",lastY);
accMaxY.setText(str);
str = String.format("%3.4f",lastZ);
accMaxZ.setText(str);
}
}
如:
且此函数要加上:@Override
如:
@Override
public void onSensorChanged(SensorEvent event)
{
}
2、另一种方法:
在入口入不加任何东西,
写法为:
public void onSensorChanged(SensorEvent event) {}等在 private final SensorEventListener mSensorEventListener=new SensorEventListener()
{}内部:
如:
private final SensorEventListener mSensorEventListener=new SensorEventListener()
{
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
switch(event.sensor.getType())
{
case Sensor.TYPE_ORIENTATION:
break;
case Sensor.TYPE_ACCELEROMETER:
break;
}
if(event.sensor.getType() == Sensor.TYPE_ORIENTATION)
{
if(event.values[2] > 8)
{
step_flag_p = true;
step_flag_n = false;
//textView1.setText("up");
}
if(event.values[2] < -8)
{
step_flag_n = true;
step_flag_n = false;
//textView1.setText("down");
}
str = String.format("%03.04f",event.values[0]);
textView2.setText(str);
str = String.format("%03.04f",event.values[1]);
textView3.setText(str);
str = String.format("%3.4f",event.values[2]);
textView4.setText(str);
}
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
{
if(flag)
{
lastPoint = event.values[1];
flag = false;
}
if(Math.abs(event.values[1]-lastPoint) > 8)
{
lastPoint =event.values[1];
textView1.setText(String.valueOf(++count));
}
if(event.values[0]>lastX)
lastX = event.values[0];
if(event.values[1]>lastX)
lastY = event.values[0];
if(event.values[2]>lastX)
lastZ = event.values[0];
str = String.format("%3.4f",event.values[0]);
textView5.setText(str);
str = String.format("%3.4f",event.values[1]);
textView6.setText(str);
str = String.format("%3.4f",event.values[2]);
textView7.setText(str);
str = String.format("%3.4f",lastX);
accMaxX.setText(str);
str = String.format("%3.4f",lastY);
accMaxY.setText(str);
str = String.format("%3.4f",lastZ);
accMaxZ.setText(str);
}
}
};
注册与注销时,使用 mSensorEventListener
如:
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mSensorManager .registerListener(mSensorEventListener, mSensorManager
.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_FASTEST);
mSensorManager .registerListener(mSensorEventListener, mSensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_FASTEST);
mSensorMagager.unregisterListener(mSensorEventListener);