Android打开GPS导航并获取位置信息返回null解决方案
程序员文章站
2023-12-14 17:44:52
最近在做一个 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();
}