xamarin android使用gps定位获取经纬度

简介: 看了文章你会得出以下几个结论 1.android定位主要有四种方式GPS,Network(wifi定位、基站定位),AGPS定位 2.绝大部分android国产手机使用network进行定位是没有作用的,肯定是无法获取获取位置信息(当然也肯定是有办法解决这种问题的) 3.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 androidname =“android.permission.ACCESS_FINE_LOCATION”/>   
 <uses-permission androidname =“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
转载随意注明出处

目录
相关文章
|
定位技术 API 开发工具
Android 按照步骤接入百度地图API,定位显示不了解决办法
Android 按照步骤接入百度地图API,定位显示不了解决办法
371 1
|
2月前
|
Java 测试技术 Android开发
Android性能测试——发现和定位内存泄露和卡顿
本文详细介绍了Android应用性能测试中的内存泄漏与卡顿问题及其解决方案。首先,文章描述了使用MAT工具定位内存泄漏的具体步骤,并通过实例展示了如何分析Histogram图表和Dominator Tree。接着,针对卡顿问题,文章探讨了其产生原因,并提供了多种测试方法,包括GPU呈现模式分析、FPS Meter软件测试、绘制圆点计数法及Android Studio自带的GPU监控功能。最后,文章给出了排查卡顿问题的四个方向,帮助开发者优化应用性能。
137 4
Android性能测试——发现和定位内存泄露和卡顿
|
3月前
|
自然语言处理 定位技术 API
Android经典实战之如何获取图片的经纬度以及如何根据经纬度获取对应的地点名称
本文介绍如何在Android中从图片提取地理位置信息并转换为地址。首先利用`ExifInterface`获取图片内的经纬度,然后通过`Geocoder`将经纬度转为地址。注意操作需在子线程进行且考虑多语言支持。
214 4
|
6月前
|
JSON Java 定位技术
【Android App】GPS获取定位经纬度和根据经纬度获取详细地址讲解及实战(附源码和演示 超详细)
【Android App】GPS获取定位经纬度和根据经纬度获取详细地址讲解及实战(附源码和演示 超详细)
1793 0
|
6月前
|
安全 算法 JavaScript
安卓逆向 -- 关键代码定位与分析技术
安卓逆向 -- 关键代码定位与分析技术
151 0
|
6月前
|
XML Java 定位技术
【Android App】定位导航GPS中开启手机定位功能讲解及实战(附源码和演示 超详细)
【Android App】定位导航GPS中开启手机定位功能讲解及实战(附源码和演示 超详细)
292 0
|
开发工具 Android开发 iOS开发
使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
使用vs2019学习xamarin时,创建新程序。使用模拟器真机等测试都报错如下图错误: ![请在此添加图片描述](https://developer-private-1258344699.cos.ap-guangzhou.myqcloud.com/column/article/5877188/20231030-de8ce5fd.png?x-cos-security-token=r4KyZDEowPT0kGTL0LqE8EnwfN1Nzexadb05dcffed3939ff8d7591c528c01706nvpGSE93QwHpZM8NwhJNTZctNRQa0l3KDhEnqj8P7d8t
117 0
使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
|
Android开发 C语言
[笔记]安卓 使用breakpad定位崩溃问题
[笔记]安卓 使用breakpad定位崩溃问题
102 0
|
前端开发 定位技术 Android开发
Android平台GB28181设备接入端如何实时更新经纬度实现国标平台侧电子地图位置标注
我们在做GB28181设备接入端的时候,其中有个功能,不难但非常重要:那就是GB28181实时位置的订阅(mobileposition subscribe)和上报(notify)。
169 0
|
XML Android开发 数据格式
Android GB28181接入端实时位置订阅和上报之-如何获取当前经纬度
我们在做Android平台GB28181的时候,其中实时位置(MobilePosition)订阅和上报这块,涉及到实时经纬度的获取,特别是执法记录、车载系统的那个等场景,几乎就是标配。
126 0