xamarin android使用gps定位获取经纬度
来源:互联网 发布:minecraft0.15js 编辑:程序博客网 时间:2024/05/16 19:07
看了文章你会得出以下几个结论
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定位获取经纬度
- Android GPS定位 获取经纬度
- Android GPS定位 获取经纬度
- Android GPS定位 获取经纬度
- Android GPS/WIFI定位 获取经纬度
- Android GPS定位(获取经纬度)
- Android GPS定位(获取经纬度)
- android 使用gps获取经纬度
- Android--使用手机GPS获取经纬度
- Android--使用手机GPS获取经纬度
- Android获取GPS经纬度
- 使用Gps获取经纬度
- android中手机获取经纬度,主要是使用gps定位系统
- 【Unity】使用GPS定位经纬度
- GPS定位+经纬度定位
- android 获取GPS定位,
- android 下使用GPS 无法获取经纬度的解决方法
- GPS 定位经纬度
- 【阿柟碎碎念】暑期集训篇
- Android-手势-实现图片左右滑动效果
- PAT-1007. Maximum Subsequence Sum (25)
- 链表求和
- POJ 3091 Triangular N-Queens Problem 笔记
- xamarin android使用gps定位获取经纬度
- POJ 3020 Antenna Placement (最小边覆盖/最大匹配应用)
- 个人感悟
- 常量池、栈、堆的比较(慢慢消化)
- shord_ptr
- C语言学习中整理的知识
- Android进阶之路--启动模式
- python作业(7.8 —— 7.9)
- 关于变量说明