[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 adb install SensorSimulatorSettings.apk
图14-2 运行对话框 |
(点击查看大图)图14-3 安装apk到模拟器 |
创建一个名为Sample_14_1的Android项目。
搭建界面,用下列代码替代main.xml中的原有代码。
- 1 <?xml version="1.0" encoding="utf-8"?> <!-- 声明xml的版本及编码格式 -->
- 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- 3 android:orientation="vertical"
- 4 android:layout_width="fill_parent"
- 5 android:layout_height="fill_parent"> <!-- 添加一个垂直的线性布局 -->
- 6 <TextView
- 7 android:id="@+id/title"
- 8 android:gravity="center_horizontal"
- 9 android:textSize="20px"
- 10 android:layout_width="fill_parent"
- 11 android:layout_height="wrap_content"
- 12 android:text="@string/title"/> <!-- 添加一个TextView控件 -->
- 13 <TextView
- 14 android:id="@+id/myTextView1"
- 15 android:textSize="18px"
- 16 android:layout_width="fill_parent"
- 17 android:layout_height="wrap_content"
- 18 android:text="@string/myTextView1"/> <!-- 添加一个TextView控件 -->
- 19 <TextView
- 20 android:id="@+id/myTextView2"
- 21 android:textSize="18px"
- 22 android:layout_width="fill_parent"
- 23 android:layout_height="wrap_content"
- 24 android:text="@string/myTextView2"/> <!-- 添加一个TextView控件 -->
- 25 <TextView
- 26 android:id="@+id/myTextView3"
- 27 android:textSize="18px"
- 28 android:layout_width="fill_parent"
- 29 android:layout_height="wrap_content"
- 30 android:text="@string/myTextView3"/> <!-- 添加一个TextView控件 -->
- 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 package wyf.ytl; //声明所在包
- 2 import org.openintents.sensorsimulator.hardware.SensorManagerSimulator; //引入相关类
- 3 import android.app.Activity; //引入相关类
- 4 import android.hardware.SensorListener; //引入相关类
- 5 import android.hardware.SensorManager; //引入相关类
- 6 import android.os.Bundle; //引入相关类
- 7 import android.widget.TextView; //引入相关类
- 8 public class Sample_14_1 extends Activity {
- 9 TextView myTextView1; //X方向的加速度
- 10 TextView myTextView2; //Y方向的加速度
- 11 TextView myTextView3; //Z方向的加速度
- 12 //SensorManager mySensorManager; //SensorManager对象引用
- 13 SensorManagerSimulator mySensorManager; //声明SensorManagerSimulator对象,调试时用
- 14 Sensor mysensor;
- 15 @Override
- 16 public void onCreate(Bundle savedInstanceState) { //重写onCreate方法
- 17 super.onCreate(savedInstanceState);
- 18 setContentView(R.layout.activity_main); //设置当前的用户界面
- 19 myTextView1 = (TextView) findViewById(R.id.myTextView1); //得到myTextView1的引用
- 20 myTextView2 = (TextView) findViewById(R.id.myTextView2); //得到myTextView2的引用
- 21 myTextView3 = (TextView) findViewById(R.id.myTextView3); //得到myTextView3的引用
- 22 //mySensorManager =
- 23 (SensorManager)getSystemService(SENSOR_SERVICE); //获得SensorManager
- 24 //调试时用
- 25 mySensorManager = SensorManagerSimulator.getSystemService(this, SENSOR_SERVICE);
- 26 mySensorManager.connectSimulator(); //与Simulator连接
- 27 mysensor=mySensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
- 28 }
- 29 private SensorEventListener mySensorListener = new SensorEventListener(){
- 30
- 31 @Override
- 32 public void onAccuracyChanged(Sensor arg0, int arg1) {
- 33 // TODO Auto-generated method stub
- 34 }
- 35 @Override
- 36 public void onSensorChanged(SensorEvent arg0) {
- 37 // TODO Auto-generated method stub
- 38 if (arg0.type ==Sensor.TYPE_ACCELEROMETER ) {//只检查加速度的变化
- 39 myTextView1.setText("x方向上的加速度为:"+arg0.values[0]);
- 40 //将提取的x数据显示到TextView
- 41 myTextView2.setText("y方向上的加速度为:"+arg0.values[1]);
- 42 //将提取的y数据显示到TextView
- 43 myTextView3.setText("z方向上的加速度为:"+arg0.values[2]);
- 44 //将提取的x数据显示到TextView
- 45 }
- 46 }
- 47 };
- 48 @Override
- 49 protected void onResume() {
- 50 mySensorManager.registerListener(//注册监听
- 51 mySensorListener,
- 52 mysensor, //监听器SensorListener对象
- 53 SensorManager.SENSOR_DELAY_UI//传感器事件传递的频度
- 54 );
- 55 super.onResume();
- 56 }
- 57 @Override
- 58 protected void onPause() { //重写onPause方法
- 59 mySensorManager.unregisterListener(mySensorListener); //取消注册监听器
- 60 super.onPause();
- 61 }
- 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>标记之前。如果在真机上调试,则不需要加入该权限。
- <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所示。