[置顶] xamarin android使用gps定位获取经纬度
看了文章你会得出以下几个结论
1.android定位主要有四种方式GPS,Network(wifi定位、基站定位),AGPS定位
2.绝大部分android国产手机使用network进行定位是没有作用的,肯定是无法获取获取位置信息(当然也肯定是有办法解决这种问题的)
3.android 的GPS定位需要一定时间的,大概一分钟左右。
4.android的Network方式定位需要一定时间,大概两秒左右。
这篇文章献给小白,大神请勿见笑,我也是参考了几篇文章才得出以上几个结论,希望给刚学习android 定位的小白少走点弯路。下面就来讲讲这几个具体的结论和如何使用android GPS定位。
其实如何使用android定位,还是比较简单,刚开始学习定位,但是很多概念点不知道,使用android 的“GPS”定位时,百度了一下,知道了android定位主要有四种方式GPS,Network(wifi定位、基站定位),AGPS定位 。原本我以为使用network定位这几行代码就可以实现了,结果发现获取的location始终为null,那么问题就来了。
国产android手机 使用network进行定位时获取location始终为null
//获取地理位置管理器
locationManager = (LocationManager)GetSystemService(Context.LocationService);
//获取地理位置信息设置查询条件
if (locationManager.IsProviderEnabled(LocationManager.NetworkProvider))
{
location = locationManager.GetLastKnownLocation(LocationManager.NetworkProvider);
}
if (location != null)
{
string info = "时间:" + ConvertLongToDateTime(location.Time).ToString("yyyy-MM-dd HH:mm:ss") + "\n海拔:" + location.Altitude + "\n经度:" + location.Longitude + "\n纬度:" + location.Latitude+"\n提供者:"+location.Provider;
tv_location.Text = info;
Debug.Write(info);
}
刚开始,写这几行代码,以为能获取到location,结果发现network不支持(其实绝大部分android国产机都不支持),导致location一直为null。看了几篇文章,发现很多人使用network也是能获取到,看你手机吧。结果发现很多人也遇到过这种问题,如:http://bbs.csdn.net/topics/350224658
真正原因:国产手机厂商对android系统进行了改动,将谷歌的服务包删除了,无法支持network定位的的根本原因就是没有谷歌的网络定位服务包,也就说network定位调用的是谷歌地图api,而百度,腾讯,高德都是使用自己的地图api包,最终的原因我们还是能理解的google毕竟没有进入中国来,不能提供服务也在情理之中。
解决办法:既然没有服务包,重新加上就可以了。参考这篇文章http://blog.csdn.net/bjrxyz/article/details/8606805
android 使用gps定位获取的location为null
上面刚刚说到大部分国产android不能使用network方式定位,那就使用gps定位,gps定位需要硬件支持,直接和卫星交互来获取当前location信息。
优点:“速度快”,精度高,不需要网络
缺点:首次连接时间长,像室内这种有遮挡物的空间无法获取location,比较耗电。
关于android中使用gps定位获取的location为null,1.首先你得先确定是否在遮挡物的空间下,如果有遮挡物是无法通过gps来定位的,我虽然也是在室内但是在窗户边能够通过gps获取location。
2.Location location=locationManager.GetLastKnownLocation(“gps”); 这行代码第一次运行的时候location肯定是为null的。GetLastKnownLocation方法获取的是上一次定位的位置。而且获取使用gps获取Location是需要一定的时间,所以说要用监听的方式来实现获取Location。下面就用代码来实现在xamarin android中使用GPS定位获取经纬度
代码实现xamarin android使用gps定位获取经纬度
以下代码都是在真机下运行的。
先来看看Activity总的代码,实现监听Location的接口ILocationListener
,当然GPS状态的接口是GpsStatus.IListener也可以实现监听。
效果图如下:
public class TestActivity : Activity, ILocationListener, GpsStatus.IListener
{
private TextView tv_location;
private LocationManager locationManager;
private DateTime now;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.Main);
tv_location = FindViewById<TextView>(Resource.Id.tv_location);
locationManager = (LocationManager)GetSystemService(Context.LocationService);
if (!locationManager.IsProviderEnabled(LocationManager.GpsProvider))
{
Intent intent = new Intent(Android.Provider.Settings.ActionLocationSourceSettings);
StartActivityForResult(intent,0);
}
now = DateTime.Now;
//获取最好的定位提供,如果你的android国产机不支持network,开了gps,这个时候返回的gps
string bestProvider = locationManager.GetBestProvider(getCriteria(),true);
Location location = locationManager.GetLastKnownLocation(bestProvider);
UpdateLocation(location);
locationManager.AddGpsStatusListener(this);//这个是监听状态GPS
//注册监听,第一个参数定位提供者,这里使用的是gps,我小米手机不支持network,大多数不支持,不建议使用network
//参数2:位置信息更新周期,单位为毫秒
//参数3:位置变化最小距离,当位置距离变化超过这个值,将更新位置信息
locationManager.RequestLocationUpdates("gps",1000,1,this);
}
}
//Location的监听的接口相关方法的实现
//位置发生变化触发
public void OnLocationChanged(Location location)
{
UpdateLocation(location);
}
//gps禁用触发
public void OnProviderDisabled(string provider)
{
UpdateLocation(null);
}
/// GPS开启时触发
public void OnProviderEnabled(string provider)
{
//throw new NotImplementedException();
Location location = locationManager.GetLastKnownLocation(provider);
UpdateLocation(location);
}
/// GPS状态发生变化
public void OnStatusChanged(string provider, [GeneratedEnum] Availability status, Bundle extras)
{
switch (status)
{
case Availability.Available:
System.Diagnostics.Debug.WriteLine("当前GPS状态为可见");
break;
case Availability.OutOfService:
System.Diagnostics.Debug.WriteLine("当前GPS状态为服务区外状态");
break;
case Availability.TemporarilyUnavailable:
System.Diagnostics.Debug.WriteLine("当前GPS状态为暂停服务状态");
break;
}
}
///GpsStatus.IListener接口gps状态的实现
/// GPS状态改变触发
public void OnGpsStatusChanged([GeneratedEnum] GpsEvent e)
{
switch (e)
{
//第一次定位
case GpsEvent.FirstFix:
System.Diagnostics.Debug.WriteLine("第一次定位");
break;
case GpsEvent.SatelliteStatus:
System.Diagnostics.Debug.WriteLine("卫星状态改变");
//获取当前状态
GpsStatus gpsStatus = locationManager.GetGpsStatus(null);
int maxSatellites = gpsStatus.MaxSatellites;
//Iterator<GpsSatellite> iters= gpsStatus.Satellites.Iterator();
break;
//定位启动
case GpsEvent.Started:
System.Diagnostics.Debug.WriteLine("定位启动");
break;
//定位结束
case GpsEvent.Stopped:
System.Diagnostics.Debug.WriteLine("定位结束");
break;
}
}
//更新Location
private void UpdateLocation(Location location)
{
if (location != null)
{
var useTime = ConvertLongToDateTime(location.Time);
TimeSpan timeSpan = useTime.Subtract(now);
string info = "时间:" + ConvertLongToDateTime(location.Time).ToString("yyyy-MM-dd HH:mm:ss") + "\n海拔:" + location.Altitude + "\n经度:" + location.Longitude + "\n纬度:" + location.Latitude + "\n提供者:" + location.Provider+"\n定位用了"+timeSpan.Seconds+"秒";
tv_location.Text = info;
Debug.WriteLine(info);
}
}
最后加上权限:
<uses-permission android:name =“android.permission.ACCESS_FINE_LOCATION”/>
<uses-permission android:name =“android.permission.ACCESS_COARSE_LOCATION”/>
这里介绍了android的gps定位,关于其他方式我就不介绍了,文章开头的几个结论都是在实践中得出的。实际开发总各种问题都会出来,以上的内容就当是入门介绍罢了。去年写了篇使用百度地图定位这篇:http://blog.csdn.net/kebi007/article/details/52887570
代码下载地址:http://download.csdn.net/detail/kebi007/9895733
作者:张林
标题:xamarin android使用gps定位获取经纬度
原文地址:http://blog.csdn.net/kebi007/article/details/74936979
转载随意注明出处
[置顶] xamarin android使用gps定位获取经纬度的更多相关文章
- [置顶]
Xamarin android如何调用百度地图入门示例(一)
在Xamarin android如何调用百度地图呢? 首先我们要区分清楚,百度地图这是一个广泛的概念,很多刚刚接触这个名词"百度地图api",的确是泛泛而谈,我们来看一下百度地图的 ...
- [置顶]
xamarin android自定义标题栏(自定义属性、回调事件)
自定义控件的基本要求 这篇文章就当是自定义控件入门,看了几篇android关于自定义控件的文章,了解了一下,android自定义控件主要有3种方式: 自绘控件:继承View类,所展示的内容在OnDra ...
- [置顶]
xamarin android使用zxing扫描二维码
好久没写了,这片文章篇幅不长,概述一下在xamarin android中用 ZXing.Net.Mobile库扫描二维码读取url的示例.扫码支付,扫码登录,App上各种各样的扫码,好像没个扫码的就有 ...
- [置顶]
Xamarin android 调用Web Api(ListView使用远程数据)
xamarin android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问.xamarin android调用远程数据主要有两种方式: 在Android中保存数据或调用数 ...
- [置顶]
xamarin android自定义spinner
以前弄的一个下拉框时自带的spinner,感觉好丑,实际效果实在满足不了基本的UI界面要求,还是自己动手丰衣足食,看了网上关于android中自定义spinner的文章,感觉实现原理还是比较简单,所以 ...
- [置顶]
xamarin android 布局尺寸了解
为了使UI界面在不同大小的移动端显示器上能够正常显示,大家可能都知道使用sp作为字体大小的单位,dp作为其他元素长度的单位. 前几天看了一篇文章关于 App设计规范的,文章用心写的非常好,这里是链接 ...
- [置顶]
xamarin android Fragment实现底部导航栏
前段时间写了篇关于Fragment的文章,介绍了基础的概念,用静态和动态的方式加载Fragment Xamarin Android Fragment的两种加载方式.下面的这个例子介绍xamarin ...
- [置顶]
Xamarin android沉浸式状态栏
虽然关于android "沉浸式"状态栏有很多博客介绍过,从小菜到大神无一例外.我第一次看到这种"沉浸"式的效果我也以为真的是这么叫,然而根本不是这么回事,完全 ...
- [置顶]
Xamarin android中使用signalr实现即时通讯
前面几天也写了一些signalr的例子,不过都是在Web端,今天我就来实践一下如何在xamarin android中使用signalr,刚好工作中也用到了这个,也算是总结一下学到的东西吧,希望能帮助你 ...
随机推荐
- 小程序web-view组件
不久前微信小程序发布了web-view组件,这个消息在各个圈里引起不小的涟漪.近期正好在做小程序的项目,便研究了一下这个让大家充满期待的组件. 1,web-view这个组件是什么鬼? 官网的介绍: ...
- 极光推送_总结_01_Java实现极光推送
一.代码实现 1.配置类—Env.java package com.ray.jpush.config; /**@desc : 极光推送接入配置 * * @author: shirayner * @da ...
- MapReduce 入门之一步步自实现词频统计功能
原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7687120.html ------------------------------------ ...
- kafka原理和实践(二)spring-kafka简单实践
系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...
- vuejs(2.0)基础笔记
基本结构 <div id="app"> {{ message }} </div> var app = new Vue({ el: '#wrap', data ...
- Less命名空间
Less命名空间 当我们拥有了大量选择器的时候,特别是团队协同开发时,如何保证选择器之间重名问题?如果你是 java 程序员或 C++ 程序员,我猜你肯定会想到命名空间 Namespaces. Les ...
- DOM操作中,getElementByXXXX 和 querySelector 的区别
1. 返回值: getElements返回动态集合: 优: 首次查找效率高 缺: 可能造成反复查找DOM树 querySelector返回非动态集合: 优 ...
- Go基础之--位操作中你所不知道的用法
之前一直忽略的就是所有语言中关于位操作,觉得用处并不多,可能用到也非常简单的用法,但是其实一直忽略的是它们的用处还是非常大的,下面先回顾一下位操作符的基础 位操作符 与操作:&1 & ...
- iOS 视频播放方式整理
初衷 多媒体这整个系列的文章自己也准备好开始整理了,先从视频音频最简单也是最常用的播放出发慢慢的往下深究,探索到底层的编码解码等等,这篇文章就从视频的播放这个最简单的说起. iOS的视频播放方式有几种 ...
- NYOJ 323 Drainage Ditches 网络流 FF 练手
Drainage Ditches 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Every time it rains on Farmer John's fields, ...