正文  设备功能 > 传感器 >

Android模拟器小工具实现模拟传感器(详解)

最近学习了下传感器的操作,但很多书籍都直接讲怎么取值,没有讲清楚怎么分辨不同类型传感器XYZ坐标方向的问题,小马这篇文章主要来说下方向的分辨及小工具实现模拟真机传感器的访问,因为小马在方向感上...

最近学习了下传感器的操作,但很多书籍都直接讲怎么取值,没有讲清楚怎么分辨不同类型传感器XYZ坐标方向的问题,小马这篇文章主要来说下方向的分辨及小工具实现模拟真机传感器的访问,因为小马在方向感上很YUN....所以写这篇文章来理下自己的脑瓜..希望对大家有帮助:先贴下效果图,后面再细讲:
一:小工具贴图,请详细看下改变方向时三个值的变化
 

二:手机中装入小工具APK贴图效果:
 

三:监听端口效果图:
 

四:设置手机连接小工具贴图:
 

五:模拟手机摆动

  在此,小马讲下常用的传感器的XYZ轴,一定要搞清楚方向,不然晕....
  1》:手机屏幕XY方向,因为手机屏幕没Z轴,随便哪只手拿着手机,那么左上角     为原点,X正方向向右,Y轴正方向向下....
  2》:加速传感器方向,随便哪只手正常拿着手机时,右下角为原点,X轴沿屏幕     向右,Y轴沿屏幕向上,Z轴垂直屏幕向上....
  3》:姿态传感器,上面动态图中的Yaw...Pitch...Roll三个轴就搞笑了,具体是     这样的:
      3.1:Yaw轴,方向不变,一起是重力加速度g的反方向,也就是一起垂直向上
      3.2:Pitch轴,并不是固定不变,随着Yaw的变化而变化,只有与Yaw轴成90度           角永远不变,无论手机怎么转,它是一起与Yaw垂直不变的哦....
      3.3:Roll轴沿手机屏幕向上,无论手机怎样放置,Roll的方向都是沿屏幕向           上,可以说与手机绑定死了...
  效果看完了,现在来看下具体的实现过程吧,吼吼,说难不难,说简单也不简单,使用的模拟器小工具小马因为过大,小马上传不上来,我会给出连接,需要的朋友可以自行访问下载下的,写下使用步骤(流水帐了....),看不懂使用步骤的可以在下载小工具的链接中找更为详细的使用方法哦,自己试着找下吧...
 1.将下载的小工具libs包导入到我们工程中
 2.再找到下载的小工具中Jar包,可直接点击运行,用来监听端口,实现模拟
 3.再将小工具中的APK文件装到模拟器中,运行这个APK程序,设置下IP 端口
 4.点击Conn...连接到小工具,端口要与模拟器配置的端口一致,否则无效
 5.大体就是这样了,下面小马再贴下代码,不懂的朋友不用担心,看完就明白了
主控制代码:
  

1. package com.xiaoma.sensor.demo;
2. 
3. import org.openintents.sensorsimulator.hardware.SensorManagerSimulator;
4. 
5. import android.app.Activity;
6. import android.hardware.Sensor;
7. import android.hardware.SensorEvent;
8. import android.hardware.SensorEventListener;
9. import android.hardware.SensorListener;
10. import android.hardware.SensorManager;
11. import android.os.Bundle;
12. import android.util.Log;
13. import android.widget.TextView;
14. 
15. /**
16.  * @Title: SensorDemoActivity.java
17.  * @Package com.xiaoma.sensor.demo
18.  * @Description: 传感器测试
19.  * @author XiaoMa 
20.  */
21. public class SensorDemoActivity extends Activity implements
22.         org.openintents.sensorsimulator.hardware.SensorEventListener {
23. 
24.     private TextView tView;
25.     private TextView tView2;
26.     private TextView tView3;
27.     // private SensorManager manager = null;
28.     private SensorManagerSimulator imulatorManager = null;
29. 
30.     /** Called when the activity is first created. */
31.     @Override
32.     public void onCreate(Bundle savedInstanceState) {
33.         super.onCreate(savedInstanceState);
34.         setContentView(R.layout.main);
35.         init();
36.     }
37. 
38.     /**
39.      * 初始化方法实现
40.      */
41.     private void init() {
42. 
43.         tView = (TextView) findViewById(R.id.textview);
44.         tView2 = (TextView) findViewById(R.id.textview2);
45.         tView3 = (TextView) findViewById(R.id.textview3);
46.         
47.         /**
48.          * 一般取传感器服务的方式只有一种,今天小马来说下借助Google提供的工具来实现
49.          * 在模拟器上模拟真机的传感器测试,很爽的哦....不用真机也可以测效果,在此先
50.          * 注释下,下面的方式一是用正常的方式取传感器服务,方式二是用工具来实现模拟真机
51.          * 效果,但方式一无法在模拟器上测试,所以小马就注释掉,用方式二来进行讲解
52.          */
53.         
54.         //下面这行注释是取得系统级传感器服务   方式一:
55.         // manager= (SensorManager)getSystemService(SENSOR_SERVICE);
56.         
57.         //方式二:取得模拟器模拟的传感器服务
58.         imulatorManager = SensorManagerSimulator.getSystemService(this,
59.                 SENSOR_SERVICE);
60.         //连接模拟传感器的工具
61.         imulatorManager.connectSimulator();
62. 
63.         /**
64.          * 此处是小马犯的错,就是在注释传感器监听的时候直接在初始化方法里面注释,但官方
65.          * 的指示是在onResume方法里面注释,固此小马写在这个地方,供大家参考,下面注释
66.          * 内容大家不要在这个地方注册,有关传感器的注册都在onResume方法里注册,吼吼,
67.          * 下面是方式一注册:
68.          */
69.         // manager.registerListener(this,
70.         // manager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
71.         // SensorManager.SENSOR_DELAY_GAME);
72.         // manager.registerListener(this,
73.         // manager.getDefaultSensor(Sensor.TYPE_GRAVITY),
74.         // SensorManager.SENSOR_DELAY_GAME);
75.         // Sensor sensor3 =
76.         // manager.getDefaultSensor(sensor.TYPE_ACCELEROMETER);//加速度
77.     }
78. 
79.     //onCreate>>onStart>>onResume...简单的复习下生命周期
80.     @Override
81.     protected void onResume() {
82.         
83.         
84.         /*方式一注册:
85.          * imulatorManager.registerListener(this,
86.          * imulatorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
87.          * SensorManager.SENSOR_DELAY_GAME);
88.          * imulatorManager.registerListener(this,
89.          * imulatorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),
90.          * SensorManager.SENSOR_DELAY_GAME);
91.          * imulatorManager.registerListener(this,
92.          * imulatorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
93.          * SensorManager.SENSOR_DELAY_GAME);
94.          */
95.         
96.         //方式二注册
97.         imulatorManager.registerListener(this,
98.                 imulatorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
99.                 SensorManager.SENSOR_DELAY_GAME);
100.         imulatorManager.registerListener(this,
101.                 imulatorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE),
102.                 SensorManager.SENSOR_DELAY_GAME);
103.         imulatorManager.registerListener(this,
104.                 imulatorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
105.                 SensorManager.SENSOR_DELAY_GAME);
106.         super.onResume();
107.     }
108. 
109.     /**
110.      * 下面这个监听本来是用来监听传感器的,后来版本升级用SensorEventListener来代码下面这
111.      * 段代码了,小马写在这个地方只为与新版对比下,很有特点,希望大家仔细观察下....
112.      */
113.     /*
114.      * private SensorListener listener = new SensorListener() {
115.      * 
116.      * @Override public void onSensorChanged(int sensor, float[] values) { }
117.      * 
118.      * @Override public void onAccuracyChanged(int sensor, int accuracy) { } };
119.      */
120. 
121.     
122.     
123.     
124.     /**
125.      * 因为当前类实现Google提供工具中的接口类,下面这两个方法必须实现
126.      * 细心的朋友可以发现与上面的不同之处了吧
127.      */
128.     @Override
129.     public void onAccuracyChanged(
130.             org.openintents.sensorsimulator.hardware.Sensor arg0, int arg1) {
131.     }
132. 
133.     @Override
134.     public void onSensorChanged(
135.             org.openintents.sensorsimulator.hardware.SensorEvent event) {
136.         Log.i("XiaoMa", "调用onSensorChanged()方法了");
137.         float x = event.values[SensorManager.DATA_X];// 或直接写:values[0]
138.         float y = event.values[SensorManager.DATA_Y];// 或直接写:values[1]
139.         float z = event.values[SensorManager.DATA_Z];// 或直接写:values[2]
140. 
141.         if (SensorManager.SENSOR_ORIENTATION == event.sensor.TYPE_ORIENTATION) {
142.             tView.setText("方向传感器:" + "\n" + "X:" + x + "\n" + "Y:" + y + "\n"
143.                     + "Z:" + z + "\n");
144.         }
145.         if (SensorManager.SENSOR_ACCELEROMETER == event.sensor.TYPE_ACCELEROMETER) {
146.             tView3.setText("加速传感器:" + "\n" + "X:" + x + "\n" + "Y:" + y + "\n"
147.                     + "Z:" + z + "\n");
148.         }
149. 
150.         /**
151.          * 本来这个地方要写的是重力传感器,但在这个插件下没有重力传感器,临时改成温度了,类同...
152.          * 工具当中没有不代表设备中没有,这篇文章目的是为了借助工具实现在模拟上模拟真机传感器测试
153.          */
154.         if (SensorManager.SENSOR_TEMPERATURE == event.sensor.TYPE_TEMPERATURE) {
155.             tView3.setText("温度传感器:" + "\n" + "X:" + x + "\n" + "Y:" + y + "\n"
156.                     + "Z:" + z + "\n");
157.         }
158. 
159.     }
160. 
161.     /*
162.      * 方式:下面也是同样的事件函数,写在这个地方也为与其它版本对比,省了翻来翻去
163.      * @Override public void onSensorChanged(SensorEvent event) { 
164.      * float x = event.values[SensorManager.DATA_X];//或直接写:values[0] 
165.      * float y = event.values[SensorManager.DATA_Y];//或直接写:values[1] 
166.      * float z = event.values[SensorManager.DATA_Z];//或直接写:values[2]
167.      * 
168.      * switch (event.sensor.getType()) { case Sensor.TYPE_ORIENTATION:
169.      * tView.setText("方向传感器:"+"\n"+"X:"+x+"\n"+"Y:"+y+"\n"+"Z:"+z+"\n"); break;
170.      * case Sensor.TYPE_GRAVITY:
171.      * tView2.setText("重力传感器:"+"\n"+"X:"+x+"\n"+"Y:"+y+"\n"+"Z:"+z+"\n"); break;
172.      * case Sensor.TYPE_ACCELEROMETER:
173.      * tView3.setText("加速传感器:"+"\n"+"X:"+x+"\n"+"Y:"+y+"\n"+"Z:"+z+"\n");
174.      * 
175.      * default: break; }
176.      * 
177.      * }
178.      */
179. 
180.     /*
181.      * @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { }
182.      */
183. 
184.     /**
185.      * 朋友也注意下,最后这步也很重要,因为一个设备上可以有多个传感器,况且传感器很耗电量,
186.      * 所以用完之后一定养成好习惯,及时关闭传感器,留电量给用户用在其它地方
187.      */
188.     @Override
189.     protected void onStop() {
190.         // manager.unregisterListener(this);
191.         imulatorManager.unregisterListener(this);
192.         super.onStop();
193.     }
194.     
195.     
196.     /**
197.      * 最后小马贴下传感器学习的很不错的Google网址,有兴趣的朋友可以自行浏览下
198.      * http://code.google.com/p/openintents/wiki/SensorSimulator
199.      * 或:
200.      * http://developer.android.com/guide/topics/sensors/index.html
201.      */
202. }
全局配置文件:
 
1. <?xml version="1.0" encoding="utf-8"?>
2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3.     package="com.xiaoma.sensor.demo"
4.     android:versionCode="1"
5.     android:versionName="1.0" >
6. 
7.     <uses-sdk android:minSdkVersion="7" />
8.     <!-- 因为今天讲的是用工具来模拟真实的传感器数据,因工具中用到了网络连接,因此需要开启以下权限 -->
9.     <uses-permission android:name="android.permission.INTERNET"/>
10.     <application
11.         android:icon="@drawable/ic_launcher"
12.         android:label="@string/app_name" >
13.         <activity
14.             android:name=".SensorDemoActivity"
15.             android:label="@string/app_name" >
16.             <intent-filter>
17.                 <action android:name="android.intent.action.MAIN" />
18. 
19.                 <category android:name="android.intent.category.LAUNCHER" />
20.             </intent-filter>
21.         </activity>
22.     </application>
23. </manifest>
j最后,老规矩的,小DEMO源码放附件里,有需要的朋友可以下载下,学习交流,再讲下,在模拟取值的实现有可以模拟器中取不到值哦,其实还是取不到,而是模拟器不给力,再启下就可以了,吼吼....小工具的下载地址是:
http://code.google.com/p/androidjustice/downloads/detail?name=sensorsimulator-1.0.0-beta1.zip&can=2&q=
因为小马也在学习阶段,如有发现有什么不对的地方,可直接批评指出,小马跟大家一起交流进步,谢谢提出问题的朋友....谢谢

 

摘自  酷_莫名简单