气压传感器两年前已经开始被手机制造商运用在其设备上,但貌似没有引起开发者足够的重视。像Galaxy S III 、Galaxy Note 2和小米2手机上都有,不过大家对于气压传感器比较陌生。其实大气压无处不在,我们可以利用它来为我们完成诸如海拔高度测量甚至是空间定位的任务。

先说些题外话,舒缓一下工作学习的疲惫。前些天跟朋友一起去户外活动,登山到半山腰,突然朋友问我,现在海拔大概多少?我脑子灵光一闪,前些天一个在小米工作的朋友在其小米2手机上打开指南针应用对我说现在海拔多少多少,而我现在手头正有一台小米4手机,赶紧拿出来打开指南针应用,结果气压是出来了,海拔计算却需要联网,真是让人扫兴。也正是这一点让我萌生了自己来计算的想法。

既然说做,那就做吧,反正应该不会太难。首先网上查询相关资料,计算自己的海拔高度通常有两种方法,一是通过GPS全球定位系统,二是通过测出大气压,然后根据气压值计算出海拔高度。

使用GPS全球定位系统获取海拔简单是简单,只要获取到Android系统提供LoctionManager服务,将提供者设置为LocationManager.GPS_PROVIDER,在写个GPS状态监听器GpsStatus.Listener,最后在实现一个LocationListener来实时监听位置的变化,在onLocationChanged回调函数中取出location参数,里面就包含了海拔高度值(getAltitude())。

关键代码如下

private LocationManager lm;

lm = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);

if(!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){

Log.i(TAG, "请先开启GPS");

showAlertDialog(context, "开启GPS,定位更准确;取消则使用网络定位,粗略定位");

}

if(!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){

Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);

context.startActivity(intent);

}

lm.addGpsStatusListener(listener);

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locationListener);

其中listener和locationListener分别为StatusListener和LocationListener的实例,使用起来也不难,主要代码框架已经为你生成了,只要查查android SDK的API就会明白的,就不说了。这种方式去测海拔,需要接收GPS信号。如果你在丛林或者洞穴或建筑物内,极有可能是接收不到GPS卫星信号的。这时候,可以考虑使用压力传感器来测海拔高度。

先说说使用压力传感器来测海拔高度的原理,其实非常简单,一些基本原理你必须要明白的:一般来说海拔越高,气压越低,他们之间存在某种关系,下文会讲到的。有不少学者对海拔与气压做了研究,回归了不少海拔与气压的数据,他们的变化关系大概服从下面的表达式。

因为我们要计算海拔(A),所以略作变化,可以知道A的计算公式如下。

其中P为当前的大气压,P0为标准大气压。这样,我们只要获取Android手机内置气压传感器的值,就可以初步估算出海拔高度了。实现起来也不难,关键代码如下。

private SensorManager sensorManager = null;

sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);

mPressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);

if(mPressure == null)

{

mPressureVal.setText("您的手机不支持气压传感器,无法使用本软件功能.");

return;

}

mAccelerate = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

然后在onResume()函数里面注册气压传感器,在onPause()中注销,这样做当然是为了节约用电嘛。

sensorManager.registerListener(pressureListener, mPressure,SensorManager.SENSOR_DELAY_NORMAL);

if(pressureListener!=null){

sensorManager.unregisterListener(pressureListener);

}

还有一点必须获取气压传感器的值嘛,必须要有一个SensorEventListener对象(SensorManager注册语句的pressureListener),代码很简单。

SensorEventListener pressureListener = new SensorEventListener() {

@Override

public void onSensorChanged(SensorEvent event) {

// TODO Auto-generated method stub

float sPV = event.values[0];

mPressureVal.setText(String.valueOf(sPV));

DecimalFormat df = new DecimalFormat("0.00");

df.getRoundingMode();

// 计算海拔

double height = 44330000*(1-(Math.pow((Double.parseDouble(df.format(sPV))/1013.25),

(float)1.0/5255.0)));

mAltitude.setText(df.format(height));

}

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

// TODO Auto-generated method stub

}

};

海拔计算公式的实现自然也不是难事,基本上是翻译一下就出来了。

其实海拔和气压的这种关系比较复杂,受多方面的因素影响,最为显著的是温度的影响。大气压通俗来讲是大气对其他物体的压力,与空气分子的密度和动能相关,所以同一海拔高度,温度越高,气压越高。正是因为这个影响因素,使得气压测海拔有较明显的误差。如果是时隔不久,即温度变化不大,测高度差还是比较准确的,我做过实验,利用气压能较为准确的测出7层楼的高度,哈哈,是不是感觉很灵敏呢?只是影响因素带来的误差还得想办法消除。刚接触Android不久,也没写过什么博客,这个纯属扯扯,没什么技术难度,仅仅是为了总结一下android开发的一些事儿,顺便练练笔而已。

Android平台上使用气压传感器计算海拔高度相关推荐

  1. Freeline - Android平台上的秒级编译方案

    Freeline 技术揭秘 Freeline是什么? Freeline是蚂蚁金服旗下一站式理财平台蚂蚁聚宝团队15年10月在Android平台上的量身定做的一个基于动态替换的编译方案,5月阿里集团内部 ...

  2. 响应式编程之二:RxJava概述:在Android平台上开发详解

    RxJava 到底是什么 RxJava 好在哪 API 介绍和原理简析 1. 概念:扩展的观察者模式 观察者模式 RxJava 的观察者模式 2. 基本实现 1) 创建 Observer 2) 创建 ...

  3. 奥比中光Gemini 3D双目结构光深度相机在Android平台上深度数据噪点非常多的问题

    相机:Gemini 3D双目结构光深度相机 环境:Android7.1 软件:SDK中的java demo下的depthforopenni2 问题: 在Android样例depthforopenni2 ...

  4. Gemini 3D双目结构光深度相机在Android平台上深度数据噪点非常多的问题

    相机:Gemini 3D双目结构光深度相机 环境:Android7.1 软件:SDK中的java demo下的depthforopenni2 问题: 在Android样例depthforopenni2 ...

  5. MVP在Android平台上的应用

    2019独角兽企业重金招聘Python工程师标准>>> MVP在Android平台上的应用 原文链接 : Introduction to Model-View-Presenter o ...

  6. cocos2d js调用java_【cocos2d-js官方文档】二十四、如何在android平台上使用js直接调用Java方法...

    在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection. ...

  7. (转) Android平台上关于IM的实践总结

    前言 IM通信在互联网发展到现在已经是码农的世界里人尽皆知的技术,特别在当下移动互联网迅猛发展的时代这种技术的开发也更加火热,其中老牌的代表作就有QQ和MSN,和最近新崛起的微信,默默,易信,来往等眼 ...

  8. android代码查找图像,Android平台上利用opencv进行图像的边沿检测

    原标题:Android平台上利用opencv进行图像的边沿检测 近开始接触opencv for Android,从网上down了图像的边沿检测的代码. 测试图片: 在Android2.3.1模拟器上跑 ...

  9. 在 Android* 平台上设置原生 OpenGL ES*

    Setting up Native OpenGL ES* on Android* Platforms final.docx BSD2.0.txt ParticleSystemNDK.zip READM ...

最新文章

  1. golang中的pprof支持
  2. 一家互联网公司校园招聘的笔试题以及答题分析
  3. php 错误日志 redis' already loaded in Unknown on line 0
  4. Redis底层实现--字符串
  5. C++中模板使用详解
  6. 当AI遇上云计算,北京 · DevRun 华为云开发者大会
  7. 小程序--计算正负数个数
  8. browser.html – HTML 实现 Firefox UI
  9. python 爬虫论_Python网络爬虫(理论篇)
  10. 爬虫学习(七)——使用代理服务器进行数据爬取
  11. JavaScript 操作 session 方法
  12. 【供应链架构day2】美团收单供应链系统的演进之路
  13. Java程序设计基础学习
  14. HTML - 空链接
  15. Navigation导航系统
  16. C语言printf按二进制输出整数
  17. CodeForces 961G Partitions 题解
  18. 【2020年高被引学者】 田奇 华为
  19. 好物推荐:2020 年常用软件锦集!帮你解决 90% 的软件问题
  20. 日薪行-大龄程序员的绝对优势与绝对劣势-反观01

热门文章

  1. html5项目改造Vue工程化
  2. html制作相册影集,用影集制作系统 轻松制作绚丽电子相册
  3. python-伪随机数生成器
  4. java字符串在字符中的位置_Java如何获取字符在字符串中的位置
  5. 【机器学习开放项目】安然公司电子邮件数据集
  6. element tree 父级勾选子级也勾选,子级勾选默认父级也勾选, 子级取消勾选不影响父级勾选(前端)
  7. 微信小程序的推广思路与方法,详细思路解析
  8. ESR-CMDS参数含义
  9. Django微信抢票大作业总结
  10. python复杂背景抠图_Opencv实现抠图背景图替换功能