Android 系统提供了对传感器的支持,如果手机设备的硬件提供了这些传感器,Android应用可以通过传感器来获取设备的外界条件,包括手机设备的运行状态、当前摆放方向、外界的磁场、温度和压力等。Android 系统提供了驱动程序去管理这些传感器硬件,当传感器硬件感知到外部环境发生改变时,Android 系统负责管理这些传感器数据。

对于 Android 应用开发者来说,开发传感器应用十分简单,开发者只要为指定监听器注册一个监听器即可,当外部环境发生改变时,Android 系统会通过传感器获取外部环境的数据,并将数据传给监听器的监听方法。

通过在 Android 应用中添加传感器,可以充分激发开发者、用户的想象力,可以开发出各种新奇的程序,比如电子罗盘、水平仪等;除此之外,还可以利用传感器开发各种游戏,必须通过传感器来感知用户动作,从而在游戏中提供对应的响应。

在 Android 系统中开发传感器应用十分简单,因为 Android 系统为传感器支持强大的管理服务。开发传感器应用的步骤如下:

  1. 调用 Context 的 getSystemService(Context.SENSOR_SERVICE)方法获取 SensorManager 对象,SensorManager 对象代表系统的传感器管理服务。
  2. 调用 SensorManager 的 getDefaultSensor(int type)方法来获取指定类型的传感器。
  3. 通常选择在 Activity 的 onResume()方法中调用 SensorManager 的 registerListener()为指定传感器注册监听即可。程序通过实现监听器即可获取传感器传回来的数据。

SensorManager 提供的注册传感器的方法为:registerListener(SensorEventListener listener,Sensor sensor, int rate),该方法中三个参数的说明如下:

  • listener:监听传感器事件的监听器。该监听器需要实现 SensorEventListener 接口。
  • sensor:传感器对象。
  • rate:指定获取传感器数据的频率。

该方法中rate可以获取传感器数据的频率,它支持如F几个频率值。

  • SensorManager.SENSOR_DELAY_FASTEST:最快。延迟最小,只有特别依赖于传感器数据的应用推荐采用这种频率,该种模式可能造成手机电量大量消耗,由于传递的为原始数据,算法不处理好将会影响应用的性能。
  • SensorManager.SENSOR_DELAY_GAME:适合游戏的频率。在一般实时性要求的应用上适合使用这种频率。
  • SensorManager.SENSOR_DELAY_NORMAL:正常频率。 般实时性要求不是特刖高的应用上适合这种频率。
  • SensorManager.SENSOR_DELAY_UI:适合普通用户界而的频率。这种模式比较省电、而且系统开销也微小,但延迟较大,因此只适合在普通小程序中使用。

main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"><TextView    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:text="@string/tip" /><EditText    android:id="@+id/txt1"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:editable="false"    android:cursorVisible="false" /></LinearLayout>

Manifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="org.crazyit.sensor"    android:versionCode="1"    android:versionName="1.0">    <uses-sdk        android:minSdkVersion="10"        android:targetSdkVersion="17" />    <application android:icon="@drawable/ic_launcher" android:label="@string/app_name">        <activity android:name=".AccelerometerTest"                android:label="@string/app_name">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>

AccelerometerMeter.java

package org.crazyit.sensor;import android.app.Activity;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.widget.EditText;/** * Description: * <br/>site: <a href="http://www.crazyit.org">crazyit.org</a> * <br/>Copyright (C), 2001-2014, Yeeku.H.Lee * <br/>This program is protected by copyright laws. * <br/>Program Name: * <br/>Date: * @author  Yeeku.H.Lee kongyeeku@163.com * @version  1.0 */public class AccelerometerTest extends Activity    implements SensorEventListener{    // 定义系统的Sensor管理器    SensorManager sensorManager;    EditText etTxt1;    @Override    public void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        // 获取程序界面上的文本框组件        etTxt1 = (EditText) findViewById(R.id.txt1);        // 获取系统的传感器管理服务        sensorManager = (SensorManager) getSystemService(            Context.SENSOR_SERVICE);  //    }    @Override    protected void onResume()    {        super.onResume();        // 为系统的加速度传感器注册监听器        sensorManager.registerListener(this,            sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),            SensorManager.SENSOR_DELAY_UI);  //    }    @Override    protected void onStop()    {        // 取消注册        sensorManager.unregisterListener(this);        super.onStop();    }    // 以下是实现SensorEventListener接口必须实现的方法    // 当传感器的值发生改变时回调该方法    @Override    public void onSensorChanged(SensorEvent event)    {        float[] values = event.values;        StringBuilder sb = new StringBuilder();        sb.append("X方向上的加速度:");        sb.append(values[0]);        sb.append("\nY方向上的加速度:");        sb.append(values[1]);        sb.append("\nZ方向上的加速度:");        sb.append(values[2]);        etTxt1.setText(sb.toString());    }    // 当传感器精度改变时回调该方法。    @Override    public void onAccuracyChanged(Sensor sensor, int accuracy)    {    }}

截图:

更多相关文章

  1. Android获取屏幕分辨率及DisplayMetrics简介
  2. Android与服务器端数据交互(http协议整合struts2+android)
  3. [原创]Android中LocationManager的简单使用,获取当前位置
  4. Android中经常用到的方法--SDcard下文件的操作
  5. Android获取经纬度,计算距离,方位角
  6. Android使用http协议与服务器通信
  7. Android平台上的11个感应器你都知道吗
  8. Java事件模型与Android事件模型的比较
  9. Android将camera获取到的YuvData在jni中转化为Mat

随机推荐

  1. JY06用户组权限管理
  2. WebSocket就是这么简单
  3. Hibernate面试题大全
  4. Samba服务器部署
  5. date使用
  6. 闪存是什么
  7. 任务计划crontab
  8. 祝好...
  9. binlog有哪些工作模式?Linux云计算运维入
  10. centos7修改root密码