前言

  Android提供了对设备传感器的支持,只要Android设备的硬件提供了这些传感器,Android应用可以通过传感器来获取设备的外界条件,包括手机的运行状态、当前摆放的方向等。Android系统还提供了驱动程序去管理这些传感器硬件,可以通过监听器的方式监听传感器硬件感知到的外部环境的变化。本篇博客主要讲解如何简单的使用Android下的传感器,最后将以一个简单的Demo演示。

开发传感器应用步骤

  开发一个对于传感器支持的应用十分简单,开发人员只要在传感器管理器SensorManager中为所要监听的传感器指定一个监听器即可,当外部环境发生变化的时候,Android系统会通过传感器获取外部环境的数据,然后将数据传递给监听器的监听回调方法。具体步骤如下:

  1. 获取传感器服务
  2. 从传感器服务中获取到指定类型的传感器
  3. 使用传感器服务添加传感器的监听器
  4. 在使用完之后,注销传感器的监听器

获取传感器服务

  Android中内置了很多系统级的服务,用于给开发人员使用,而传感器也是通过传感器服务,SensorManager来管理的。而在Android组件中获取系统服务,使用方法Context.getSystemService(String)即可,它的参数均以static final的方式定义在Context中,而获取SensorManager需要传入Context.SENSOR_SERVICE。

         manager=(SensorManager) getSystemService(SENSOR_SERVICE);

从传感器服务中获取到指定类型的传感器

  传感器服务管理设备上所有的传感器,所以需要指定待监听的传感器。获取待监听的传感器,需要使用SensorManager.getDefaultSensor()方法,它的完整签名如下:

    Sensor getDefaultSensor(int type)

  Android中的传感器需要Sensor支持,getDefaultSensor()方法通过指定的type参数获取到相对应的传感器。type参数被以static final的方式定义在Sensor内部,方便开发人员可以直接使用。下面介绍几个常用传感器的type:

  • Sensor.TYPE_ORIENTATION:方向传感器。
  • Sensor.TYPE_ACCELEROMETER:重力传感器。
  • Sensor.TYPE_LIGHT:光线传感器。
  • Sensor.TYPE_MAGNETIC_FIELD:磁场传感器。

使用传感器服务添加传感器的监听器

  获得SensorManager和Sensor对象之后,就可以为其Sensor注册监听器了。为传感器注册监听器,使用SensorManager.registerListener()方法即可,它存在多个重载方法,但是有些方法已经过时了,下面提供一个常用的方法的签名:

    boolean registerListener(SensorEventListener listener,Sensor sensor,int rateUs)

  上面方法参数的意义:listener:传感器的监听器、sensor:待监听的传感器、rateUs:传感器的采样率。

  从registerListener()方法可以看出,它需要传递一个SensorEventListener对象,它就是传感器的监听器,其中包含两个方法,需要开发人员去实现它:

  • void onAccuracyChanged(Sensor sensor,int accuracy):当传感器精度发生变化时回调。
  • void onSensorChanged(SensorEvent event):当传感器感应的值发生变化时回调。

  对于上面两个方法,传感器的精度一般是不会发生改变的,所以我们一般主要的代码量在onSensorChanged()中。

  registerListener()方法还有一个rateUs的参数,它表示监听传感器改变的采样率,就是从传感器获取值的频率。它被定义以static final的形式定义在SensorManager中,方便我们直接使用,它定义了如下几个选项:

  • SensorManager.SENSOR_DELAY_FASTEST:最快,延迟最小。
  • SensorManager.SENSOR_DELAY_GAME:适合游戏的频率。
  • SensorManager.SENSOR_DELAY_NORMAL:正常频率。
  • SensorManager.SENSOR_DELAY_UI:适合普通用户界面UI变化的频率。

  Android为我们提供了这几个采样率的参数,方便我们使用。但对于选择那种采样率而言,并不是越快越好,要参照实际开发的应用的情况来说,采样率越大,将越耗费资源,包括电量、CPU等,所以要根据实际情况选择,毕竟再强大的应用,如果造成设备续航能力的降低,也是会被用户所不喜的。

在使用完之后,注销传感器的监听器

  当使用完传感器之后,需要为其注销监听器,因为传感器的监听器并不会因为应用的结束而自行释放资源,需要开发人员在适当的时候主动注销。注销传感器监听器使用SensorManager.unregisterListener()方法即可,和监听器的注册方法一样,它也具有多个重载的方法,但是有一些已经被弃用了,下面介绍一个常用的完整签名:

    void unregisterListener(SensorEventListener listener)

指南针Demo

  上面已经讲解了在应用中使用传感器的步骤以及具体内容,下面通过一个简单的Demo来演示一下如何使用传感器。在Demo中监听方向传感器,使其角度的变化改变来操作方向,模拟一个指南针的效果。

  重写监听器的onSensorChanged()方法,其中event获取当当前监听事件的参数,可以使用values[0]获取到当前的方向传感器感应到的角度。参照官方文档,可以看出,它代表一个360°的角度,规则是: 0=North, 90=East, 180=South, 270=West。

  下面直接贴代码了,注释比较全,就不再赘述了,会用到补间动画的内容,对补间动画不了解的朋友,可以看看另外一篇博客:Android--Tween补间动画。还有一点需要注意的是就是传感器的Demo需要在真机上测试,因为模拟器上不存在传感器硬件。

 package com.example.sensormanagerdemo;

 import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.app.Activity; public class MainActivity extends Activity {
private ImageView iv_compass;
private SensorManager manager;
private float startDegree = 0f; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); iv_compass = (ImageView) findViewById(R.id.iv_compass);
// 获得传感器管理器
manager = (SensorManager) getSystemService(SENSOR_SERVICE); } @Override
protected void onResume() {
super.onResume();
// 为方向传感器注册监听器
manager.registerListener(listener,
manager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_UI); } private SensorEventListener listener = new SensorEventListener() { @Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
// 获取当前传感器获取到的角度
float degree = -event.values[0];
// 通过补间动画旋转角度 从上次的角度旋转
RotateAnimation ra = new RotateAnimation(startDegree, degree,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
ra.setDuration(200);
iv_compass.startAnimation(ra);
// 记录当前旋转后的角度
startDegree = degree;
}
} @Override
public void onAccuracyChanged(Sensor sensor, int accuracy) { }
}; @Override
protected void onStop() {
// 为传感器注销监听器
manager.unregisterListener(listener);
super.onStop();
}
}

  效果展示:

  源码下载

总结

  本篇博客讲解了Android下如何使用传感器,只是简单的介绍了一下,对于传感器获取到的数值,都在event.values数组中,但是不同传感器获取到的值不同,具体情况具体分析,这里就不再深入讨论了。

Android--Sensor传感器的更多相关文章

  1. Android Sensor——传感器

    Android SDK 支持的传感器类型,在Sensor类中的定义: 01.TYPE_ACCELEROMETER  : 加速传感器(硬件) 02.TYPE_AMBIENT_TEMPERATURE : ...

  2. android sensor传感器系统架构初探

    http://blog.csdn.net/qianjin0703/article/details/5942579 http://blog.chinaunix.net/uid-28621021-id-3 ...

  3. 我的Android进阶之旅------>Android利用Sensor(传感器)实现水平仪功能的小例

    这里介绍的水平仪,指的是比较传统的气泡水平仪,在一个透明圆盘内充满液体,液体中留有一个气泡,当一端翘起时,该气泡就会浮向翘起的一端.    利用方向传感器返回的第一个参数,实现了一个指南针小应用. 我 ...

  4. Android实现传感器应用及位置服务

    Android实现传感器应用及位置服务 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 代码实现 这里需用获取加速度传感器和地磁传感器,手机获取旋转的方 ...

  5. Android加速度传感器

    Android加速度传感器 效果图 手机平放桌面的两张截屏,数据一直在刷新 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q487 ...

  6. android sensor架构

    Android Sensor 架构深入剖析 作者:倪键树,华清远见嵌入式学院讲师. 1.Android sensor架构 Android4.0系统内置对传感器的支持达13种,它们分别是:加速度传感器 ...

  7. Android Developers:传感器概述

    大 多数Android设备有内置的传感器,来测量运动,方向和各种环境条件.这些传感器能提供高精度和准确度的原始数据,如果你想监控设备三维运动或者位 置,或者你想监控设备周围的环境变化,是非常有用的.例 ...

  8. Android常用传感器用法一览(3)

    Android 开发包标准有8个传感器: Sensor.TYPE_ACCELEROMETER o 加速度计 (X, Y, Z) m/s2 Sensor.TYPE_GYROSCOPE o 陀螺仪 (X, ...

  9. Android sensor 系统框架 (一)

    这几天深入学习了Android sensor框架,以此博客记录和分享分析过程,其中难免会有错误的地方,欢迎指出! 这里主要分析KERNEL->HAL->JNI这3层的流程.主要从以下几方面 ...

  10. Android Sensor 架构深入剖析【转】

    本文转载自: 1.Android sensor架构 Android4.0系统内置对传感器的支持达13种,它们分别是:加速度传感器 (accelerometer).磁力传感器(magnetic fiel ...

随机推荐

  1. C# 常见面试题1

    1.WinForm遍历控件 foreach (System.Windows.Forms.Control control in this.Controls) { if (control is Syste ...

  2. centos 安装flash插件

    方法一: 1.选择合适的yum源http://get.adobe.com/cn/flashplayer/进入此网址选择 “YUM,适用于Linux(YUM)”,下载adobe源http://101.9 ...

  3. HDU 5024 Wang Xifeng's Little Plot (DP)

    题意:给定一个n*m的矩阵,#表示不能走,.表示能走,让你求出最长的一条路,并且最多拐弯一次且为90度. 析:DP,dp[i][j][k][d] 表示当前在(i, j)位置,第 k 个方向,转了 d ...

  4. linux下使用SSL代理(SSLedge)

    refer to: https://eurekavpt.com/page/ssledge-on-linux 启动非常简单./ssledge-term-x64 -f config -D 其中的confi ...

  5. 使用PPT制作交叉密文图

    曾几何时,一张图火遍大江南北,互相流传. 其中的奥秘早已破解出来,但是仍乐趣无穷. 来回顾这样一张图吧! 最近,在朋友圈中,这样的一种图又流行起来,被改成不同的版本. 可是这样一种图片到底是怎样做出来 ...

  6. [原] XAF 如何将数据库中Byte array图片显示出来

    问题比较简单,直接上代码. private Image _Cover; [Size(SizeAttribute.Unlimited), ValueConverter(typeof(ImageValue ...

  7. UISwitch(开关控件)、UISegmentedControl(分段控件)

    一.UISwitch 1.初始化 UISwitch *s1 = [[UISwitch alloc]initWithFrame:CGRectMake(50, 170, 100, 200)];   2.设 ...

  8. 基于OWIN WebAPI 使用OAuth授权服务【客户端验证授权(Resource Owner Password Credentials Grant)】

    适用范围 前面介绍了Client Credentials Grant ,只适合客户端的模式来使用,不涉及用户相关.而Resource Owner Password Credentials Grant模 ...

  9. 分享我用Qt开发的应用程序【一】,附绿色版下载,以后会慢慢公布源码

    写在前面: 1.第一版的代码还有些烂,等功能开发齐全了,做一次重构,再慢慢分享代码 2.邮箱功能.自动升级功能还没有做,笔记功能和备忘功能是好用的,大家如果不嫌弃,可以先用起来 3.笔记功能目前还不能 ...

  10. Nim教程【五】

    妈蛋,花了两天时间才搞定博客园的API, 比预期的时间整整多了1天, 不管怎么说,总算把博客园的客户端搞定了 这篇文章就是用博客园的客户端发布的, 先贴张图,给大家看看, 后面我会和博客园的领导商量一 ...