- 浏览: 153853 次
- 性别:
- 来自: 沈阳
文章分类
最新评论
-
gybin:
这只是一部分, 更多情况是 资源也有,编译也通过了,是在运行 ...
android.view.InflateException: Binary XML file line #...Error inflating class .. -
hanyezhiyu8:
zhaorongrong0720 写道你好,有问题想问你,我现 ...
Mysql与MysqlODBC连接错误:Client does not support authentication protocol requested... -
zhaorongrong0720:
你好,有问题想问你,我现在出现了同样的错误,请问你所写的解决办 ...
Mysql与MysqlODBC连接错误:Client does not support authentication protocol requested... -
hanyezhiyu8:
onAccuracyChanged飞扬云 写道onAccura ...
Android 传感器 Sensor -
飞扬云:
onAccuracyChanged:你提到这个传感器的新的准确 ...
Android 传感器 Sensor
Android 平台是通过使用硬件传感器创建创新应用程序的理想平台,具有访问设备底层硬件的能力。
Android 设备不仅仅局限于 “手机”,还可以是部署在固定位置、具有无线网络连接的设备,比如 EDGE 或 WiFi。
Android SDK 中包含的一些面向硬件的功能描述如下:
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(int sensor,float values[])
方法在传感器值更改时调用。该方法只对受此应用程序监视的传感器调用(更多内容见下文)。该方法的参数包括:一个整数,指示更改的传感器;一个浮点值数组,表示传感器数据本身。有些传感器只提供一个数据值,另一些则提供三个浮点值。方向和加速表传感器都提供三个数据值。 - 当传感器的准确性更改时,将调用
onAccuracyChanged(int sensor,int accuracy)
方法。参数包括两个整数:一个表示传感器,另一个表示该传感器新的准确值。
要与传感器交互,应用程序必须注册以侦听与一个或多个传感器相关的活动。注册使用 SensorManager
类的 registerListener
方法完成。本文中的 代码示例 演示了如何注册和注销 SensorListener
。
记住,并非所有支持 Android 的设备都支持 SDK 中定义的所有传感器。如果某个传感器无法在特定的设备上使用,您的应用程序就会适当地降级。
样例应用程序仅监控对方向和加速表传感器的更改。当收到更改时,传感器值在 TextView
小部件的屏幕上显示。图 1 展示了该应用程序的运行情况。
使用 Eclipse 环境和 Android Developer Tools 插件创建的应用程序。
清单 1 展示了该应用程序的代码。
package com.msi.ibm.eyes; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; import android.hardware.SensorManager; import android.hardware.SensorListener; public class IBMEyes extends Activity implements SensorListener { final String tag = "IBMEyes"; SensorManager sm = null; TextView xViewA = null; TextView yViewA = null; TextView zViewA = null; TextView xViewO = null; TextView yViewO = null; TextView zViewO = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // get reference to SensorManager 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); } public void onSensorChanged(int sensor, 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("Orientation X: " + values[0]); yViewO.setText("Orientation Y: " + values[1]); zViewO.setText("Orientation Z: " + values[2]); } if (sensor == SensorManager.SENSOR_ACCELEROMETER) { xViewA.setText("Accel X: " + values[0]); yViewA.setText("Accel Y: " + values[1]); zViewA.setText("Accel Z: " + values[2]); } } } public void onAccuracyChanged(int sensor, int accuracy) { Log.d(tag,"onAccuracyChanged: " + sensor + ", accuracy: " + accuracy); } @Override protected void onResume() { super.onResume(); // register this class as a listener for the orientation and accelerometer sensors sm.registerListener(this, SensorManager.SENSOR_ORIENTATION |SensorManager.SENSOR_ACCELEROMETER, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onStop() { // unregister listener sm.unregisterListener(this); super.onStop(); } }
编写应用程序必须基于常见的活动,因为它只是利用从传感器获取的数据更新屏幕。在设备可能在前台执行其他活动的应用程序中,将应用程序构建为服务可能更加合适。
该活动的 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 开发设备上。
android.media 包包含与媒体子系统交互的类。使用 android.media.MediaRecorder
类进行媒体采样,包括音频和视频。MediaRecorder
作为状态机运行。您需要设置不同的参数,比如源设备和格式。设置后,可执行任何时间长度的录制,直到用户停止。
清单 2 包含的代码在 Android 设备上录制音频。显示的代码不包括应用程序的 UI 元素
MediaRecorder mrec ; File audiofile = null; private static final String TAG="SoundRecordingDemo"; protected void startRecording() throws IOException { mrec.setAudioSource(MediaRecorder.AudioSource.MIC); mrec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); if (mSampleFile == null) { File sampleDir = Environment.getExternalStorageDirectory(); try { audiofile = File.createTempFile("ibm", ".3gp", sampleDir); } catch (IOException e) { Log.e(TAG,"sdcard access error"); return; } } mrec.setOutputFile(audiofile.getAbsolutePath()); mrec.prepare(); mrec.start(); } protected void stopRecording() { mrec.stop(); mrec.release(); processaudiofile(audiofile.getAbsolutePath()); } protected void processaudiofile() { ContentValues values = new ContentValues(3); long current = System.currentTimeMillis(); values.put(MediaStore.Audio.Media.TITLE, "audio" + audiofile.getName()); values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current / 1000)); values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp"); values.put(MediaStore.Audio.Media.DATA, audiofile.getAbsolutePath()); ContentResolver contentResolver = getContentResolver(); Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; Uri newUri = contentResolver.insert(base, values); sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, newUri)); }
在 startRecording
方法中,实例化并初始化 MediaRecorder
的实例:
- 输入源被设置为麦克风(
MIC
)。 - 输出格式被设置为 3GPP(*.3gp 文件),这是移动设备专用的媒体格式。
- 编码器被设置为
AMR_NB
,这是音频格式,采样率为 8 KHz。NB 表示窄频。SDK 文档 解释了不同的数据格式和可用的编码器。
音频文件存储在存储卡而不是内存中。External.getExternalStorageDirectory()
返回存储卡位置的名称,在该目录中将创建一个临时文件名。然后,通过调用 setOutputFile
方法将文件关联到 MediaRecorder
实例。音频数据将存储到该文件中。
调用 prepare
方法完成 MediaRecorder
的初始化。准备开始录制流程时,将调用 start
方法。在调用 stop
方法之前,将对存储卡上的文件进行录制。release 方法将释放分配给 MediaRecorder
实例的资源。
音频采样完成之后,需要采取以下步骤:
- 向设备的媒体库添加该音频。
- 执行一些模式识别步骤确定声音:
- 这是婴儿的啼哭声吗?
- 这是所有人的声音吗?是否要解锁手机?
- 这是 “芝麻开门” 吗?是否要打开通往 “秘密通道” 的大门?
- 自动将音频文件上传到网络位置以便处理。
在该代码样例中,processaudiofile
方法将音频添加到媒体库。使用 Intent
通知设备上的媒体应用程序有新内容可用。
关于该代码片段最后要注意的是:如果您试用,它一开始不会录制音频。您将看到创建的文件,但是没有任何音频。您需要向 AndroidManifest.xml 文件添加权限:
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission> |
现在,您已经学了一点关于与 Android 传感器和录制音频相关的内容。下一节将更全面的介绍与数据采集和报告系统有关的应用程序架构。
Android 平台包含各种用于监视环境的传感器选项。有了输入或模拟选项数组,以及高级计算和互联功能,Android 成为构建实际系统的最佳平台。图 2 显示了输入、应用程序逻辑、通知方法或输出之间的简单视图。
该架构很灵活;应用程序逻辑可以划分为本地 Android 设备和服务器端资源(可以实现更大的数据库和计算功能)。例如,本地 Android 设备上录制的音轨可以 POST
到 Web 服务器,其中将根据音频模式数据库比较数据。很明显,这仅仅是冰山一角。希望您能更深入地研究,让 Android 平台超越移动电话的范畴。
from:http://www.ibm.com/developerworks/cn/opensource/os-android-sensor/#download
1.Sensor Type
重力感应/加速度传感器 (G-Sensor)
光感应 (Light-Sensor)
温度感应
方向感应
磁场、
临近性
2.Sensor编程步骤
a.获取系统服务(SENSOR_SERVICE)返回一个SensorManager 对象
sensormanager = (SensorManager)getSystemSeriver(SENSOR_SERVICE);
b.通过SensorManager对象获取相应的Sensor类型的对象
sensorObject = sensormanager.getDefaultSensor(sensor Type);
c.声明一个SensorEventListener 对象用于侦听Sensor 事件,并重载onSensorChanged方法
SensorEventListener sensorListener = new SensorEventListener(){
};
d.注册相应的SensorService
sensormanager.registerListener(sensorListener, sensorObject, Sensor TYPE);
e.销毁相应的SensorService
sensormanager.unregisterListener(sensorListener, sensorObject);
f: SensorListener 接口是传感器应用程序的中心。它包括两个必需方法:
onSensorChanged(int sensor,float values[]) 方法在传感器值更改时调用。
该方法只对受此应用程序监视的传感器调用(更多内容见下文)。该方法的参数包括:一个整数,指示更改的传感器;一个浮点值数组,表示传感器数据本身。有些传感器只提供一个数据值,另一些则提供三个浮点值。方向和加速表传感器都提供三个数据值。
当传感器的准确性更改时,将调用 onAccuracyChanged(int sensor,int accuracy) 方法。参数包括两个整数:一个表示传感器,另一个表示该传感器新的准确值。
评论
下面四个整数值:
SensorManager.SENSOR_DELAY_FASTEST = 0 [0x0]
SensorManager.SENSOR_DELAY_GAME = 1 [0x1]
SensorManager.SENSOR_DELAY_UI = 2 [0x2]
SensorManager.SENSOR_DELAY_NORMAL = 3 [0x3]
发表评论
-
Android崩溃日志-混淆前后映射表
2013-10-29 14:56 1219在proguard.cfg中加入: -pri ... -
Android中SurfaceView设置背景为透明-Canvas透明清除
2013-06-07 14:28 6880创建时: SurfaceView.setZOrder ... -
Touch各種事件簡介
2012-11-21 15:06 726boolean onDoubleTap(Moti ... -
弹出用户终止应用程序提醒对话框时机
2011-12-23 11:48 1082由于android本身是单线程模型,UI主线程是不安全的,所以 ... -
Android中px和dip的转换代码
2011-10-12 10:55 2375转换: /** * 根据手机的分辨率从 dp 的单 ... -
Android中用Spinner和AutoCompleteTextView产生类似PC或网站上的下拉框列表
2011-09-18 03:43 3367原创链接:http://inuts.iteye.com/ ... -
Android中使用派生自ViewFlipper的自定义控件和GestureDetector实现平滑滚动翻页
2011-08-30 16:35 2063--------------------------- ... -
android : 控件在代码中设置属性-setWidth(int pixels)或setHeight(int pixels)的px与dip转换
2011-03-15 11:30 6737---------------------------- ... -
Android : Spinner初始化时填充默认值数据
2011-03-15 11:18 6804---------------------------- ... -
Android-NDK:JNI本地文件中怎么调试打印输出到LOGCAT
2011-01-24 23:35 3583---------------------------- ... -
Android 允许权限
2010-11-29 16:54 1010<uses-permission android:nam ...
相关推荐
Android 传感器 Sensor 编程
Android 传感器(Sensor)API教程 (六) 加速度传感器运用实例 Android 传感器(Sensor)API教程 (六) 加速度传感器运用实例
Android重力感应传感器小球 Sensor.TYPE_ACCELEROMETER
android传感器定向库使用所有可用的设备传感器,帮助您获得更精确的定向矢量值。
Android_Sensor传感器系统架构初探
Wrox.Professional.Android.Sensor.Programming.2012
详细解释andorid上传感器的应用,包括GPS定位传感器,light sensor,等等
Android传感器MotionSensor开发实验 ⽬录 ⼀、实验⽬的 ⼀、实验⽬的 1. 了解Android开发 2. 掌握传感器调⽤ 3. 交互式界⾯设计 ⼆、实验要求 ⼆、实验要求 1) 搭建开发平台; 2)编写简单程序,实现按钮、屏幕操作的...
Android传感器高级编程,英文版;良心分,两分! 注意:本文档是完整版本,网上很多版本都缺页
Android 获取手机所有Sensor(传感器)并测试数据源码~~注意:代码使用JDK 1.7.0_40 版本编译,低于此版本的话会出错,这时可以自己新建项目copy即可。
Android传感器的各种使用,简单易用,可直接用到工程中,高质量代码封装,工程完整。
android姿态传感器源代码,非常简单的源代码,直接运行,很适合初学了解Android传感器 从另一个角度划分,安卓的传感器又可以分为基于硬件的和基于软件的。基于硬件的传感器往往是通过物理组件去实现的,他们通常是...
android 传感器 操作代码 protected void onResume() { super.onResume(); sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_...
android 传感器之 光线传感器 光线传感器的类型常量是Sensor.TYPE_LIGHT。values数组只有第一个元素(values[0])有意义。表示光线的强度。最大的值是120000.0f
STM Sensor HAL 依靠Linux IIO 框架从传感器设备驱动程序中收集数据并将样本转发到 Android 框架 目前支持的传感器有: 惯性模块单元(IMU): LSM330, LSM330DLC, LSM6DS3, LSM6DS3H, LSM6DSM, LSM6DSL, LSM6DS0,...
加速度传感器_G-sensor_重力传感器(accelerometer)原理
Android 加速度传感器的类型是 Sensor.TYPE_ACCELEROMETER 通过 android.hardware.SensorEvent 返回加速度传感器值。
适于自学的Andorid传感器学习指南,基于Android 2.2、2.3.3及3.0版本讲解
android(系统原理与移植)-android传感器移植
主要为大家详细介绍了Android利用Sensor传感器实现水平仪功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下