深入探讨 Android 传感器.docx
- 文档编号:23073782
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:14
- 大小:68.79KB
深入探讨 Android 传感器.docx
《深入探讨 Android 传感器.docx》由会员分享,可在线阅读,更多相关《深入探讨 Android 传感器.docx(14页珍藏版)》请在冰豆网上搜索。
深入探讨Android传感器
深入探讨Android传感器
博客分类:
∙Android
Android应用服务器浏览器网络应用活动
Android是一个面向应用程序开发的富平台,它拥有许多具有吸引力的用户界面元素和数据管理功能。
Android还提供了一组丰富的接口选项。
在本文中,学习如何配合使用Android的各种传感器选项监控您的环境。
样例代码展示了如何在Android电话中录制音频。
想构建自己的婴儿监视器吗?
想用声音来接听电话或者打开房门吗?
请学习如何利用配备有Android的设备的硬件功能。
简介
对于Java™开发人员来说,Android平台是通过使用硬件传感器创建创新应用程序的理想平台。
我们将学习一些可用于Android应用程序的接口连接选项,包括使用传感器子系统和录制音频片段。
利用配备Android的设备的硬件功能可以构建哪些应用程序呢?
任何需要电子监视和监听的应用程序都可以构建。
婴儿监视器、安全系统,甚至地震仪都可以。
理论上讲,您不能同时出现在两个地方,但Android可以利用一些可行的方法实现这一点。
纵观本文始末,您必须记住,使用的Android设备不仅仅局限于“手机”,还可以是部署在固定位置、具有无线网络连接的设备,比如EDGE或WiFi。
Android传感器功能
使用Android平台有一个很新颖的地方,那就是您可以在设备内部访问一些“好工具”。
过去,访问设备底层硬件的能力一度让移动开发人员感到非常棘手。
尽管AndroidJava环境的角色仍然是您和设备的桥梁,但Android开发团队让许多硬件功能浮出了水面。
该平台是一个开源平台,因此您可以自由地编写代码实现您的任务。
如果尚未安装Android,您可以下载AndroidSDK。
您还可以浏览android.hardware包的内容并参考本文的示例。
android.media包包含了一些提供有用和新颖功能的类。
AndroidSDK中包含的一些面向硬件的功能描述如下。
表1.AndroidSDK中提供的面向硬件的特性
特性描述
android.hardware.Camera允许应用程序与相机交互的类,可以截取照片、获取预览屏幕的图像,修改用来治理相机操作的参数。
android.hardware.SensorManager允许访问Android平台传感器的类。
并非所有配备Android的设备都支持SensorManager中的所有传感器,虽然这种可能性让人非常兴奋。
(可用传感器的简介见下文)
android.hardware.SensorListener在传感器值实时更改时,希望接收更新的类要实现的接口。
应用程序实现该接口来监视硬件中一个或多个可用传感器。
例如,本文中的代码包含实现该接口的类,实现后可以监视设备的方向和内置的加速表。
android.media.MediaRecorder用于录制媒体样例的类,对于录制特定位置(比如婴儿保育)的音频活动非常有用。
还可以分析音频片段以便在访问控件或安全应用程序时进行身份鉴定。
例如,它可以帮助您通过声音打开门,以节省时间,不需要从房产经纪人处获取钥匙。
android.FaceDetector允许对人脸(以位图形式包含)进行基本识别的类。
不可能有两张完全一样的脸。
可以使用该类作为设备锁定方法,无需记密码—这是手机的生物特征识别功能。
android.os.*包含几个有用类的包,可以与操作环境交互,包括电源管理、文件查看器、处理器和消息类。
和许多可移动设备一样,支持Android的电话可能会消耗大量电能。
让设备在正确的时间“醒来”以监视感兴趣的事件是在设计时需要首先关注的方面。
java.util.Date
java.util.Timer
java.util.TimerTask当测量实际的事件时,数据和时间往往很重要。
例如,java.util.Date类允许您在遇到特定的事件或状况时获取时间戳。
您可以使用java.util.Timer和java.util.TimerTask分别执行周期性任务或时间点任务。
android.hardware.SensorManager包含几个常量,这表示Android传感器系统的不同方面,包括:
传感器类型
方向、加速表、光线、磁场、临近性、温度等。
采样率
最快、游戏、普通、用户界面。
当应用程序请求特定的采样率时,其实只是对传感器子系统的一个提示,或者一个建议。
不保证特定的采样率可用。
准确性
高、低、中、不可靠。
SensorListener接口是传感器应用程序的中心。
它包括两个必需方法:
onSensorChanged(intsensor,floatvalues[])方法在传感器值更改时调用。
该方法只对受此应用程序监视的传感器调用(更多内容见下文)。
该方法的参数包括:
一个整数,指示更改的传感器;一个浮点值数组,表示传感器数据本身。
有些传感器只提供一个数据值,另一些则提供三个浮点值。
方向和加速表传感器都提供三个数据值。
当传感器的准确性更改时,将调用onAccuracyChanged(intsensor,intaccuracy)方法。
参数包括两个整数:
一个表示传感器,另一个表示该传感器新的准确值。
要与传感器交互,应用程序必须注册以侦听与一个或多个传感器相关的活动。
注册使用SensorManager类的registerListener方法完成。
本文中的代码示例演示了如何注册和注销SensorListener。
记住,并非所有支持Android的设备都支持SDK中定义的所有传感器。
如果某个传感器无法在特定的设备上使用,您的应用程序就会适当地降级。
传感器示例
样例应用程序仅监控对方向和加速表传感器的更改。
当收到更改时,传感器值在TextView小部件的屏幕上显示。
图1展示了该应用程序的运行情况。
使用Eclipse环境和AndroidDeveloperTools插件创建的应用程序。
(关于使用Eclipse开发Android应用程序的信息,请参见参考资料。
)清单1展示了该应用程序的代码。
清单1.IBMEyes.java
1.viewplaincopytoclipboardprint?
packagecom.msi.ibm.eyes; importandroid.app.Activity; importandroid.os.Bundle; importandroid.util.Log; importandroid.widget.TextView; importandroid.hardware.SensorManager; importandroid.hardware.SensorListener; publicclassIBMEyesextendsActivityimplementsSensorListener{ finalStringtag="IBMEyes"; SensorManagersm=null; TextViewxViewA=null; TextViewyViewA=null; TextViewzViewA=null; TextViewxViewO=null; TextViewyViewO=null; TextViewzViewO=null; /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); //getreferencetoSensorManager sm=(SensorManager)getSystemService(SENSOR_SERVICE); setContentView(R.layout.main); xViewA=(TextView)findViewById(R.id.xbox); yViewA=(TextView)findViewById(R.id.ybox); zViewA=(TextView)findViewById(R.id.zbox); xViewO=(TextView)findViewById(R.id.xboxo); yViewO=(TextView)findViewById(R.id.yboxo); zViewO=(TextView)findViewById(R.id.zboxo); } publicvoidonSensorChanged(intsensor,float[]values){ synchronized(this){ Log.d(tag,"onSensorChanged:
"+sensor+",x:
"+ values[0]+",y:
"+values[1]+",z:
"+values[2]); if(sensor==SensorManager.SENSOR_ORIENTATION){ xViewO.setText("OrientationX:
"+values[0]); yViewO.setText("OrientationY:
"+values[1]); zViewO.setText("OrientationZ:
"+values[2]); } if(sensor==SensorManager.SENSOR_ACCELEROMETER){ xViewA.setText("AccelX:
"+values[0]); yViewA.setText("AccelY:
"+values[1]); zViewA.setText("AccelZ:
"+values[2]); } } } publicvoidonAccuracyChanged(intsensor,intaccuracy){ Log.d(tag,"onAccuracyChanged:
"+sensor+",accuracy:
"+accuracy); } @Override protectedvoidonResume(){ super.onResume(); //registerthisclassasalistenerfortheorientationandaccelerometersensors sm.registerListener(this, SensorManager.SENSOR_ORIENTATION|SensorManager.SENSOR_ACCELEROMETER, SensorManager.SENSOR_DELAY_NORMAL); } @Override protectedvoidonStop(){ //unregisterlistener sm.unregisterListener(this); super.onStop(); } } packagecom.msi.ibm.eyes;
2.importandroid.app.Activity;
3.importandroid.os.Bundle;
4.importandroid.util.Log;
5.importandroid.widget.TextView;
6.importandroid.hardware.SensorManager;
7.importandroid.hardware.SensorListener;
8.publicclassIBMEyesextendsActivityimplementsSensorListener{
9. finalStringtag="IBMEyes";
10. SensorManagersm=null;
11. TextViewxViewA=null;
12. TextViewyViewA=null;
13. TextViewzViewA=null;
14. TextViewxViewO=null;
15. TextViewyViewO=null;
16. TextViewzViewO=null;
17.
18. /**Calledwhentheactivityisfirstcreated.*/
19. @Override
20. publicvoidonCreate(BundlesavedInstanceState){
21. super.onCreate(savedInstanceState);
22. //getreferencetoSensorManager
23. sm=(SensorManager)getSystemService(SENSOR_SERVICE);
24. setContentView(R.layout.main);
25. xViewA=(TextView)findViewById(R.id.xbox);
26. yViewA=(TextView)findViewById(R.id.ybox);
27. zViewA=(TextView)findViewById(R.id.zbox);
28. xViewO=(TextView)findViewById(R.id.xboxo);
29. yViewO=(TextView)findViewById(R.id.yboxo);
30. zViewO=(TextView)findViewById(R.id.zboxo);
31. }
32. publicvoidonSensorChanged(intsensor,float[]values){
33. synchronized(this){
34. Log.d(tag,"onSensorChanged:
"+sensor+",x:
"+
35.values[0]+",y:
"+values[1]+",z:
"+values[2]);
36. if(sensor==SensorManager.SENSOR_ORIENTATION){
37. xViewO.setText("OrientationX:
"+values[0]);
38. yViewO.setText("OrientationY:
"+values[1]);
39. zViewO.setText("OrientationZ:
"+values[2]);
40. }
41. if(sensor==SensorManager.SENSOR_ACCELEROMETER){
42. xViewA.setText("AccelX:
"+values[0]);
43. yViewA.setText("AccelY:
"+values[1]);
44. zViewA.setText("AccelZ:
"+values[2]);
45. }
46. }
47. }
48.
49. publicvoidonAccuracyChanged(intsensor,intaccuracy){
50. Log.d(tag,"onAccuracyChanged:
"+sensor+",accuracy:
"+accuracy);
51. }
52. @Override
53. protectedvoidonResume(){
54. super.onResume();
55. //registerthisclassasalistenerfortheorientationandaccelerometersensors
56. sm.registerListener(this,
57. SensorManager.SENSOR_ORIENTATION|SensorManager.SENSOR_ACCELEROMETER,
58. SensorManager.SENSOR_DELAY_NORMAL);
59. }
60.
61. @Override
62. protectedvoidonStop(){
63. //unregisterlistener
64. sm.unregisterListener(this);
65. super.onStop();
66. }
67.}
复制代码
编写应用程序必须基于常见的活动,因为它只是利用从传感器获取的数据更新屏幕。
在设备可能在前台执行其他活动的应用程序中,将应用程序构建为服务可能更加合适。
该活动的onCreate方法可以引用SensorManager,其中包含所有与传感器有关的函数。
onCreate方法还建立了对6个TextView小部件的引用,您需要使用传感器数据值更新这些小部件。
onResume()方法使用对SensorManager的引用通过registerListener方法注册传感器更新:
第一个参数是实现SensorListener接
第二个参数是所需传感器的位掩码。
在本例中,应用程序从SENSOR_ORIENTATION和SENSOR_ACCELEROMETER请求数据。
第三个参数是一个系统提示,指出应用程序更新传感器值所需的速度。
应用程序(活动)暂停后,需要注销侦听器,这样以后就不会再收到传感器更新。
这通过SensorManager的unregisterListener方法实现。
惟一的参数是SensorListener的实例。
在registerListener和unregisterListener方法调用中,应用程序使用关键字this。
注意类定义中的implements关键字,其中声明了该类实现SensorListener接口。
这就是要将它传递到registerListener和unregisterListener的原因。
SensorListener必须实现两个方法onSensorChange和onAccuracyChanged。
示例应用程序不关心传感器的准确度,但关注传感器当前的X、Y和Z值。
onAccuracyChanged方法实质上不执行任何操作;它只在每次调用时添加一个日志项。
似乎经常需要调用onSensorChanged方法,因为加速表和方向传感器正在快速发送数据。
查看第一个参数确定哪个传感器在发送数据。
确认了发送数据的传感器之后,将使用方法第二个参数传递的浮点值数组中所包含的数据更新相应的UI元素。
该示例只是显示这些值,但在更加高级的应用程序中,还可以分析这些值,比较原来的值,或者设置某种模式识别算法来确定用户(或外部环境)的行为。
现在您已经了解了传感器子系统,接下来的部分将回顾一个在Android手机上录制音频的代码样例。
该样例运行在DEV1开发设备上。
使用MediaRecorder
android.media包包含与媒体子系统交互的类。
使用android.media.MediaRecorder类进行媒体采样,包括音频和视频。
MediaRecorder作为状态机运行。
您需要设置不同的参数,比如源设备和格式。
设置后,可执行任何时间长度的录制,直到用户停止。
清单2包含的代码在Android设备上录制音频。
显示的代码不包括应用程序的UI元素。
清单2.录制音频片段
1.viewplaincopytoclipboardprint?
MediaRecordermrec; Fileaudiofile=null; privatestaticfinalStringTAG="SoundRecordingDemo"; protectedvoidstartRecording()throwsIOException { mrec.setAudioSource(MediaRecorder.AudioSource.MIC); mrec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mrec.se
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深入探讨 Android 传感器 深入 探讨
![提示](https://static.bdocx.com/images/bang_tan.gif)