【Android】Android传感器
1.加速度传感器
2.磁场传感器
3.方向传感器
4.陀螺仪传感器
5.重力传感器
6.线性加速度传感器
7.温度传感器
8.光线传感器
9.距离传感器
10.压力传感器
11.计步传感器
首先先查看测试的安卓机拥有的传感器
这里先初始化一个SensorManager的对象,然后把所有支持的sensor类型打印出来看看。
SensorManager mSensorManager;
List<Sensor> sensorList;
// 实例化传感器管理者
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 得到设置支持的所有传感器的List
sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
List<String> sensorNameList = new ArrayList<String>();
for (Sensor sensor : sensorList) {
Log.d(TAG, "onResume: "+sensor.getName());
}
我使用的是小米4,下面是该手机的sensor信息,接下来会一个个分析
1.加速度传感器
在这这之前先了解一下手机传感器世界的三维坐标

首先先创建3个textView来显示三个方向上的加速度啦,这个就跳过
先给Activity实现SensorEventListener接口,后面要不断要监听来刷新数据
public class MainActivity extends AppCompatActivity implements SensorEventListener
然后创建SensorManager对象,如果前面设置过就不用设置,然后为它注册加速度传感器监听器,采样频率可以自己设置,一般越高越精准但是越耗电
private SensorManager sm; //创建一个SensorManager来获取系统的传感器服务
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
/*
* 最常用的一个方法 注册事件
* 参数1 :SensorEventListener监听器
* 参数2 :Sensor 一个服务可能有多个Sensor实现,此处调用getDefaultSensor获取默认的Sensor
* 参数3 :模式 可选数据变化的刷新频率,多少微秒取一次。
* */
//加速度传感器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
接下来我们只要监听这个传感器值的变化,然后更新textView的值就好了
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float X_lateral = sensorEvent.values[0];
float Y_longitudinal = sensorEvent.values[1];
float Z_vertical = sensorEvent.values[2];
mtextViewx.setText(X_lateral + "");
mtextViewy.setText(Y_longitudinal + "");
mtextViewz.setText(Z_vertical + "");
}
}
可以看到放在桌子上的时候x和y轴的加速度几乎为0,我手机不太平,而z轴的加速度接近9.8,换了小米note2测出来就是9.8,米4渣渣。其实这个传感器非常敏感,数值是一直在变化的
在activity变为不可见的时候,传感器依然在工作,这样很耗电,所以我们根据需求可以在onPause方法里面停掉传感器的工作
@Override
public void onPause() {
sm.unregisterListener(this);
super.onPause();
}
2.磁场传感器
和加速度计一样,为sensormanager监听磁场变化即可,吧手机放在电脑旁边时候可以清楚看到数值的变化
// 为磁场传感器注册监听器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL); else if(sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
float X_lateral = sensorEvent.values[0];
float Y_longitudinal = sensorEvent.values[1];
float Z_vertical = sensorEvent.values[2];
mtextView1.setText("x轴的磁场强度\n"+ X_lateral );
mtextView2.setText("y轴的磁场强度\n"+ Y_longitudinal );
mtextView3.setText("z轴的磁场强度\n"+ Z_vertical );
}
3.方向传感器
这个可以用来做指南针之类的,绕z轴转过的角度为0时大概指向正北。这个TYPE_ORIENTATION接口不够精确已经过时了,可以使用旋转矩阵来代替。这里绕z轴转过的角度是value[0],
// 为方向传感器注册监听器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL); else if(sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION){
float X_lateral = sensorEvent.values[0];
float Y_longitudinal = sensorEvent.values[1];
float Z_vertical = sensorEvent.values[2];
mtextView4.setText("绕z轴转过的角度\n"+ X_lateral );
mtextView5.setText("绕x轴转过的角度\n"+ Y_longitudinal );
mtextView6.setText("绕y轴转过的角度\n"+ Z_vertical );
}
4.陀螺仪传感器
// 为陀螺仪传感器注册监听器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL); else if(sensorEvent.sensor.getType() == Sensor.TYPE_GYROSCOPE){
//需要将弧度转为角度
float X = (float)Math.toDegrees(sensorEvent.values[0]);
float Y = (float)Math.toDegrees(sensorEvent.values[1]);
float Z = (float)Math.toDegrees(sensorEvent.values[2]);
mtextView7.setText("绕x轴转过的角速度\n"+ X );
mtextView8.setText("绕y轴转过的角速度\n"+ Y );
mtextView9.setText("绕z轴转过的角速度\n"+ Z );
5.重力传感器
就是把重力加速度分解到xyz三个方向上
// 为重力传感器注册监听器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_GRAVITY), SensorManager.SENSOR_DELAY_NORMAL); else if(sensorEvent.sensor.getType() == Sensor.TYPE_GRAVITY){
float X = sensorEvent.values[0];
float Y = sensorEvent.values[1];
float Z = sensorEvent.values[2];
mtextViewgx.setText("x方向的重力加速度\n"+ X );
mtextViewgy.setText("Y方向的重力加速度\n"+ Y );
mtextViewgz.setText("Z方向的重力加速度\n"+ Z );
6.线性加速度传感器
就是去掉重力加速度后各个方向的加速度
// 为线性加速度传感器注册监听器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION), SensorManager.SENSOR_DELAY_NORMAL); else if(sensorEvent.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION){
float X = sensorEvent.values[0];
float Y = sensorEvent.values[1];
float Z = sensorEvent.values[2];
mtextViewlx.setText("x方向的线性加速度\n"+ X );
mtextViewly.setText("Y方向的线性加速度\n"+ Y );
mtextViewlz.setText("Z方向的线性加速度\n"+ Z );
}
7.温度传感器
这里的TYPE_TEMPERATURE已经过时,测出来的是cpu的温度,所以测出来的数值有点大,如果测环境温度的话应该使用
TYPE_AMBIENT_TEMPERATURE。不过大部分手机都没有这个传感器,小米note2居然连前面那个都没有
// 为温度传感器注册监听器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_TEMPERATURE), SensorManager.SENSOR_DELAY_NORMAL);
Sensor tempertureSensor = sm.getDefaultSensor(Sensor.TYPE_PRESSURE); else if(sensorEvent.sensor.getType() == Sensor.TYPE_TEMPERATURE){
float X = sensorEvent.values[0];
mtextView10.setText("温度为"+ X );
}
8.光传感器
// 为光传感器注册监听器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_LIGHT), SensorManager.SENSOR_DELAY_NORMAL); else if(sensorEvent.sensor.getType() == Sensor.TYPE_LIGHT){
float X = sensorEvent.values[0];
mtextView11.setText("光强度为为"+ X );
}
9.距离传感器
可以控制手机打电话时候息屏,如果使用光线传感器的话在黑夜中打电话就自动息屏了
// 为距离传感器注册监听器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_PROXIMITY), SensorManager.SENSOR_DELAY_NORMAL); else if(sensorEvent.sensor.getType() == Sensor.TYPE_PROXIMITY){
float X = sensorEvent.values[0];
mtextView12.setText("距离为"+ X );
}
10.压力传感器
// 为压力传感器注册监听器
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_PRESSURE), SensorManager.SENSOR_DELAY_NORMAL); else if(sensorEvent.sensor.getType() == Sensor.TYPE_PRESSURE){
float X = sensorEvent.values[0];
mtextView13.setText("压强为"+ X );
}
11.计步传感器
有两个接口,一个Counter统计的是总步数,而DETECTOR为该计步是否有效,有效的话就置1
// 计步统计
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_STEP_COUNTER), SensorManager.SENSOR_DELAY_NORMAL);
// 单次计步
sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR), SensorManager.SENSOR_DELAY_NORMAL); else if(sensorEvent.sensor.getType() == Sensor.TYPE_STEP_COUNTER){
float X = sensorEvent.values[0];
mtextView14.setText("COUNTER:"+ X );
} else if(sensorEvent.sensor.getType() == Sensor.TYPE_STEP_DETECTOR){
float X = sensorEvent.values[0];
mtextView15.setText("DECTOR:"+ X );
}
原文链接:安卓各种传感器的使用
【Android】Android传感器的更多相关文章
- 修复 XE8 for Android 方向传感器 headingX,Y,Z 不会动的问题
问题:XE8 for Android 方向传感器无法正常运作(在 XE7 是正常的) 测试:官方示例 Samples\Object Pascal\Mobile Snippets\Orientation ...
- Android实现传感器应用及位置服务
Android实现传感器应用及位置服务 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 代码实现 这里需用获取加速度传感器和地磁传感器,手机获取旋转的方 ...
- Android加速度传感器
Android加速度传感器 效果图 手机平放桌面的两张截屏,数据一直在刷新 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q487 ...
- Android Developers:传感器概述
大 多数Android设备有内置的传感器,来测量运动,方向和各种环境条件.这些传感器能提供高精度和准确度的原始数据,如果你想监控设备三维运动或者位 置,或者你想监控设备周围的环境变化,是非常有用的.例 ...
- Android常用传感器用法一览(3)
Android 开发包标准有8个传感器: Sensor.TYPE_ACCELEROMETER o 加速度计 (X, Y, Z) m/s2 Sensor.TYPE_GYROSCOPE o 陀螺仪 (X, ...
- Stack Overflow 排错翻译 - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder
Stack Overflow 排错翻译 - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder 转自:ht ...
- [Android]Android端ORM框架——RapidORM(v2.1)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6020412.html [Android]Android端ORM ...
- [Android]Android端ORM框架——RapidORM(v2.0)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM ...
- Android android:gravity属性介绍及效果图
转自: http://blog.csdn.net/aminfo/article/details/7784229 Android:gravity的属性官方说明如下: public static fina ...
- [转][Android][Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法
转自:http://blog.csdn.net/qiujuer/article/details/39754517?utm_source=tuicool [Android][Android Studi ...
随机推荐
- mongosync同步1,oplog同步会读取其他集合同步
使用mongosync同步数据 注意: 我下面的这个mongodb版本较低(3.2.16), 还可以用这个工具来同步数据.工具不支持更高版本的mongodb了. 使用方法: https://g ...
- 小程序block标签配合if和else
<block wx:if="{{hasMore}}"> <view class="loading-tip">拼命加载中…</vie ...
- STM32的HAL库中的DMA_FLAG_TCIF3_7等几个宏定义的含义
DMA_FLAG_TCIF0_4就是指DMA的通道0和通道4,DMA_FLAG_TCIF1_5就是指DMA的通道1和通道5,DMA_FLAG_TCIF2_6就是指DMA的通道2和通道6,DMA_FLA ...
- MT4编程初级手册
http://www.fxunion.com/college/2015/17554.html
- PHP Excel导入日期单元格处理
PHPExcel导入Excel文件,对Excel中日期单元格处理 /** * 判断字符串是否是日期格式 * @param $date * @param $format * @return bool * ...
- POJ 2446 Chessboard【二分图最大匹配】
<题目链接> 题目大意: 给你一个n*m的棋盘,其中有k个洞,现在有1*2大小的纸片,纸片不能覆盖洞,并且每个格子最多只能被覆盖一次.问你除了洞口之外这个棋盘是否能被纸片填满. 解题分析: ...
- P1292 倒酒
P1292 倒酒这个题有很多模型,这个是一个变形.我令一个解为x两个整数Pa和Pb,分别表示从体积为a ml的酒杯中倒出酒的次数和将酒倒入体积为b ml的酒杯中的次数(酒杯一开始为空).b最后是0,所 ...
- Java中递归和循环的优劣
介绍: 你用你手中的钥匙打开一扇门,结果去发现前方还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇门......但是当你开到一扇门时,发现前方是一堵墙无路可走了,你选择原路返回--这就是递归 ...
- 好用到哭的listary
好用到哭的listary(提醒:everything太占内存了) 官网:http://www.listary.com/ 快捷键 启动方式:alt+s .双击Ctrl Ctrl+g:快速将当前打开目录作 ...
- BZOJ.1016.[JSOI2008]最小生成树计数(Matrix Tree定理 Kruskal)
题目链接 最小生成树有两个性质: 1.在不同的MST中某种权值的边出现的次数是一定的. 2.在不同的MST中,连接完某种权值的边后,形成的连通块的状态是一样的. \(Solution1\) 由这两个性 ...
