在前面的例子 Compass 的固定链接"> Android ApiDemos示例解析(61):Graphics->Compass 和例子Android ApiDemos示例解析(79):Graphics->SensorTest 涉及到了Sensors。

本例再集中介绍Android 中支持的Sensors用法。

SensorManager用于管理Android设备中的各种传感器,取的SensorManager实例对象的方法是使用getSystemService:

private SensorManager mSensorManager;...mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

SensorListener 和 SensorEventListener 定义了监视设备传感器的回调函数。SensorListener和SensorEventListener 定义的方法大同小异,主要是值得Sensor类型的参数不同,SensorListener 是过时的接口,尽量不要再用,本例还是使用SensorListener。

它定义里两个回调函数:

public void onSensorChanged(int sensor, float[] values) { mValues = values; if (mView != null) { mView.invalidate(); }} public void onAccuracyChanged(int sensor, int accuracy) { // TODO Auto-generated method stub }

sensor指定了传感器的类型,类型为int ,而SensorEventListener 中是使用Sensor类型。values数组定义了X,Y,Z方向传感器的值方向为度,横向和纵向时,X,Y,Z定义有所不 同,values[3],values[4],values[5]定义与屏幕方向无关的X,Y,Z值。

Android设备可能带有多种传感器,每种传感器的精度不同,当精度变换时onAccuracyChanged被触发,是sensor 指定了传感器的类型,而accuracy 为新的精度:

  • SensorManager.SENSOR_STATUS_ACCURACY_HIGH 传感器报告高精度值
  • SensorManager.SENSOR_STATUS_ACCURACY_LOW 传感器报告低精度值
  • SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM 传感器报告平均精度值
  • SensorManager.SENSOR_STATUS_ACCURACY_UNRELIABLE 传感器报告的精度值不可靠。

sensor 指定了传感器的类型,Android系统中可能支持的传感器有如下几种:

  • SENSOR_ACCELEROMETER: 加速传感器,检测沿X,Y,Z三个方向的加速度(m/s2).
  • SENSOR_ORIENTATION: 方向传感器,沿X,Y,Z三个方向的角度。
  • SENSOR_LIGHT: 亮度传感器,检测当前光线强度。
  • SENSOR_MAGNETIC_FIELD: 磁场传感器,检测沿X,Y,Z三个方向的磁通量。
  • SENSOR_PROXIMITY: 位置传感器,检测当前位置和目标位置之间的距离。
  • SENSOR_TEMPERATURE: 温度传感器,检测当前气温。

在Android最新的开发包中提供了一个新类Sensor 用来代替原先使用int表示的Sensor 类型,在新的应用中建议使用这个Sensor类。

如果想指定使用某种Sensor,可以在registerListener时指定,传感器是共享设备,对于一个“好”的应用,在不需要使用传感器时要清除对传感器的监视,这反应的onResume,onStop方法中:

@Overrideprotected void onResume() { super.onResume(); mSensorManager.registerListener(mGraphView, SensorManager.SENSOR_ACCELEROMETER | SensorManager.SENSOR_MAGNETIC_FIELD | SensorManager.SENSOR_ORIENTATION, SensorManager.SENSOR_DELAY_FASTEST);} @Overrideprotected void onStop() { mSensorManager.unregisterListener(mGraphView); super.onStop();}

在registerListener 中除了指定需要监听的Sensor类型外,还可以指定传感器更新的频率,支持的频率支持下面几个选项:

  • SENSOR_DELAY_FASTEST: 选择尽可能快的频率。
  • SENSOR_DELAY_GAME: 选择适应于游戏应用的更新频率。
  • SENSOR_DELAY_NORMAL: 选择缺省的更新频率。
  • SENSOR_DELAY_UI: 选择适合更新UI的频率。

本例的onSensorChanged定义如下,使用SENSOR_ORIENTATION,SENSOR_MAGNETIC_FIELD 和SENSOR_MAGNETIC_FIELD 因此需要手机来测试:

public void onSensorChanged(int sensor, float[] values) { synchronized (this) { if (mBitmap != null) { final Canvas canvas = mCanvas; final Paint paint = mPaint; if (sensor == SensorManager.SENSOR_ORIENTATION) { for (int i=0 ; i<3 ; i++) { mOrientationValues[i] = values[i]; } } else { float deltaX = mSpeed; float newX = mLastX + deltaX;  int j = (sensor == SensorManager.SENSOR_MAGNETIC_FIELD) ? 1 : 0; for (int i=0 ; i<3 ; i++) { int k = i+j*3; final float v = mYOffset + values[i] * mScale[j]; paint.setColor(mColors[k]); canvas.drawLine(mLastX, mLastValues[k], newX, v, paint); mLastValues[k] = v; } if (sensor == SensorManager.SENSOR_MAGNETIC_FIELD) mLastX += mSpeed; } invalidate(); } }}

Sensors" width="320" title="20110608001" class="aligncenter size-full wp-image-1693" style="border:1px solid black;">





更多相关文章

  1. Android之NFC第一课
  2. java/android 使用swig编译c/c++ 代码类型转换
  3. 安装 Android(安卓)2.3 could not find adb.exe
  4. Android中检测手机制式和移动网络类型
  5. Android传感器使用实例1
  6. Android开发资料视频教程(光盘6.2G)
  7. android之Display.getRotation()_传感器控制屏幕旋转
  8. android notification 的总结分析
  9. Android(安卓)Base64字符串转换成图片

随机推荐

  1. Android DEX方法超过64K和gradle编译OOM
  2. Android中汉字转拼音的内存优化处理
  3. actionbar与viewpager的联合使用(android
  4. android获取系统铃声并播放
  5. The Busy Coder's Guide to Android(安卓
  6. Android 控件随意拖动
  7. Android ImageView显示网络图片
  8. Android 照相机的实例应用
  9. Android中模拟器如何访问本地mysql数据库
  10. Enable Geolocation in a WebView (Andro