android传感器

Android平台特别适合Java™开发人员,是使用硬件传感器创建创新应用程序的理想选择。 了解可用于Android应用程序的一些接口选项,包括使用传感器子系统和录制音频片段。

您可能会构建哪种类型的应用程序,以利用配备Android的设备的硬件功能? 任何需要电子眼睛和耳朵的东西都是不错的选择。 我想到了婴儿监视器,安全系统甚至地震仪。 尽管从形而上来讲,您不能一次位于两个地方,但Android可能会以一些实用的方式帮助弥合这种差距。 在整个本文中,请记住,使用的Android设备不仅是“手机”,而且可能是部署在具有无线网络连接的固定位置的设备,例如EDGE或WiFi。 下载本文示例的源文件。

Android感应器功能

使用Android平台的一个令人耳目一新的方面是,您可以访问设备本身内的某些“好东西”。 从历史上看,无法访问设备的底层硬件使移动开发人员感到沮丧。 尽管Android Java环境仍然位于您和硬件之间,但Android开发团队将许多硬件功能带到了表面。 该平台是开源的,因此您可以灵活地收拾袖子并编写一些代码来完成任务。

如果尚未安装,则可能要下载 Android SDK。 您还可以浏览 android.hardware软件包的内容,并按照本文中的示例进行操作。 android.media包包含提供有用和新颖功能的类。

以下介绍了Android SDK中公开的一些面向硬件的功能。

表1. Android SDK中公开的面向硬件的功能
特征 描述
android.hardware.Camera 一个类,使您的应用程序可以与相机交互以拍摄照片,获取预览屏幕图像以及修改用于控制相机操作方式的参数。
android.hardware.SensorManager 允许访问Android平台内可用传感器的类。 并不是每台配备Android的设备都支持SensorManager中的所有传感器,尽管考虑各种可能性很令人兴奋。 (有关可用传感器的简短讨论,请参见下文。)
android.hardware.SensorListener 由类实现的接口,该类希望在传感器值实时更改时接收它们的更新。 应用程序实现此接口以监视硬件中可用的一个或多个传感器。 例如,本文中的代码包含一个实现该接口的类,以监视设备和内置加速度计的方向。
android.media.MediaRecorder 用于记录媒体样本的类,可用于记录特定位置(例如婴儿保育室)内的音频活动。 还可以在访问控制或安全应用程序中分析音频剪辑以用于识别。 例如,用您的声音打开分时度假的门可能会有所帮助,而不必与房地产经纪人见面以获取钥匙。
android.FaceDetector 允许基本识别位图中包含的人脸的类。 你的个性不会比你的面Kong多得多。 将其用作设备锁意味着无需再记住密码-手机的生物识别功能。
android.os。* 一个软件包,其中包含几个与操作环境交互的有用类,包括电源管理,文件监视程序,处理程序和消息类。 与许多便携式设备一样,使用Android的手机会消耗大量电量。 在适当的时候使设备保持“清醒”状态以监视感兴趣的事件是一个设计方面,值得我们提前注意。
java.util.Date
java.util.Timer
java.util.TimerTask
在衡量现实世界中的事件时,日期和时间通常很重要。 例如,使用java.util.Date类可以在遇到特定事件或条件时获取时间戳。 您可以使用java.util.Timerjava.util.TimerTask分别执行定期任务或时间点任务。

android.hardware.SensorManager包含多个常量,这些常量代表Android传感器系统的不同方面,包括:

感应器类型
方向,加速度计,光,磁场,接近度,温度等
采样率
最快的游戏,普通用户界面。 当应用程序请求特定的采样率时,它实际上只是对传感器子系统的提示或建议。 无法保证可以使用特定的价格。
准确性
高,低,中,不可靠。

SensorListener接口对于传感器应用程序至关重要。 它包括两种必需的方法:

  • 每当传感器值更改时,都会调用onSensorChanged(int sensor,float values[])方法。 该方法仅针对此应用程序正在监视的传感器(在下面的更多内容)中调用。 该方法的参数包括一个标识已更改传感器的整数,以及一个代表传感器数据本身的浮点值数组。 一些传感器仅提供单个数据值,而其他传感器提供三个浮点值。 方向和加速度传感器分别提供三个数据值。
  • onAccuracyChanged(int sensor,int accuracy)的精度后,将调用onAccuracyChanged(int sensor,int accuracy)方法。 参数是两个整数:一个代表传感器,另一个代表该传感器的新精度值。

要与传感器交互,应用程序必须注册以侦听与一个或多个传感器有关的活动。 使用SensorManager类的registerListener方法进行registerListener 。 本文中的代码示例演示了应用程序如何注册和注销SensorListener

请记住,并非每个配备Android的设备都支持SDK中定义的任何或所有传感器。 如果特定传感器在特定设备上不可用,则您的应用程序应正常降级。

传感器示例

该示例应用程序仅监视方向传感器和加速度传感器的变化(请参见下载以获取源代码)。 收到更改后,传感器值将显示在TextView小部件的屏幕上。 图1显示了正在运行的应用程序。

图1.监视加速度和方向

该应用程序是使用带有Android Developer Tools插件的Eclipse环境创建的。 (有关使用Eclipse开发Android应用程序的更多信息,请参阅参考资料 。)清单1显示了此应用程序的代码。

清单1. IBMEyes.java
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. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// get reference to SensorManagersm = (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);}@Overrideprotected void onResume() {super.onResume();// register this class as a listener for the orientation and accelerometer sensorssm.registerListener(this, SensorManager.SENSOR_ORIENTATION |SensorManager.SENSOR_ACCELEROMETER,SensorManager.SENSOR_DELAY_NORMAL);}@Overrideprotected void onStop() {// unregister listenersm.unregisterListener(this);super.onStop();}
}

该应用程序被编写为基于正常活动的应用程序,因为它只是使用从传感器获取的数据来更新屏幕。 在设备可能正在前台执行其他活动的应用程序中,将应用程序构建为服务会更合适。

活动的onCreate方法获取对SensorManager的引用,在该位置上发生所有与传感器相关的功能。 onCreate方法还建立对六个TextView小部件的引用,您需要使用传感器数据值对其进行更新。

onResume()方法使用对SensorManager的引用从registerListener方法注册传感器更新:

  • 第一个参数是实现SensorListener接口的类的实例。
  • 第二个参数是所需传感器的位掩码。 在这种情况下,应用程序正在从SENSOR_ORIENTATIONSENSOR_ACCELEROMETER请求数据。
  • 第三个参数是系统的提示,用于指示应用程序需要多长时间更新传感器值。

当应用程序(活动)暂停时,您要注销侦听器,以便不再接收传感器更新。 这可以通过SensorManagerunregisterListener方法完成。 唯一的参数是SensorListener的实例。

registerListenerunregisterListener方法调用中,应用程序都使用关键字this 。 请注意, implements类中的定义关键字在那里的声明,这个类实现了SensorListener接口。 这就是为什么将其传递给registerListenerunregisterListener

SensorListener必须实现onSensorChangeonAccuracyChanged这两个方法。 示例应用程序实际上并不关心传感器的精度,而是关心传感器的当前X,Y和Z值。 onAccuracyChanged方法本质上什么也不做。 它只是在每次调用时添加一个日志条目。

似乎onSensorChanged方法被不断调用,因为加速度计和方向传感器正在快速发送数据。 查看第一个参数,以确定哪个传感器正在发送数据。 识别发送传感器后,将使用包含在浮点值数组中的数据更新适当的UI元素,该值作为方法的第二个参数传递。 尽管该示例仅显示这些值,但在更复杂的应用程序中,将对这些值进行分析,并与先前的值进行比较,或者通过某种模式识别算法来确定用户(或外部环境)在做什么。

现在,您已经检查了传感器子系统,下一节将回顾一个代码示例,该示例在Android手机上记录一些音频。 该示例在DEV1开发设备上运行。

使用MediaRecorder

android.media包包含与媒体子系统进行交互的类。 android.media.MediaRecorder类用于获取媒体样本,包括音频和视频。 MediaRecorder作为状态机运行。 您需要设置各种参数,例如源设备和格式。 设置后,录制可能会开始任意时间,直到随后停止。

清单2包含用于在Android设备上录制音频的代码。 所显示的代码不包含应用程序的UI元素(有关完整的源代码,请参见下载 )。

清单2.录制音频片段
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平台拥有多种用于监控环境的传感器选项。 通过一系列输入或刺激选项,再加上强大的计算和联网功能,Android成为构建真实系统的理想平台。 图2显示了输入,应用程序逻辑以及通知方法或输出之间的关系的简化视图。

图2.以Android为中心的传感器系统的框图

这种架构是灵活的。 可以在本地Android设备和服务器端资源之间分配应用程序逻辑,后者可以利用更大的数据库和更高的计算能力。 例如,记录在本地Android装置可以是音频轨道POST编到其中数据被针对的语音模式的数据库相比较的Web服务器。 显然,这只是在摸索可能性的表面。 希望您有动力更深入地将Android引入手机以外的平台。

摘要

在本文中,您对Android传感器进行了介绍。 样例应用程序测量了方向和加速度,并使用MediaRecorder类与记录功能进行了MediaRecorder 。 Android是用于构建实际系统的灵活,有吸引力的平台。 Android空间正在Swift成熟,并且正在走向成熟。 请务必注意此平台。


翻译自: https://www.ibm.com/developerworks/opensource/library/os-android-sensor/index.html

android传感器

android传感器_充分利用Android的传感器相关推荐

  1. android 调色板_引入Android常用调色板

    android 调色板 This article covers basic implementation of common palettes giving basic idea of android ...

  2. arduino 土壤温湿度传感器_智慧农业温室大棚环境监测传感器

    传感器是智慧农业温室大棚体系检测环节的重要组成部分,用于将温室环境因子等非电物理量转变为操控体系辨认的电信号,智慧农业温室大棚体系管理人员判别和处理问是环境监测状况主要依赖的传感器的主要技术指标有 : ...

  3. android爬虫_进行Android Web爬虫改造

    android爬虫 In this tutorial, we'll be implementing Web Scraping in our Android Application. We will b ...

  4. java写一个android程序_【Android开发笔记】3.编写第一个Android程序

    前言 上一节我们通过一个Demo熟悉了Eclipse的基本使用.如何在模拟器和手机中运行以及如何打包成APK,但没具体编写代码,相信很多同学已经按耐不住了吧,这一节我们会动手编写代码来熟悉Androi ...

  5. java android五子棋_基于android实现五子棋开发

    基于Android的五子棋的开发,供大家参考,具体内容如下 需求分析 1 棋盘和棋子绘制 2 按照五子棋的规则制定游戏胜负规则 3 鼠标响应 在对战中 需要通过鼠标点击下棋 进行游戏的基本操作 4 游 ...

  6. win7 下载android源代码_适用于Android的30种最佳免费黑客应用程序和工具

    在本文中,我们将列出前30个Android黑客工具,以帮助完成网络和渗透测试任务. 适用于Android的30种最佳免费黑客应用程序和工具 NMap for Andr oid(NetworkMappe ...

  7. arduino 土壤温湿度传感器_如何将土壤湿度传感器与Arduino接口

    简介 如果您有家庭花园或者是带草皮的后院,那么你可能知道我们需要花多少时间浇灌植物和草皮. 花园洒水器是浇水的常用选择之一.草坪和植物,嗯,唯一的选择,最好的选择是手动浇水. 但是如果你打算制造一个自 ...

  8. android 音频合成_【Android工具】用手机测量噪声的工具软件,噪声仪分贝计,量化噪声声音工具...

    今天分享一个通过手机麦克风测量环境噪声的工具--声级计(噪声仪). 本来是要分享另一款的,但下载下来的是xapk的安装包,太麻烦了,功能差不多,大家就先用这款吧,有条件的朋友可以去play自己下载. ...

  9. android 日历_适用于Android的十大最佳日历应用

    android 日历 Looking for the best calendar apps for Android? You're in the right place! Let's get righ ...

最新文章

  1. Selenium 2.0的由来及设计架构(三)
  2. linux ssh登录失败
  3. cocos2d-x之读取json文件
  4. c++ ifstream 文件不结束_C++核心编程 第十二节 文件操作
  5. node-OSDomainNetPath
  6. 标注工具_语料标注工具(3)
  7. vc++ mfc 非客户区 描绘线_决战客户端技术
  8. Windows Phone UI控件
  9. 创新实训个人记录:approximation factor, maximum matchingvertex cover
  10. 2017c语言预测,2017计算机二级C语言上机最终预测题
  11. 新萝卜家园windows11 64位官网正版系统v2021.07
  12. HTML+CSS+JS实现 ❤️乐队成员图片展示ui特效❤️
  13. sparkstreaming监听hdfs目录如何终止_HDFS—HA高可用详解
  14. 区块链的一些名词解释
  15. 上有天最高,自然较为小
  16. HDOJ--2112--HDU Today
  17. mysql sumif优化,sumif函数的使用方法
  18. C# Wke例子 -- WebUI登录窗口
  19. RSA算法和SM2算法对比
  20. teeth mirror牙小护牙膏让你唇红齿白,亮白笑容不是梦

热门文章

  1. svga插件_如何利用AE导出SVGA(svga)JSON(json)动画的工作分享
  2. Java、检查SSN
  3. 那些迷茫的程序员你们需要过来看看!!!!
  4. 一个计算机高手的成长(转载)
  5. 关于ubuntu使用pip3安装软件时报ImportError:cannot inport name 'sysconfig'错误的解决方法
  6. C/C++中*和的用法
  7. 记录一下个人网站开发路程。
  8. 未明学院:Numpy核心要点有哪些?3张思维导图帮你梳理
  9. 美团服务器不稳定号码保护,美团外卖饿了么开启“号码保护”功能,保护个人隐私...
  10. 45个有用的JavaScript技巧,值得你学习