首先介绍加速度传感器。该传感器的作用主要是感应手机的运动。该传感器捕获三个参数,分别表示空间坐标系中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. 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
20. 20 myTextView2
21. 21 myTextView3
22. 22 //mySensorManager
23. 23
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
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
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>标记之前。如果在真机上调试,则不需要加入该权限。
- <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所示。