安卓中常见传感器的种类:
安卓传感器框架中的主要类和接口
SensorManager 允许你访问设备的感应器。通过传入参数SENSOR_SERVICE参数调用Context.getSystemService方法可以获得一个sensor的实例。永远记得确保当你不需要的时候,特别是Activity暂定的时候,要关闭感应器。忽略这一点肯能导致几个小时就耗尽电池,注意当屏幕关闭时,系统不会自动关闭感应器。所以在注册传感器时一般并不在OnCreate函数中,而在onResume函数中.
所有的动作传感器都会返回三个浮点数值(通过长度为三的数组values),代表X,Y,Z三个轴上的数值。
下面是一个获取手机所有传感器的例子
public class MainActivity extends AppCompatActivity {
private TextView tvSensors;
private SensorManager sensorManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvSensors=(TextView)findViewById(R.id.tv);
sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
List<Sensor>sensors=
sensorManager.getSensorList(Sensor.TYPE_ALL);
for(Sensor sensor:sensors){
tvSensors.append(sensor.getName()+"\n");
}
}
}
动作传感器
加速度传感器、重力传感器
1.定义SensorManager
private SensorManager sensorManager;
2.初始化SensorManager
sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
3.为该类添加SensorEventListener接口
public class MotionSensorActivity extends AppCompatActivity implements SensorEventListener
4.注册、卸载传感器
@Override
protected void onResume() {
super.onResume();
//注册传感器
//三个参数 类的对象实例 传感器 采样率
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_UI);
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),SensorManager.SENSOR_DELAY_FASTEST);
}
@Override
protected void onPause() {
super.onPause();
//卸载传感器
sensorManager.unregisterListener(this);
}
5.当回传数据时,做出相应
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
switch (sensorEvent.sensor.getType()){
case Sensor.TYPE_ACCELEROMETER:
final float alpha=(float) 0.8;
gravity[0]=alpha*gravity[0]+(1-alpha)*sensorEvent.values[0];
gravity[1]=alpha*gravity[1]+(1-alpha)*sensorEvent.values[1];
gravity[2]=alpha*gravity[2]+(1-alpha)*sensorEvent.values[2];
//消除噪声
String accelerometer="加速度\n"+
"X:"+ (sensorEvent.values[0]-gravity[0])+"\n"+
"Y:"+ (sensorEvent.values[1]-gravity[1])+"\n"+
"Z:"+ (sensorEvent.values[2]-gravity[2])+"\n";
Log.d("z", String.valueOf(sensorEvent.values[2]-gravity[2]));
tv.setText(accelerometer);
break;
case Sensor.TYPE_GRAVITY:
gravity[0]=sensorEvent.values[0];
gravity[1]=sensorEvent.values[1];
gravity[2]=sensorEvent.values[2];
break;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
方向传感器
用法和动作传感器完全一样,其中sensorEvent.values[0]代表绕着Z轴旋转的角度。如果Y轴(正常拿着手机)正对着北方,该值是0,如果Y轴,正对着南方,该值是180,如果Y轴,正对着东方,该值是90,如果Y轴,正对着西方,该值是270。
sensorEvent.values[1]代表绕着X轴旋转的角度。当从Z轴正方向朝着Y轴正方向,该值为正值,反之为负值,该值在(180,-180)之间。
sensorEvent.values[2]代表绕着Y轴旋转的角度。当从Z轴正方向朝着X轴正方向,该值为正值,反之为负值,该值在(180,-180)之间。
磁场传感器
sensorEvent.values[i] 分别表示沿着XYZ轴方向的磁力(uT,militesla)
邻近传感器
只返回一个值代表 手机证明吗邻近物理距离(cm)
环境传感器
环境传感器都只返回一个值sensorEvent.values[0],而且传感器返回的值很少受到杂音的影响。
最常见的环境传感器是钢线传感器,返回值的一般为:
传感器案例–指南针
指南针只需要一张图片,并总让图片反向转过方向传感器返回的第一个值即可。
代码如下
activity_compass.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="org.crazyit.sensor.Compass">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/znz"
android:src="@drawable/znz"/>
</RelativeLayout>
Compass.java
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.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
public class Compass extends AppCompatActivity implements SensorEventListener {
private ImageView imageView;
private SensorManager sensorManager;
float currentDegree;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_compass);
currentDegree=0f;
imageView=(ImageView) findViewById(R.id.znz);
sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
switch (sensorEvent.sensor.getType()){
case Sensor.TYPE_ORIENTATION:
float degree=sensorEvent.values[0];
//创建旋转动画
RotateAnimation rotateAnimation=new RotateAnimation(currentDegree,-degree,
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
//设置动画持续时间
rotateAnimation.setDuration(200);
imageView.startAnimation(rotateAnimation);
currentDegree=-degree;
break;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
@Override
protected void onResume() {
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_GAME);
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
}
@Override
protected void onStop() {
super.onStop();
sensorManager.unregisterListener(this);
}
}
最后附上程序中的图片