getLastKnownLocation()返回null的解决
2014-09-19 12:05
651 查看
这段时间,定位的头个难题就是GPS定位问题,今天中午终于解决了,在这里面小小分享一下心得,顺便将代码奉上。
getLastKnownLocation仅仅是获取当缓存中的上一次打开地图缓存起来的位置,我总是看着不对劲希望有一个getCurrentLocation之类的函数,可惜木有... ... 所以只好另想起他的办法了~
方法就是用一个循环直到获得location为止~
Java代码
LocationManager mgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location location = mgr.getLastKnownLocation(bundle.getString("provider"));
while(location == null)
{
mgr.requestLocationUpdates("gps", 60000, 1, locationListener);
}
完整代码如下:
Java代码
package com.jessie.buzi.impl;
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.widget.Toast;
public class UserLocationFound{
private int latitude = 0;
private int longitude = 0;
private Context context;
private LocationManager locationManager;
private String provider;
private Location location;
public UserLocationFound(Context context){
this.context= context;
setLatitudeAndLongitude();
}
public void setLatitude(int latitude) {
this.latitude = latitude;
}
public int getLatitude() {
return latitude;
}
public void setLongitude(int longitude) {
this.longitude = longitude;
}
public int getLongitude() {
return longitude;
}
public void setLatitudeAndLongitude() {
// TODO Auto-generated method stub
// 获取 LocationManager 服务
locationManager = (LocationManager) (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
// locationManager.setTestProviderEnabled("gps", true);
// 获取 Location Provider
getProvider();
// 如果未设置位置源,打开 GPS 设置界面。
openGPS();
// 获取位置
location = locationManager.getLastKnownLocation(provider);
// 显示位置信息到文字标签
updateWithNewLocation(location);
// 注册监听器 locationListener ,第 2 、 3 个参数可以控制接收 gps 消息的频度以节省电力。第 2 个参数为毫秒,
// 表示调用 listener 的周期,第 3 个参数为米 , 表示位置移动指定距离后就调用 listener。
}
// Gps 消息监听器
private final LocationListener locationListener = new LocationListener() {
// 位置发生改变后调用
public void onLocationChanged(Location location) {
updateWithNewLocation(location);
}
// provider 被用户关闭后调用
public void onProviderDisabled(String provider) {
updateWithNewLocation(null);
}
// provider 被用户开启后调用
public void onProviderEnabled(String provider) {
}
// provider 状态变化时调用
public void onStatusChanged(String provider, int status,Bundle extras) {
}
};
private void updateWithNewLocation(Location location2) {
// TODO Auto-generated method stub
while(location == null){
locationManager.requestLocationUpdates(provider, 2000, (float) 0.1, locationListener);
}
if (location != null) {
latitude = ((int)(location.getLatitude()*100000));
longitude = (int)(location.getLongitude()*100000);
// changeFormat(latitude,longitude);
} else {
latitude = 3995076;
longitude = 11619675;
}
}
private void openGPS() {
// TODO Auto-generated method stub
if (locationManage
.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)
|| locationManager
.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER)
){
Toast.makeText(context, " 位置源已设置! ", Toast.LENGTH_SHORT).show();
return;
}
Toast.makeText(context, " 位置源未设置!", Toast.LENGTH_SHORT).show();
}
private void getProvider() {
// TODO Auto-generated method stub
// 构建位置查询条件
Criteria criteria = new Criteria();
// 查询精度:高
criteria.setAccuracy(Criteria.ACCURACY_FINE);
// 是否查询海拨:否
criteria.setAltitudeRequired(false);
// 是否查询方位角 : 否
criteria.setBearingRequired(false);
// 是否允许付费:是
criteria.setCostAllowed(true);
// 电量要求:低
criteria.setPowerRequirement(Criteria.POWER_LOW);
// 返回最合适的符合条件的 provider ,第 2 个参数为 true 说明 , 如果只有一个 provider 是有效的 , 则返回当前
// provider
provider = locationManager.getBestProvider(criteria, true);
}
}
getLastKnownLocation仅仅是获取当缓存中的上一次打开地图缓存起来的位置,我总是看着不对劲希望有一个getCurrentLocation之类的函数,可惜木有... ... 所以只好另想起他的办法了~
方法就是用一个循环直到获得location为止~
Java代码
LocationManager mgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location location = mgr.getLastKnownLocation(bundle.getString("provider"));
while(location == null)
{
mgr.requestLocationUpdates("gps", 60000, 1, locationListener);
}
完整代码如下:
Java代码
package com.jessie.buzi.impl;
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.widget.Toast;
public class UserLocationFound{
private int latitude = 0;
private int longitude = 0;
private Context context;
private LocationManager locationManager;
private String provider;
private Location location;
public UserLocationFound(Context context){
this.context= context;
setLatitudeAndLongitude();
}
public void setLatitude(int latitude) {
this.latitude = latitude;
}
public int getLatitude() {
return latitude;
}
public void setLongitude(int longitude) {
this.longitude = longitude;
}
public int getLongitude() {
return longitude;
}
public void setLatitudeAndLongitude() {
// TODO Auto-generated method stub
// 获取 LocationManager 服务
locationManager = (LocationManager) (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
// locationManager.setTestProviderEnabled("gps", true);
// 获取 Location Provider
getProvider();
// 如果未设置位置源,打开 GPS 设置界面。
openGPS();
// 获取位置
location = locationManager.getLastKnownLocation(provider);
// 显示位置信息到文字标签
updateWithNewLocation(location);
// 注册监听器 locationListener ,第 2 、 3 个参数可以控制接收 gps 消息的频度以节省电力。第 2 个参数为毫秒,
// 表示调用 listener 的周期,第 3 个参数为米 , 表示位置移动指定距离后就调用 listener。
}
// Gps 消息监听器
private final LocationListener locationListener = new LocationListener() {
// 位置发生改变后调用
public void onLocationChanged(Location location) {
updateWithNewLocation(location);
}
// provider 被用户关闭后调用
public void onProviderDisabled(String provider) {
updateWithNewLocation(null);
}
// provider 被用户开启后调用
public void onProviderEnabled(String provider) {
}
// provider 状态变化时调用
public void onStatusChanged(String provider, int status,Bundle extras) {
}
};
private void updateWithNewLocation(Location location2) {
// TODO Auto-generated method stub
while(location == null){
locationManager.requestLocationUpdates(provider, 2000, (float) 0.1, locationListener);
}
if (location != null) {
latitude = ((int)(location.getLatitude()*100000));
longitude = (int)(location.getLongitude()*100000);
// changeFormat(latitude,longitude);
} else {
latitude = 3995076;
longitude = 11619675;
}
}
private void openGPS() {
// TODO Auto-generated method stub
if (locationManage
.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)
|| locationManager
.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER)
){
Toast.makeText(context, " 位置源已设置! ", Toast.LENGTH_SHORT).show();
return;
}
Toast.makeText(context, " 位置源未设置!", Toast.LENGTH_SHORT).show();
}
private void getProvider() {
// TODO Auto-generated method stub
// 构建位置查询条件
Criteria criteria = new Criteria();
// 查询精度:高
criteria.setAccuracy(Criteria.ACCURACY_FINE);
// 是否查询海拨:否
criteria.setAltitudeRequired(false);
// 是否查询方位角 : 否
criteria.setBearingRequired(false);
// 是否允许付费:是
criteria.setCostAllowed(true);
// 电量要求:低
criteria.setPowerRequirement(Criteria.POWER_LOW);
// 返回最合适的符合条件的 provider ,第 2 个参数为 true 说明 , 如果只有一个 provider 是有效的 , 则返回当前
// provider
provider = locationManager.getBestProvider(criteria, true);
}
}
相关文章推荐
- MAP getLastKnownLocation()返回null的解决
- getLastKnownLocation()返回null的解决
- Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null)
- Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null)
- getLastKnownLocation()返回null的解决
- Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null)
- Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null)
- 如何获取gps卫星导航定位,解决getLastKnownLocation返回null
- Android GPS getLastKnownLocation()返回null的解决
- MAP getLastKnownLocation()返回null的解决
- Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null)
- 如何获取gps卫星导航定位,解决getLastKnownLocation返回null
- Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null)
- Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null)
- android getLastKnownLocation 返回null
- 关于定位时,getLastKnownLocation返回值为null所碰到的问题
- getLastKnownLocation 返回null
- getLastKnownLocation 返回null
- android getLastKnownLocation()获取当前位置为null解决方法
- getLastKnownLocation 返回null