关于Android GPS获取Location的问题,求高人指点~~~!

z03081118 2012-10-29 01:58:46
大家好!最近在做一个android的应用里面用到GPS的内容,过程中遇到问题!
贴个代码:
 LocationManager locationManager;  
String serviceName = Context.LOCATION_SERVICE;
locationManager = (LocationManager) this.getSystemService(serviceName);
// 查找到服务信息
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE); // 高精度
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW); // 低功耗
String provider = locationManager.getBestProvider(criteria, true); // 获取GPS信息
Location location = locationManager.getLastKnownLocation(provider); // 通过GPS获取位置
if(location==null){
location = locationManager.getLastKnownLocation(locationManager.NETWORK_PROVIDER);
}
if (location != null) {
double latitude = location.getLatitude();
double longitude= location.getLongitude();
Address = ConvertUtil.getAddress(longitude, latitude);
}else{
Address =" ";
}
// 设置监听器,自动更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了方便)或最小位移变化超过N米
locationManager.requestLocationUpdates(provider, 100 * 1000, 500, new LocationListener(){
@Override
public void onLocationChanged(Location arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub

}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub

}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
}
});

我们Criteria 去获取最佳的Provider,然后去用实现监听位置的改变。
但是在真机上面,我们直接这么去获取的话,获取到的Location会是一个Null,权限注册什么的都没有问题,现在我就非常不解,我们应该怎么去获取一个Location,或者说是获取一个不为NULL的Location,还是我上面这个方法本身就不对?有没有更好的方法,
...全文
365 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
JewLeo 2012-11-01
  • 打赏
  • 举报
回复
这是初学者都会遇到的问题,手机一般是不能不能立刻获得经纬度的,有一定的延时,这个你要在获取的时候处理一下,将location==null给过滤掉就可以了。

Location location = locationManager.getLastKnownLocation(provider); 这个代码的意思是获取上次缓存的location的信息,如果你在安装后第一次使用,哪肯定是null。

实际上获取位置信息要放在locationManager.requestLocationUpdates方法中
開通測試 2012-11-01
  • 打赏
  • 举报
回复
我個人開發的幾點心得,請參考

1.除了註冊gps權限,請檢查gps定位是否有打開

LocationManager status = (LocationManager) (this.getSystemService(Context.LOCATION_SERVICE));
if (status.isProviderEnabled(LocationManager.GPS_PROVIDER)|| status.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
// 如果GPS或網路定位開啟
}



2.當你的app啟動的時候,一開始用LocationManager,除了getLastKnownLocation,通常一開始式要佈道位置的,因為一開始的初始定位沒有那麼快,所以真正取得位置都會是在 onLocationChanged() 這個方法裡面。

locationManager.requestLocationUpdates(provider, 100 * 1000, 500, new LocationListener(){
@Override
public void onLocationChanged(Location arg0) {
// 等到確認有定位資訊或是定位資訊改變會呼叫這個方法
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub

}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub

}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
}
});
IT谭 2012-10-31
  • 打赏
  • 举报
回复
locationManager.getLastKnownLocation(provider):返回上次的地理位置,如果之前手机未定过位,会先返回null的; 另外,通过GPS定位是需要时间的,并且GPS定位如果是在室内的话,效果很不好(基本上是定位不到,要不就差好远).
相应速度快的话也可采用基站定位(缺点:偏差比gps能大点).
pan25504 2012-10-30
  • 打赏
  • 举报
回复
在真机上面,我们直接这么去获取的话,会得到系统默认的最优定位方式。有时候不一定就是GPS。如果确定用GPS定位, String provider的设定可以直接=“gps”(LocationManager.GPS_PROVIDER).
z03081118 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
在真机上面,我们直接这么去获取的话,会得到系统默认的最优定位方式。有时候不一定就是GPS。如果确定用GPS定位, String provider的设定可以直接=“gps”(LocationManager.GPS_PROVIDER).
[/Quote]
谢谢!嗯你说的这个我知道,但是直接设定的话获取的Location是null

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧