基本流程
1、获取sensorManager对象:
PRivate SensorManager sensorManager;sensorManager= (SensorManager) getSystemService(SENSOR_SERVICE);2、获取传感器Sensor lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);其中getDefaultSensor()中传入的参数为Sensor类的常量,如上面即为光线传感器3、注册传感器sensorManager.registerListener(new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { }}, lightSensor, SensorManager.SENSOR_DELAY_NORMAL);registerListene人()方法需要传入三个参数,第一个参数为一个监听器接口,我们需要去实现这个接口的两个方法,onSenserChanged()为传感器数据发生变化时调用的方法,onAccuracyChanged()为精度变化是调用的方法。这两个方法都接收一个SensorEvent参数,这是因为android中,传感器是一直采集数据的,不是我们需要数据时向传感器申请数据,当它采集到的数据发生变化或者其精度发生变化时,就产生一个SensorEvent对象告知其它程序第二个参数为需要注册的传感器第三个参数为传感器的延时速率,反应传感器的灵敏度,有NORMAL、UI、GAME、FAETEST四种适应不同的场景,一般游戏选择GAME精度、普通的界面程序选择选择UI精度即可4、获取数据就在onSensorChanged()方法里面通过SensorEvent获取,不同的传感器返回的数据不尽相同,如光线传感器就返回光的强度,event的values[0]就代表的光的强度public void onSensorChanged(SensorEvent event) { float value = event.values[0]; showLightStrengthTextView.setText(value + " Lux");}5、取消注册不用时通过sensorManager.unregisterListener(SensorEventListenner listenner,Sensor sensor);取消注册即可,比如在onPause方法中进行取消注册。简易传感器应用主要代码:一、光线传感器:获取光强值,并使屏幕亮度随着关照强度变化public class Light extends AppCompatActivity { private TextView showLightStrengthTextView; private SensorManager sensorManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_light); initVIew(); showLightStrength(); } private void showLightStrength() { sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); Sensor lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); sensorManager.registerListener(new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { float value = event.values[0]; showLightStrengthTextView.setText(value + " Lux"); /* 屏幕亮度根据关照自动变化,以200Lux为基准按比例调整屏幕亮度, 大于200亮度调整为最大,小于50为0.25倍 */ float screenLightLevel=value/200.f; if(screenLightLevel>1.0f) screenLightLevel=1.0f; if(screenLightLevel<0.25f) screenLightLevel=0.25f; setScreenBrightness(screenLightLevel); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }, lightSensor, SensorManager.SENSOR_DELAY_UI); } private void initVIew() { showLightStrengthTextView = (TextView) findViewById(R.id.showLightStrengthTextView); } //调整屏幕亮度,传入参数代表亮度比例 private void setScreenBrightness(float f){ Window localWindow = getWindow(); WindowManager.LayoutParams localLayoutParams = localWindow.getAttributes(); localLayoutParams.screenBrightness = f; localWindow.setAttributes(localLayoutParams); }}二、简单计步器(需要计步传感器支持)public class StepCounter extends AppCompatActivity { private TextView stepTextView; private SensorManager sensorManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_step_counter); initView(); showStep(); } private void showStep() { sensorManager= (SensorManager) getSystemService(SENSOR_SERVICE); Sensor stepCounterSensor=sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER); sensorManager.registerListener(new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { int value= (int) event.values[0]; stepTextView.setText(value+""); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } },stepCounterSensor,SensorManager.SENSOR_DELAY_GAME); } private void initView() { stepTextView= (TextView) findViewById(R.id.stepTextView); }}三、简易指南针指南针一般通过地磁传感器与加速度传感器实现,这个具体实现谷歌提供了封装好方法主要代码如下:1、获取加速度传感器与地磁传感器的数据并保存到两个数组float[] acceleromenterValues = new float[3];float[] magneticValues = new float[3];if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) acceleromenterValues = event.values.clone();else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) magneticValues = event.values.clone();2、构造一个矩阵R[]来保存磁场与加速度数据,声明一个values数组来保存具体角度数据float[] R = new float[9];float[] values = new float[3];//根据acceleromenterSensor和magneticSensor的数据填充旋转矩阵R[]SensorManager.getRotationMatrix(R, null, acceleromenterValues, magneticValues);//根据旋转矩阵R[]填充values[]SensorManager.getOrientation(R, values);//获取角度float rotateDegree = (float) Math.toDegrees(values[0]);3、由于具体实现为使用两张图片,一张为指针,固定不变,一张为标明了方向的表盘图片,我们根据角度旋转表盘图片即可实现指南针的旋转,因为旋转的是表盘图片,所以要把角度取反float rotateDegree = -(float) Math.toDegrees(values[0]);具体代码如下:public class Compass extends AppCompatActivity { private SensorManager sensorManager; private ImageView compassImage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_compass); compassImage = (ImageView) findViewById(R.id.compassImage); sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); //获取加速度传感器 Sensor acceleromenterSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); //获取地磁传感器 Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); sensorManager.registerListener(listener, acceleromenterSensor, SensorManager.SENSOR_DELAY_UI); sensorManager.registerListener(listener, magneticSensor, SensorManager.SENSOR_DELAY_UI); } SensorEventListener listener = new SensorEventListener() { float[] acceleromenterValues = new float[3]; float[] magneticValues = new float[3]; private float lastRotateDegree; @Override public void onSensorChanged(SensorEvent event) { //获取加速度传感器和地磁传感器的数据,并复制到两个数组中去 if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) acceleromenterValues = event.values.clone(); else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) magneticValues = event.values.clone(); //旋转矩阵R[],用来保存磁场数据和加速度数据 float[] R = new float[9]; float[] values = new float[3]; //根据acceleromenterSensor和magneticSensor的数据填充旋转矩阵R[] SensorManager.getRotationMatrix(R, null, acceleromenterValues, magneticValues); //根据旋转矩阵R[]填充values[] SensorManager.getOrientation(R, values); //获取方向角度,实现指南针为旋转背景图片,此处将角度取反 float rotateDegree = -(float) Math.toDegrees(values[0]); //角度变化大于2时,旋转图片 if (Math.abs(rotateDegree - lastRotateDegree) > 2) { RotateAnimation animation = new RotateAnimation(lastRotateDegree, rotateDegree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); animation.setFillAfter(true); compassImage.startAnimation(animation); lastRotateDegree = rotateDegree; } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } };}代码下载地址:http://download.csdn.net/download/QQ_33245265/9763697#
新闻热点
疑难解答