当前位置: 移动技术网 > 移动技术>移动开发>Android > Android打开GPS导航并获取位置信息返回null解决方案

Android打开GPS导航并获取位置信息返回null解决方案

2019年07月24日  | 移动技术网移动技术  | 我要评论

最近在做一个 android 项目,需要用到gps获取位置信息,从 api 查了一下,发现获取位置信息仅需极其简单的一句即可:

复制代码 代码如下:

getlastknownlocation(locationmanager.gps_provider),

于是高兴地不得了。可是一写进代码里,返回值(location 类型)居然一直为null..郁闷的不得了。在网上查了好久,发现好多人都和我一样纠结于这个问题上,有人说是因为gps没打开,也有人说是相关权限没加上..可是我的明明已经在设置里打开,权限自然也加上了。在api上纠结了半天,终于找出原因了,原来要打开gps其实在于这句:
 
复制代码 代码如下:
 
settestproviderenabled("gps",true);

而跟手机上的设置没多大关系(起码在我的手机上测是这样的)。手机上的设置关闭了,这一句照样能打开;而即使手机设置打开了,没这一句也是白搭。与这句对应的是
 
复制代码 代码如下:
 
settestproviderenabled("gps",false);

用来关闭gps.
gps打开后可以用上面的方法获取location了吗?还是不可以!确切地说是有时候可以,因为这个函数获取的是上次已经获得的位置信息,设想如果此程序第一次跑,先前并没有获取过位置信息,当然返回值为null了。经仔细查看api,在
复制代码 代码如下:

requestlocationupdates (string provider, long mintime, float mindistance, locationlistener listener)

里发现了这样一句话:it may take a while to receive the most recent location. if an immediate location is required, applications may use the getlastknownlocation(string) method. 因此为了获取位置信息,应该用此方法为manager设置监听器,在监听器中onlocationchanged(location location)里获取。
测试代码如下:
复制代码 代码如下:

public void onlocationchanged(location location)
            {
                log.i("onlocationchanged", "come in");
                if (location != null)
                {
                    log.w("location","current altitude = "+ location.getaltitude());
                    log.w("location","current latitude = "+ location.getlatitude());
                }
            }
    

经过测试,经过一段时间后可以获取location(获取时间与mintime、mindistance相关)。还需注意的一个问题是在设置了监听器后,删除监听器之前不能用上面的方法关闭gps,否则会报错。因此关闭gps的方法是
 
复制代码 代码如下:
 
manager.removeupdates (listener);//listener 即为监听器实例
manager.settestproviderenabled("gps",false);

以下是测试代码,所需权限有:
复制代码 代码如下:

<uses-permission android:name="android.permission.access_fine_location"></uses-permission>
<uses-permission android:name="android.permission.access_mock_location"></uses-permission>
<uses-permission android:name="android.permission.update_device_stats"></uses-permission>

复制代码 代码如下:

import android.app.activity;
 import android.content.context;
 import android.location.criteria;
 import android.location.location;
 import android.location.locationlistener;
 import android.location.locationmanager;
 import android.os.bundle;
 import android.util.log;
 public class audio extends activity
 {
     /** called when the activity is first created. */
     locationmanager locationmanager;
     locationlistener llistener;
     string provider;
     public void oncreate(bundle savedinstancestate)
     {
         super.oncreate(savedinstancestate);
         setcontentview(r.layout.main);
         criteria criteria = new criteria();
         criteria.setaccuracy(criteria.accuracy_fine);
         criteria.setaltituderequired(false);
         criteria.setbearingrequired(false);
         criteria.setcostallowed(true);
         criteria.setpowerrequirement(criteria.power_low);
         string servicename = context.location_service;
         locationmanager = (locationmanager) getsystemservice(servicename);
         locationmanager.settestproviderenabled("gps", true);
         provider = locationmanager.getbestprovider(criteria, true);
         log.d("provider", provider);
         llistener = new locationlistener() {
             @override
             public void onlocationchanged(location location)
             {
                 // todo auto-generated method stub
                 log.i("onlocationchanged", "come in");
                 if (location != null)
                 {
                     log.w("location", "current altitude = "
                             + location.getaltitude());
                     log.w("location", "current latitude = "
                             + location.getlatitude());
                 }
                 locationmanager.removeupdates(this);
                 locationmanager.settestproviderenabled(provider, false);
             }
             @override
             public void onproviderdisabled(string provider)
             {
                 // todo auto-generated method stub
                 log.i("onproviderdisabled", "come in");
             }
             @override
             public void onproviderenabled(string provider)
             {
                 // todo auto-generated method stub
                 log.i("onproviderenabled", "come in");
             }
             @override
             public void onstatuschanged(string provider, int status,
                     bundle extras)
             {
                 // todo auto-generated method stub
                 log.i("onstatuschanged", "come in");
             }
         };
          locationmanager.requestlocationupdates(provider, 1000, (float) 1000.0, llistener);
     }
     protected void ondestroy()
     {
         locationmanager.removeupdates(llistener);
         locationmanager.settestproviderenabled(provider, false);
         super.ondestroy();
     }

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网