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

开发工具:Andorid Studio 1.3

运行环境:Android 4.4 KitKat

代码实现

这里需用获取加速度传感器和地磁传感器,手机获取旋转的方向都是通过加速度传感器和地磁传感器共同计算得出来的,给传感器注册监听器,这里由于精度要求,需要使用SENSOR_DELAY_GAME来提高传感器更新速率

private void initSensor() {
sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(sensorEventListener, magneticSensor, SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(sensorEventListener, accelerometerSensor, SensorManager.SENSOR_DELAY_GAME);
}

在监听器里面的主要工作就是通过两者的数据共同计算旋转角度,通过矩阵计算出所需旋转的角度,更新图片旋转角度

private SensorEventListener sensorEventListener  = new SensorEventListener() {
float[] accelerometerValues = new float[3];
float[] magneticValues = new float[3];
private float lastRotateDegree;
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accelerometerValues = sensorEvent.values.clone();
} else if (sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
magneticValues = sensorEvent.values.clone();
}
float[] R = new float[9];
float[] values = new float[3];
SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues);
SensorManager.getOrientation(R, values);
float rotateDegree = -(float)Math.toDegrees(values[0]); if (Math.abs(rotateDegree - lastRotateDegree) > 1) {
RotateAnimation animation = new RotateAnimation(lastRotateDegree, rotateDegree,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
animation.setFillAfter(true);
imgCompass.startAnimation(animation);
lastRotateDegree = rotateDegree;
}
} @Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
};

位置服务这边通过LocationManager来获取位置服务,检测手机是否打开位置服务,主要就是调用手机的位置服务,包括GPS和Network,从Provider中获得相应的经纬度,更新UI

private void initLocation() {
locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
List<String> providerList = locationManager.getProviders(true);
String provider = null;
if (providerList.contains(LocationManager.GPS_PROVIDER)) {
provider = LocationManager.GPS_PROVIDER;
} else if (providerList.contains(LocationManager.NETWORK_PROVIDER)) {
provider = LocationManager.NETWORK_PROVIDER;
} else {
Toast.makeText(this, "No location provider to use", Toast.LENGTH_SHORT).show();
return;
} try {
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
showLocation(location);
}
locationManager.requestLocationUpdates(provider, 5000, 1, locationListener);
} catch (Exception e) {
e.printStackTrace();
}
}

注册的locationListener中只需要使用onLocationChanged即可,就是更新UI

private LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) { showLocation(location); } @Override
public void onStatusChanged(String s, int i, Bundle bundle) {} @Override
public void onProviderEnabled(String s) {} @Override
public void onProviderDisabled(String s) {}
}; private void showLocation(Location location) {
edtLott.setText("" + location.getLongitude());
edtLatt.setText("" + location.getLatitude());
}

当程序退出的时候,需要注销已经注册的监听,关于Location的部分使用try语句,因为有可能需用使用到Network

@Override
public void onDestroy() {
super.onDestroy();
if (sensorManager != null) {
sensorManager.unregisterListener(sensorEventListener);
}
if (locationListener != null) {
try {
locationManager.removeUpdates(locationListener);
} catch (Exception e) {
e.printStackTrace();
}
}
}

最后给程序添加使用传感器的权限即可

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>

效果图

初始化界面->偏转手机->点击按钮->刷出经纬度

工程下载

传送门:下载

Android实现传感器应用及位置服务的更多相关文章

  1. 【Android】第18章 位置服务和手机定位—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-03-04 一.简介 目前,基于位置的服务发展迅速,已涉及到商务.医疗.定位.追踪.敏感区域警告.工作和生活等各个方面.定位服务融合了G ...

  2. 《第一行代码》Android特色开发,基于位置服务,出现的问题

    手机GPS定位较慢.精度高.耗电量多,网络定位较快.精度低.耗电量少 当位置精度要求非常高的时候,使用GPS定位:一般情况下,使用网络定位. 按<第一行代码>写了一个定位程序,真机一直没有 ...

  3. [译]:Xamarin.Android平台功能——位置服务

    返回索引目录 原文链接:Location Services. 译文链接:Xamarin.Android平台功能--位置服务 本部分介绍位置服务以及与如何使用位置提供商服务 Location Servi ...

  4. Android 位置服务

    原文来自:http://developer.android.com/guide/topics/location/strategies.html 位置策略 注意: 本指南仅限android.locati ...

  5. Android 位置服务——BaiduLocation的使用

    原文:Android 位置服务--BaiduLocation的使用 版权声明:本文为博主原创文章,欢迎转载,转载请在文章显眼处说明文章出处并给出连接. https://blog.csdn.net/To ...

  6. Android Developers:传感器概述

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

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

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

  8. Android基础总结(8)——服务

    服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行哪些不需要和用户交互而且还要长期运行的任务.服务的运行不依赖任何用户界面,即使当程序被切换到后台,或者用户打开了 ...

  9. Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8046659 在前文中,我们分析了Surface ...

随机推荐

  1. myecplise 添加svn插件

    myecplise svn插件下载地址 http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240 1.SVN下载地址 ...

  2. ios开发之OC基础-oc小程序

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  3. 跨域请求之JSONP 一

    跨域请求之JSONP 一 跨域请求的方式有很多种, iframe document.domain window.name script XDomainRequest (IE8+) XMLHTTPReq ...

  4. poj1942 Paths on a Grid

    处理阶乘有三种办法:(1)传统意义上的直接递归,n的规模最多到20+,太小了,在本题不适用,而且非常慢(2)稍快一点的算法,就是利用log()化乘为加,n的规模虽然扩展到1000+,但是由于要用三重循 ...

  5. SpringMVC与HTML页面

    springMVC返回html页面 spring-mvc.xml配置: <bean id="viewResolver"  class="org.springfram ...

  6. WinForm程序安装、发布流程

    一  签名 所谓签名就是给应用程序一个身份,申请一个专利.签名的时候需要选择证书.就向我们上学一样,得奖了老师给你发个证书.如果不进行签名,杀毒软件会把你打包后的exe文件作为病毒处理. 签名的步骤: ...

  7. Knockout.Js官网学习(html绑定、css绑定)

    Html绑定 html绑定到DOM元素上,使得该元素显示的HTML值为你绑定的参数.如果在你的view model里声明HTML标记并且render的话,那非常有用. 简单示例 <div dat ...

  8. MongoDB数据库的主从配对与迁移示例

    数据中心在运行中有可能遇到各种硬件.电力.网络故障等问题,需要设计良好的系统来隔离,尽量减少对上层应用的影响,持续对外提供服务:一旦发生业务中断,也应尽快恢复.通过主从备份设计,在主应用系统发生故障时 ...

  9. phpQuery采集微信公众号文章乱码

    终于找到解决方案了,这是一个值得庆祝的事情.... 原来是因为微信在源码中加入了防采集代码<!--headTrap<body></body><head>< ...

  10. 重拾C,一天一点点_8

    这两天发现一个问题,我最近发的几篇博文稀里糊涂地被转到别的网站去了,目前发现有两个网站转载了,一个注明了作者出处(博客园 lltong),但没给任何链接.另一个网站呢,就是直接抓的,而且还抓的乱七八糟 ...