Android-关于传感器你需要知道的

最近在搞一个自己的App,突发一个想法,给App加一个摇一摇随机查看图片的功能,这样可以使得用户在使用App的时候有更多的乐趣。实现摇一摇肯定少不了传感器,在使用之余,索性总结一下在Android中关于传感器的使用。

本文目录:
1.什么是传感器
2.常用传感器介绍与用法
3.实现图片摇一摇

1.什么是传感器

维基百科是这样定义的:传感器是一种物理装置或生物器官,能够探测、感受外界的信号、物理条件(如光、热、湿度)或化学组成(如烟雾),并将探知的信息传递给其他装置或器官。

在Android中传感器可以展示当前手机状态的应用,包括硬件信息、当前位置、加速计、陀螺仪、光感、磁场、定向、电池窗台,声压,同时还可以进行多点触控的测试。只要你的想象力足够丰富,完全可以利用这些信息做出一些很新奇得应用。

2.常用传感器介绍与用法

Android平台支持三个大类的传感器

  • Motion sensors(运动传感器)
    这些传感器测量加速力,并沿三个轴的旋转力。此类别包括加速度计,重力感应器, 陀螺仪和旋转矢量传感器。
  • Environmental sensors (环境传感器)
    这些传感器测量各种环境参数,例如环境空气温度和压力,照明和湿度。此类别包括气压计,光度计,和温度计。
  • Position sensors (位置传感器)
    这些传感器测量设备的物理位置。这个类别包括方向传感器和磁力计。

好。下面来看看Android中怎么去使用传感器。

第一步:得到SensorManager

SensorManager mSensorManager = (SensorManager) mContext
                .getSystemService(Context.SENSOR_SERVICE);

第二步:注册传感器

 Sensor sensor = mSensorManager
                .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        if (null != sensor)
            mSensorManager.registerListener(this, sensor,
                    SensorManager.SENSOR_DELAY_NORMAL);

嗯。然后就可以监听传感器数据的变化了。

我相信第一步大家都能看懂,这里主要说一下第二步。

registerListener这个方法有三个参数。

  • 第一个参数是传感器数据变化的监听器
    我们需要去实现SensorEventListener接口,他里面有两个回调方法
 @Override
    public void onSensorChanged(SensorEvent event) {
     //当传感器的数值发生变化时调用
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
     //传感器的精度发生变化时调用
    }
  • 第二个参数是我们需要监听的传感器
    我们得到传感器用的是下面这种方法:
 Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

TYPE_ACCELEROMETER代表的就是加速度传感器。Android定义了很多的常量来代表支持的传感器,我们来看看Android平台支持的传感器类型。

  • 加速度传感器:TYPE_ACCELEROMETER
    以m/s2测量它设备所有三个物理轴线方向(x,y,和z)加速度。
  • 周围温度传感器:TYPE_AMBIENT_TEMPERATURE
    检测周围空气温度。
  • 重力传感器:TYPE_GRAVITY
    测量重力
  • 陀螺仪传感器:TYPE_GYROSCOPE
    以rad/s测量设备三个物理轴线方向(x,y,和z)。旋转速度。
  • 光照传感器:TYPE_LIGHT
    以lx测量周围的光线级别。
  • 线性加速度传感器:TYPE_LINEAR_ACCELERATION
    检测沿着一个轴向的加速度。
  • 磁力传感器:TYPE_MAGNETIC_FIELD
    测量周围的三个物理轴线方向的磁场。
  • 方向传感器: TYPE_ORIENTATION
    测量设备所有三个物理轴线方向(x,y和x)的旋转角度。
  • 压力传感器:TYPE_PRESSURE
    测量周围空气气压
  • 接近传感器:TYPE_PROXIMITY
    检测物体与手机的距离
  • 相对湿度传感器:TYPE_RELATIVE_HUMIDITY
    检测周围空气相对湿度
  • 旋转矢量传感器:TYPE_ROTATION_VECTOR
    用于检测运动和检测旋转。
  • 温度传感器: TYPE_TEMPERATURE
    检测设备的温度

下面再来看看传感器的平台的可用性

来源于官网

注意到图中Yes右上角有个上标:1这个类型的传感器在Android1.5(API Level 3)被添加,但是直到Android2.3(API Level 9)也不可用。 2这个传感器是可用的,但是它被弃用。

  • 第三个参数是传感器数据更新数据的速度
    有以下四个值可选,他们的速度是递增的
  • SENSOR_DELAY_UI
  • SENSOR_DELAY_NORMAL
  • SENSOR_DELAY_GAME
  • SENSOR_DELAY_FASTEST

传感器的基本使用和介绍截差不多就这些,下面来看看,怎么去实现一个图片摇一摇的功能。

3.实现图片摇一摇

要实现摇一摇,主要就是去监听手机加速度的变化,当达到一个值的时候就出发摇一摇这个事件。

说到这,你肯定就知道我们要用的就是加速度传感器去实现这个功能。

先来看看效果图:

废话不多说了,下面直接上代码,经过前面的知识储备,我相信你肯定能看懂的

/**
 * Created by _SOLID
 * Date:2016/6/3
 * Time:9:55
 */
public class ShakePictureUtils implements SensorEventListener {

    // 两次检测的时间间隔
    private static final int UPTATE_INTERVAL_TIME = 100;
    // 加速度变化阈值,当摇晃速度达到这值后产生作用
    private static final int SPEED_THRESHOLD = 2000;

    private Context mContext;
    private SensorManager mSensorManager = null;
    private Vibrator mVibrator = null;
    private PictureDialog mPictureDialog = null;


    public ShakePictureUtils(Context context) {
        mContext = context;
        mSensorManager = (SensorManager) mContext
                .getSystemService(Context.SENSOR_SERVICE);
        mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
        mPictureDialog = new PictureDialog(mContext, R.style.PictureDialog);
        mPictureDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialog) {
                registerSensor();
            }
        });
    }


    private long lastUpdateTime;
    private float lastX;
    private float lastY;
    private float lastZ;

    @Override
    public void onSensorChanged(SensorEvent event) {
        long currentUpdateTime = System.currentTimeMillis();

        long timeInterval = currentUpdateTime - lastUpdateTime;

        if (timeInterval < UPTATE_INTERVAL_TIME) {
            return;
        }

        lastUpdateTime = currentUpdateTime;
        float[] values = event.values;

        // 获得x,y,z加速度
        float x = values[0];
        float y = values[1];
        float z = values[2];

        // 获得x,y,z加速度的变化值
        float deltaX = x - lastX;
        float deltaY = y - lastY;
        float deltaZ = z - lastZ;

        // 将现在的坐标变成last坐标
        lastX = x;
        lastY = y;
        lastZ = z;


        Logger.i("values[0] = " + values[0]);
        Logger.i("values[1] = " + values[1]);
        Logger.i("values[2] = " + values[2]);

        double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ
                * deltaZ)
                / timeInterval * 10000;
        Logger.i("speed:" + speed);
        if (speed > SPEED_THRESHOLD) {
            //在这里可以提供一个回调
            mVibrator.vibrate(300);
            requestPicture();
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    public void registerSensor() {
        Sensor sensor = mSensorManager
                .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        if (null != sensor)
            mSensorManager.registerListener(this, sensor,
                    SensorManager.SENSOR_DELAY_NORMAL);
    }

    public void unRegisterSensor() {

        lastX = 0;
        lastY = 0;
        lastZ = 0;
        mSensorManager.unregisterListener(this);
    }


    private void requestPicture() {
        HttpClientManager.getData(Apis.Urls.RandomPicture, new JsonHttpCallBack<RandomPictureBean>() {
            @Override
            public void onStart() {
                unRegisterSensor();
                ToastUtils.getInstance().showToast("图片获取中...");
            }

            @Override
            public void onSuccess(RandomPictureBean result) {
                mPictureDialog.setPicture(result.getP_ori());
            }

            @Override
            public void onError(Exception e) {
                registerSensor();
            }
        });
    }
}


我是讲=将摇一摇这个功能做了一下封装,方便以后的使用。代码的实现思想就是去判断三个坐标轴加速度的变化值,当其达到一个阈值的时候则触发摇一摇。
最后来看看在Activity中怎么去使用

  1. 在onCreate方法中去初始化摇一摇
ShakePictureUtils mShakePictureUtils = new ShakePictureUtils(this);
  1. 在onResume方法中去注册
    @Override
    protected void onResume() {
        super.onResume();
        mShakePictureUtils.registerSensor();
    }
  1. 在onPause方法中去解注册
    @Override
    protected void onPause() {
        super.onPause();
        mShakePictureUtils.unRegisterSensor();
    }

源码地址:ShakePictureUtils

也请大家也关注下我的一个开源项目GanHuoIO。这是基于gank.io提供的api写的一个Android客户端,谢谢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,534评论 25 707
  • Android传感器定义 Android 传感器相关术语微机电传感器(MEMS)MEMS 通常制作在规格很小的硅芯...
    Jannonx阅读 4,088评论 0 1
  • 传感器 传感器Sensor是一种检测装置,能感受到被测量的信息,并能将感受到的信息,按一定规律变换成为电信号或其他...
    Reathin阅读 6,068评论 0 5
  • 在我们这个层次,如果稍往外探究,我们总是氤氲在功利的人文文化氛围中。以前我总以为是学校教育的责任,但追根溯源或来自...
    江苏刘志祥阅读 286评论 0 0
  • 平台有多重要?开始简书写作之前,我只是从战隼老师那里看一些时间管理和知识管理的文章,不明觉厉的感觉。读书呢,就是上...
    楷楷妈频道阅读 1,505评论 6 11