欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-02 18:40:46
最近在做一个 android 项目,需要用到gps获取位置信息,从 api 查了一下,发现获取位置信息仅需极其简单的一句即可:复制代码 代码如下:getlastknownl...

最近在做一个 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();
     }