android动作传感器

Android平台支持一些用于监视设备动作的传感器(这样的传感器共有5个)。其中两个(加速传感器和陀螺仪传感器)是纯的硬件传感器。另外三个(重力传感器、线性加速传感器和旋转向量传感器)可能是硬件传感器,也可能是软件传感器。例如,在一些Android设备中,这些基于软件的传感器会从加速和磁力传感器中获取数据,但在另一些Android设备中也可能从陀螺仪传感器中获取数据。也就是说,同一种基于软件的传感器在不同的Android设备中回传的数据可能来自不同的硬件传感器。所以基于软件的同一种传感器在不同的设备中可能精确度、使用范围有所不同。大多数高端Android设备都会有加速传感器,还有一些拥有陀螺仪传感器。

动作传感器对于监测设备的移动非常有用,例如,倾斜、震动、旋转和摆动都属于动作传感器的监测范围。设备的移动通常是对用户输入的直接反应。例如,用户正在游戏中飙车,或控制游戏中的一个小球)。除此之外,设备所处的物理环境也会反应在设备的动作上,例如,用户正常驾驶汽车,而这是Android设备正安静地躺在旁边的座椅上,尽管设备没有移动,但会随着车的行驶而不断震动,而且设备也会随着汽车的移动而移动。
对于第一种情况,可以对设备本身的相对位置进行监测。而对于第二种情况,需要考虑到设备以外的参照系。动作传感器本身一般并不会用于监测设备的位置,关于设备的位置需要用其他类型的传感器进行监测,例如,磁场传感器。

所有的动作传感器都会返回三个浮点数的值(通过长度为3的数组返回),但对于不同的传感器,这三个只的意义不同。例如,对于加速传感器,会返回三个坐标轴的数据。对于陀螺仪传感器,会返回三个坐标轴的旋转角速度。

设备从左到右推动,X轴加速度为正值。


设备朝着自己推动,Y轴加速度为正值。


如果朝着天空以A m/s^2的加速度推动,那么Z轴的加速度为A + 9.81,所以如果计算实际的加速度(抵消重力加速度),需要减9.81。


view:

<LinearLayout 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:paddingLeft="@dimen/activity_horizontal_margin"  android:paddingRight="@dimen/activity_horizontal_margin"  android:paddingTop="@dimen/activity_vertical_margin"  android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"  android:orientation="vertical">  <TextView android:id="@+id/sensor" android:layout_width="wrap_content"    android:layout_height="wrap_content" />  <TextView android:id="@+id/gravity" android:layout_width="wrap_content"    android:layout_height="wrap_content" />  <TextView android:id="@+id/PROXIMITY1" android:layout_width="wrap_content"    android:layout_height="wrap_content" /></LinearLayout>

java:

pupublic class MainActivity extends ActionBarActivity implements SensorEventListener{  private TextView sensor=null;  private SensorManager mSensorManager;  private TextView gravityTV=null;  private float[] gravity=new float[3];  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    sensor= (TextView) findViewById(R.id.sensor);    mSensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);  }  @Override  protected void onResume() {    super.onResume();    mSensorManager.registerListener(this,        mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),//加速度传感器,        SensorManager.SENSOR_DELAY_UI);//SensorManager.SENSOR_DELAY_UI采样频率    mSensorManager.registerListener(this,        mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),//重力传感器,        SensorManager.SENSOR_DELAY_FASTEST);//SensorManager.SENSOR_DELAY_UI采样频率    mSensorManager.registerListener(this,        mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),//邻近传感器        SensorManager.SENSOR_DELAY_UI);  }  @Override  protected void onPause() {    super.onPause();    mSensorManager.unregisterListener(this);//卸载所有的传感器  }  //传感度状态发生变化  @Override  public void onSensorChanged(SensorEvent event) {    switch (event.sensor.getType()){      case Sensor.TYPE_ACCELEROMETER: //加速度传感器        //减杂音(干扰)        final float alpha=(float)0.8;        gravity[0]=alpha*gravity[0]+(1-alpha)*event.values[0];        gravity[1]=alpha*gravity[1]+(1-alpha)*event.values[1];        gravity[2]=alpha*gravity[2 ]+(1-alpha)*event.values[2];        String accelerometer=String.valueOf("X:"+(event.values[0]-gravity[0])+"\nY:"+            (event.values[1]-gravity[1])+"\nZ:"+            (event.values[2]-gravity[2]));        sensor= (TextView) findViewById(R.id.sensor);        sensor.setText(accelerometer);        Log.i("X:", String.valueOf((event.values[0] - gravity[0])));        Log.i("Y:", String.valueOf((event.values[1] - gravity[1])));        Log.i("Z:", String.valueOf((event.values[2]-gravity[2])));        break;      case Sensor.TYPE_GRAVITY:        gravity[0]=event.values[0];        gravity[1]=event.values[1];        gravity[2]=event.values[2];        gravityTV= (TextView) findViewById(R.id.gravity);        gravityTV.setText(String.valueOf("gravity[0]="+event.values[0]+        "\ngravity[1]="+event.values[1]+        "\ngravity[2]="+event.values[2]));        break;      case Sensor.TYPE_PROXIMITY:        TextView Proximity= (TextView) findViewById(R.id.PROXIMITY1);        Proximity.setText(String.valueOf(event.values[0]));        break;    }  }  //精确度发生变化  @Override  public void onAccuracyChanged(Sensor sensor, int accuracy) {  }}


更多相关文章

  1. 有板有眼:Google如何利用Moto的专利来帮助Android开发商?
  2. 从零学Android(四)、适配不同的Android设备
  3. Android(安卓)- 支持不同的设备
  4. 如何检索Android设备的唯一ID
  5. 开发者大会传递信号:Android开发者将越来越赚钱?
  6. Android(安卓)Training - 支持不同的设备
  7. 调查:Android手机用户75%集中在北美
  8. Android使用Sensor感应器实现线程中刷新UI创建android测力计的功
  9. 如何检索Android设备的唯一ID

随机推荐

  1. Android(安卓)AsyncTask 详细解析
  2. Android模块化编译
  3. Android(安卓)zygote的分裂总结
  4. Android开发之使用MediaRecorder录制声音
  5. MT6573 android 2.3系统默认语言处理流程
  6. Android开发者指南-摄像头-Camera
  7. App应用唯一标示码
  8. Android开发工具——ADB(Android(安卓)De
  9. Android(安卓)SDK下, 如何在程序中输出日
  10. Android(安卓)Matrix 超级详解