随着手机的发展,现在各大手机支持的传感器类型也越来越多,在开发中利用传感器进行某些操作令人们有一种耳目一新的感觉,例如微信中的摇一摇,以及手机音乐播放器中的摇一摇切歌。今天来简单介绍下Android中传感器的使用以及一些常用的传感器。

一、传感器的使用

1.首先我们需要获得传感器管理对象:通过 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

2.为SensorManager对象添加监听事件,通过SensorManage的registerListener方法可以为我们的传感器添加监听事件,该方法有多种重载形式,一般我们必须要提供一个listener对象并实现SensorEventListener接口,然后是传感器的类型(int类型值),或一个传感器Sensor对象(通过getDefaultSensor可以得到一个sensor对象)。

在SensorEventListener接口中有两个重要的方法,

1)public void onAccuracyChanged(Sensor sensor, int degree),当传感器的精准度发生改变时被调用,degree为新的传感器精度。

2)public void onSensorChanged(SensorEvent event),传感器信息改变时执行该方法,其中event对象中的values成员中包含了我们所需要的传感器的重要信息,这是一个float数组值,一般根据传感器类型不同,该值也会不同,下面我会来介绍一下一些常用的传感器类型的values值得含义。一般我们在该方法中根据所获得的传感器信息来处理自己的事情。

3.当我们不需要监听传感器时,通过一个unregisterListener方法来销毁注册。

二、常用传感器类型介绍

在前面我们已经知道SensorEvent中的values是一个获取传感器信息的重要变量,接下来就来介绍一些常用传感器的values含义。

沿手机屏幕横向为x轴,向右为正;沿手机屏幕竖向为y轴,向上为正;垂直手机屏幕方向为z轴,向外为正。

1.Sensor.TYPE_ACCELEROMETER:加速度感应传感器

values[0]:x轴方向的重力加速度。

values[1]:y轴方向的重力加速度。

values[2]:z轴方向的重力加速度。

2.Sensor.TYPE_GYROSCOPE: 陀螺仪传感器

values[0]:沿x轴旋转的角速度。

values[1]:沿y轴旋转的角速度。

values[2]:沿z轴旋转的角速度。

3.Sensor.TYPE_ORIENTATION:方向传感器

旋转向量代表设备的结合的方向角和轴的设备通过一个角θ绕轴旋转< x,y,z >。

values[0]:手机绕着z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。如果手机是水平放置,表示手机的正前方与正北方向的夹角就是该值。

values[1]:手机绕着x轴旋转的角度。取值范围是-180到+180度之间。

values[2]:手机绕着y轴旋转的角度。取值范围是-90到+90度之间。

4.Sensor.TYPE_LIGHT:光线传感器

values[0]:环境光水平勒克斯单位值。

5.Sensor.TYPE_PRESSURE:压力传感器

values[0]:大气压力值,单位帕。

6.Sensor.TYPE_PROXIMITY: 近程感应器

values[0]:以厘米为单位的距离值。

7.Sensor.TYPE_RELATIVE_HUMIDITY:湿度传感器

values[0]: 周围空气相对湿度百分比。

8.Sensor.TYPE_TEMPERATURE: 温度传感器

values[0]: 周围环境温度的摄氏度值。

Android API中共定义了十几种传感器的类型,每一部手机不可能支持所有的传感器类型,当通过getDefaultSensor方法返回值为null时表示该手机不支持这种类型的传感器,当我们为不支持的传感器注册了监听事件,并不会引发异常,只是不能得到任何有效的数据。

三、实践加速度传感器实现摇一摇功能

接下来,我们通过代码来模拟一个摇一摇的功能,主要是通过加速度感应器来实现,当触发事件时,我们调用手机振动器,并一个Toast显示。调用手机震动提示时需要为我们的app添加权限。

1
<uses-permission android:name="android.permission.VIBRATE"></uses-permission>

接下来是我们的代码部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.example.shaketest;
 
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Vibrator;
import android.util.Log;
import android.view.Menu;
import android.widget.Toast;
 
public class MainActivity extends Activity {
 
    private SensorManager mSensorManager;// 传感器管理类
    private Vibrator mVibrator;// 振动器
 
    private static final String TAG = "MainActivity";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);// 获得手机振动器
    }
 
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        if (mSensorManager != null) {
            mSensorManager.unregisterListener(mySensorListener);
        }
    }
 
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
 
        if (mSensorManager != null) {
            // 第一个参数是Listener,第二个参数是所得传感器类型,第三个参数值获取传感器信息的频率
            mSensorManager.registerListener(mySensorListener,
                    mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                    SensorManager.SENSOR_DELAY_NORMAL);
            // SensorManager.SENSOR_DELAY_NORMAL:默认的获得传感器数据的速度。
            // SensorManager.SENSOR_DELAY_GAME:如果利用传感器开发游戏,建议使用该值。
            // SensorManager.SENSOR_DELAY_UI:如果使用传感器更新UI中的数据,建议使用该值。
             
        }
    }
 
    private SensorEventListener mySensorListener = new SensorEventListener() {
 
        @Override
        public void onAccuracyChanged(Sensor sensor, int degree) {
            // TODO Auto-generated method stub
            // 当传感器的精准度发生改变时被调用,int为新的传感器精度
        }
 
        @Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            // 传感器信息改变时执行该方法
            float[] values = event.values;
            // 该变量最多只有3个元素,而且根据传感器的不同,values变量中元素所代表的含义也不同。
            float x = values[0]; // x轴方向的重力加速度
            float y = values[1]; // y轴方向的重力加速度
            float z = values[2]; // z轴方向的重力加速度
            // 设定重力加速度值,当摇晃到达该值时触发震动,并相应自己的事件
            int medumValue = 19;
            if (Math.abs(x) > medumValue) {
                mVibrator.vibrate(500);
                Log.w(TAG, "x_shake");
                Log.w(TAG, "x轴::" + x + ";y轴::" + y + ";z轴::" + z);
                Toast.makeText(MainActivity.this, "Shaking!!!!",
                        Toast.LENGTH_SHORT).show();
            }
            if (Math.abs(y) > medumValue) {
                mVibrator.vibrate(500);
                Log.w(TAG, "y_shake");
                Log.w(TAG, "x轴::" + x + ";y轴::" + y + ";z轴::" + z);
                Toast.makeText(MainActivity.this, "Shaking!!!!",
                        Toast.LENGTH_SHORT).show();
            }
            if (Math.abs(z) > medumValue) {
                mVibrator.vibrate(500);
                Log.w(TAG, "z_shake");
                Log.w(TAG, "x轴::" + x + ";y轴::" + y + ";z轴::" + z);
                Toast.makeText(MainActivity.this, "Shaking!!!!",
                        Toast.LENGTH_SHORT).show();
            }
        }
 
    };
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
}

摘自:http://www.2cto.com/kf/201502/375063.html

(转)Android开发--常用的传感器总结的更多相关文章

  1. Android开发常用工具汇总

    Android开发常用工具汇总,本文章不断更新完善 一.数据库小工具Sqlite Developer  SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的, ...

  2. 转发—Android开发常用的插件及工具

    作者:蓝之风 出处:http://www.cnblogs.com/vaiyanzi/ Android开发常用的插件及工具 1.GitHub,这个不管是做安卓还是其他,只要是开发就必上的网站,也是天朝没 ...

  3. 36个Android开发常用代码片段

    //36个Android开发常用代码片段 //拨打电话 public static void call(Context context, String phoneNumber) { context.s ...

  4. Android开发常用开源框架:图片处理

    https://blog.csdn.net/SGQ_CSDN/article/details/79910709 Android开发常用开源框架:图片处理 框架名称 功能描述 Android Unive ...

  5. Android开发常用工具类

    来源于http://www.open-open.com/lib/view/open1416535785398.html 主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前 ...

  6. Android开发10:传感器器及地图相关应用

    前言 啦啦啦~各位小伙伴们好~经过这一学期的Android知识的学习,我们学到了很多和Android开发相关的知识,这一学期的学习也要告一段落了. 一起进入我们今天的相关内容~这次我们将一起学习使用 ...

  7. 最全Android开发常用工具类

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前包括  HttpUtils.DownloadManagerPro.Safe.ijiami.ShellUtils.Pack ...

  8. Android开发常用网站汇总

    1.eoe Android开发者论坛 目前国内最早的Android开发者社区,人气非常旺聚集了不少Android开发方面的高手,开发中遇到的问题大都能在这里获得解决,网站最大的特色是定期发布<e ...

  9. Android 开发常用工具合集

    在 Android 开发中经常使用到的小功能,用于记录开发的那些事^_^ 1. 获取 release 和 debug 版本的 SHA1 public static String getSHA1(Con ...

随机推荐

  1. some words

    For we meet in an hour of change and challenge,              in a dacade of hope and fear,   in an a ...

  2. quartz(8)--其他

    JOB并发执行 Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞. 设置为非并发 1)Job类加上注 ...

  3. 我的nodejs 快速入门

    每行以封号结尾(可有可无) 变量定义没有类型 都用var 或者直接const log打印:console.log(db); 内置属性这样写法:__filename.__dirname等 functio ...

  4. spring mvc: 页面重定向调整

    我的项目名称是hello, 在src/main/java目录下面建了一个chapter2目录 有三个配置文件: web.xml, chapter2-servlet.xml, applicationCo ...

  5. idea结合git使用(正常项目开发过程中的使用)

    1.如何将本地项目代码提交到公司码云上面 1.项目右键 2. 在远处的remotes里面设置你的url

  6. InnoDB存储引擎的B+树索引算法

    关于B+树数据结构 ①InnoDB存储引擎支持两种常见的索引. 一种是B+树,一种是哈希. B+树中的B代表的意思不是二叉(binary),而是平衡(balance),因为B+树最早是从平衡二叉树演化 ...

  7. Android性能调优实例

    本文主要分享自己在appstore项目中的性能调优点,包括同步改异步.缓存.Layout优化.数据库优化.算法优化.延迟执行等. 目前性能优化专题已完成以下部分: 性能优化总纲——性能问题及性能调优方 ...

  8. redux源码阅读之compose,applyMiddleware

    我的观点是,看别人的源码,不追求一定要能原样造轮子,单纯就是学习知识,对于程序员的提高就足够了.在阅读redux的compose源码之前,我们先学一些前置的知识. redux源码阅读之compose, ...

  9. 《Unity 3D游戏客户端基础框架》概述

    框架概述: 做了那么久的业务开发,也做了一年多的核心战斗开发,最近想着自己倒腾一套游戏框架,当然暂不涉及核心玩法类型和战斗框架,核心战斗的设计要根据具体的游戏类型而定制,这里只是一些通用的基础系统的框 ...

  10. Arcgis for javascript不同的状态下自定义鼠标样式

    俗话说:爱美之心,人皆有之.是的,没错,即使我只是一个做地图的,我也希望自己的地图看起来好看一点.在本文,给大家讲讲在Arcgis for javascript下如何自定义鼠标样式. 首先,说几个状态 ...