首页 > 代码库 > [Android]传感器-加速度计-3[转]

[Android]传感器-加速度计-3[转]

 


首先介绍加速度传感器。该传感器的作用主要是感应手机的运动。该传感器捕获三个参数,分别表示空间坐标系中X、Y、Z轴方向上的加速度减去重力加速度在相应轴上的分量,其单位均为m/s2。

如图14-1所示,传感器的坐标系与手机屏幕中的坐标系不同,传感器坐标系是以屏幕的左下角为原点,X轴沿着屏幕向右,Y轴沿着屏幕向上,Z轴垂直手机屏幕向上。

图14-1  手机传感器坐标系

接下来通过一个简单的例子来介绍如何获取加速度的值,同时讲解如何在模拟器中调试传感器的应用,开发步骤如下。

下载SensorSimulator,SensorSimulator是一个开源免费的传感器小工具,通过该工具便可以在模拟器中调试传感器的应用,读者可从http://code.google.com/p/openintents/wiki/SensorSimulator网站找到该工具的下载链接。

将下载好的SensorSimulator解压到C盘根目录。

向模拟器安装SensorSimulatorSettings.apk。首先在操作系统中依次选择"开始"|"运行"进入"运行"对话框,如图14-2所示。然后在"运行"对话框输入cmd进入cmd命令行,之后通过cd命令将当前目录导航到SensorSimulatorSettings.apk目录下,然后输入下列命令向模拟器安装该apk。需要注意的是,安装apk时,一定要保证模拟器正在运行才可以,如图14-3所示。

  1. 1   adb install SensorSimulatorSettings.apk 
图14-2  运行对话框
(点击查看大图)图14-3  安装apk到模拟器

创建一个名为Sample_14_1的Android项目。

搭建界面,用下列代码替代main.xml中的原有代码。

  1. 1   <?xml version="1.0" encoding="utf-8"?>          <!-- 声明xml的版本及编码格式 --> 
  2. 2   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3. 3       android:orientation="vertical" 
  4. 4       android:layout_width="fill_parent" 
  5. 5       android:layout_height="fill_parent">            <!-- 添加一个垂直的线性布局 --> 
  6. 6       <TextView    
  7. 7           android:id="@+id/title" 
  8. 8           android:gravity="center_horizontal" 
  9. 9           android:textSize="20px" 
  10. 10              android:layout_width="fill_parent"   
  11. 11              android:layout_height="wrap_content"   
  12. 12              android:text="@string/title"/>          <!-- 添加一个TextView控件 --> 
  13. 13      <TextView    
  14. 14          android:id="@+id/myTextView1" 
  15. 15          android:textSize="18px" 
  16. 16              android:layout_width="fill_parent"   
  17. 17              android:layout_height="wrap_content"   
  18. 18              android:text="@string/myTextView1"/>    <!-- 添加一个TextView控件 --> 
  19. 19      <TextView    
  20. 20          android:id="@+id/myTextView2" 
  21. 21          android:textSize="18px" 
  22. 22              android:layout_width="fill_parent"   
  23. 23              android:layout_height="wrap_content"   
  24. 24              android:text="@string/myTextView2"/>    <!-- 添加一个TextView控件 --> 
  25. 25      <TextView    
  26. 26          android:id="@+id/myTextView3" 
  27. 27          android:textSize="18px" 
  28. 28              android:layout_width="fill_parent"   
  29. 29              android:layout_height="wrap_content"   
  30. 30              android:text="@string/myTextView3"/>    <!-- 添加一个TextView控件 --> 
  31. 31  </LinearLayout> 

代码位置:见随书光盘中源代码/第14章/Sample_14_1/res/layout目录下的main.xml。

说明:首先定义一个垂直的线性布局,然后依次向线性布局中添加四个TextView,并分别为其指定ID、设置文字大小及对其方式等。

在Eclipse中为该项目添加JAR包,使其能够使用SensorSimulator工具的类和方法,添加方法如下。

在Eclipse的Package Explorer中找到该项目的文件夹,然后右键单击该文件夹并选择"Properties"选项,弹出如图14-4所示的窗口。

选择左面的"Java Build Path"选项,然后单击"Libraries"选项卡。

单击"Add External JARs"按钮来添加需要的JAR包。

在弹出的"JAR Selection"对话框中选择C:\sensorsimulator-1.0.0-beta1\lib目录下的sensorsimulator-lib.jar,并将其添加到该项目中。

(点击查看大图)图14-4  Properties窗口

代码位置:见随书光盘中源代码/第14章/Sample_14_1/res/layout目录下的activity_main.xml。

说明:首先定义一个垂直的线性布局,然后依次向线性布局中添加四个TextView,并分别为其指定ID、设置文字大小及对其方式等。

在Eclipse中为该项目添加JAR包,使其能够使用SensorSimulator工具的类和方法。添加方法主要有两种,一种方法如下。

在Eclipse的Package Explorer中找到该项目的文件夹,然后右键单击该文件夹并从弹出的快捷菜单中选择"Properties"选项,弹出如图14-4所示的窗口。

选择左面的"Java Build Path"选项,然后单击"Libraries"选项卡。

单击"Add External JARs"按钮来添加需要的JAR包。

在弹出的"JAR Selection"对话框中选择C:\sensorsimulator-1.0.0-beta1\lib目录下的sensorsimulator-lib.jar,并将其添加到该项目中。

  1. 1   package wyf.ytl;                                    //声明所在包  
  2. 2   import org.openintents.sensorsimulator.hardware.SensorManagerSimulator;                                                         //引入相关类  
  3. 3   import android.app.Activity;                        //引入相关类  
  4. 4   import android.hardware.SensorListener;             //引入相关类  
  5. 5   import android.hardware.SensorManager;              //引入相关类  
  6. 6   import android.os.Bundle;                           //引入相关类  
  7. 7   import android.widget.TextView;                     //引入相关类  
  8. 8   public class Sample_14_1 extends Activity {  
  9. 9       TextView myTextView1;                           //X方向的加速度  
  10. 10      TextView myTextView2;                           //Y方向的加速度  
  11. 11      TextView myTextView3;                           //Z方向的加速度  
  12. 12      //SensorManager mySensorManager;                //SensorManager对象引用  
  13. 13      SensorManagerSimulator mySensorManager;                                                                         //声明SensorManagerSimulator对象,调试时用  
  14. 14      Sensor mysensor;  
  15. 15      @Override   
  16. 16      public void onCreate(Bundle savedInstanceState) {       //重写onCreate方法  
  17. 17          super.onCreate(savedInstanceState);  
  18. 18          setContentView(R.layout.activity_main);             //设置当前的用户界面  
  19. 19          myTextView1 = (TextView) findViewById(R.id.myTextView1);                                                                        //得到myTextView1的引用  
  20. 20          myTextView2 = (TextView) findViewById(R.id.myTextView2);                                                                        //得到myTextView2的引用  
  21. 21          myTextView3 = (TextView) findViewById(R.id.myTextView3);                                                                        //得到myTextView3的引用  
  22. 22          //mySensorManager =   
  23. 23              (SensorManager)getSystemService(SENSOR_SERVICE);                                                                            //获得SensorManager  
  24. 24          //调试时用  
  25. 25          mySensorManager = SensorManagerSimulator.getSystemService(this, SENSOR_SERVICE);  
  26. 26          mySensorManager.connectSimulator();         //与Simulator连接  
  27. 27          mysensor=mySensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);  
  28. 28      }  
  29. 29      private SensorEventListener mySensorListener = new SensorEventListener(){  
  30. 30        
  31. 31      @Override  
  32. 32      public void onAccuracyChanged(Sensor arg0, int arg1) {  
  33. 33          // TODO Auto-generated method stub  
  34. 34      }  
  35. 35      @Override  
  36. 36      public void onSensorChanged(SensorEvent arg0) {  
  37. 37          // TODO Auto-generated method stub  
  38. 38          if (arg0.type ==Sensor.TYPE_ACCELEROMETER ) {//只检查加速度的变化  
  39. 39              myTextView1.setText("x方向上的加速度为:"+arg0.values[0]);     
  40. 40                              //将提取的x数据显示到TextView  
  41. 41              myTextView2.setText("y方向上的加速度为:"+arg0.values[1]);     
  42. 42                              //将提取的y数据显示到TextView  
  43. 43              myTextView3.setText("z方向上的加速度为:"+arg0.values[2]);     
  44. 44                              //将提取的x数据显示到TextView  
  45. 45              }  
  46. 46          }  
  47. 47       };   
  48. 48      @Override  
  49. 49      protected void onResume() {   
  50. 50              mySensorManager.registerListener(//注册监听  
  51. 51              mySensorListener,  
  52. 52              mysensor, //监听器SensorListener对象  
  53. 53              SensorManager.SENSOR_DELAY_UI//传感器事件传递的频度  
  54. 54              );   
  55. 55              super.onResume();  
  56. 56      }  
  57. 57    @Override  
  58. 58    protected void onPause() {                        //重写onPause方法  
  59. 59          mySensorManager.unregisterListener(mySensorListener);   //取消注册监听器  
  60. 60          super.onPause();  
  61. 61      }  
  62. 63  }  

代码位置:见随书光盘中源代码/第14章/Sample_14_1/src/wyf/ytl目录下的Sample_14_1.java。

第9~11行声明三个TextView的引用,分别用来显示三个方向上的加速度。

第12行声明SensorManager对象的引用,该行为真实机器中的代码,此处因使用的是SensorSimulator工具来模拟传感器,所以需要将该句代码替换成第13行的代码。

第17~21行设置当前的用户界面,然后得到XML文件中配置的各个控件的引用。

第22~23行初始化SensorManager对象,同样因为调试的原因用第24~25行的代码替代。

第29~47行初始化监听器类,并重写了该类中的两个方法。在onSensorChanged方法中只对加速度的变化做处理。第39~44行将得到的数值显示到TextView中。

第48~56行重写了Activity类的onResume方法,在该方法中为SensorManager添加监听,而第57~63行重写了onPause方法,在方法中取消注册的监听器。

为了调试该程序,需要为该程序添加网络权限,因为SensorSimulator安装在Android模拟器中的客户端需要和桌面端的服务器进行通信。将下列代码添加到AndroidManifest.xml文件</manifest>标记之前。如果在真机上调试,则不需要加入该权限。

  1. <uses-permission android:name="android.permission.INTERNET"<!-- 调试时用 --> 

启动sensorsimulator.jar及之前安装到手机上的SensorSimulatorSettings进行相关的配置,首先运行C:\sensorsimulator-1.0.0-beta1\bin目录下的sensorsimulator.jar文件,然后再运行模拟器中的SensorSimulatorSettings,如图14-5、图14-6所示。

在手机端添加电脑的IP地址及端口号,然后单击右上角的Testing,如图14-7所示。

单击连接后,可选择下面的选项来选择需要接收的数据,此时如果能够读到sensorsimulator的模拟数据,就表明环境配置完成,如图14-8所示。

退出手机端的SensorSimulatorSettings软件,运行之前刚刚开发的Sample_14_1案例,便可观察到sensorsimulator工具模拟出来的加速度数据,如图14-9所示。