`
Cjch
  • 浏览: 111969 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

getLastKnownLocation()返回null的解决

阅读更多
这段时间,定位的头个难题就是GPS定位问题,今天中午终于解决了,在这里面小小分享一下心得,顺便将代码奉上。

getLastKnownLocation仅仅是获取当缓存中的上一次打开地图缓存起来的位置,我总是看着不对劲希望有一个getCurrentLocation之类的函数,可惜木有... ... 所以只好另想起他的办法了~  方法就是用一个循环直到获得location为止~

LocationManager mgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location location = mgr.getLastKnownLocation(bundle.getString("provider"));
while(location  == null)
{
  mgr.requestLocationUpdates("gps", 60000, 1, locationListener);
}


完整代码如下:
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 (locationManager
				.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);
	}
}


分享到:
评论
2 楼 gundumw100 2012-11-29  
while(location == null){ 
            locationManager.requestLocationUpdates(provider, 2000, (float) 0.1, locationListener); 
        } 
这样做不是会有一个长时间的假死状态?
1 楼 wenjiefeng 2012-11-05  
楼主,你好,按你的location = locationManager.getLastKnownLocation(provider); 

在onResume里还是执行了 location = locationManager.getLastKnownLocation(provider);  得到的位置还是缓存里的呢,能给我发一个GPS定位,不用缓存的location的例子吗,谢谢了,

我的号是 :  1297234270@qq.com  谢谢

相关推荐

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

    最近在做一个 Android 项目,需要用到GPS获取位置信息,从 API 查了一下,发现获取位置信息仅需极其简单的一句即可: 代码如下:getLastKnownLocation(LocationManager.GPS_PROVIDER),于是高兴地不得了。可是一写进...

    在Android模拟器上模拟GPS功能总是null的解决方法

    首先,尝试通过`LocationManager.getLastKnownLocation("gps")`获取Location对象时,如果返回null,通常是因为模拟器尚未接收到任何GPS数据。一种常见的解决办法是在DDMS(Dalvik Debug Monitor Service)的Emulator...

    Android GPS定位简单 DEMO

    这时的定位方式为GPS,由于GPS定位慢,所以它不可能立即返回你一个Location对象,所以就返回null了。 **3.推荐locationManager.requestLocationUpdates();方法** LocationManager中设定监听位置变化的代码如下: ``...

    phone Message

    Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { double latitude = location.getLatitude(); double longitude = location.getLongitude(); ...

    Android_GPS &当前位置更新

    然而,`getLastKnownLocation`可能返回null,尤其是在GPS信号未初始化或不可用时。为了持续获取位置更新,我们需要实现`LocationListener`接口。下面的代码展示了如何创建自定义的`LocationListener`并请求位置更新...

    Android获取地理位置

    如果设备从未获取过位置或者位置提供者不可用,此方法可能会返回null,这就是`gtLastKnownLocation()`可能出现的问题。 为了解决这个问题,我们可以采用异步加载的方式来获取地理位置,即在后台线程中执行定位操作...

    Android之GPS定位详解.pdf

    * onProviderDisabled(String provider):GPS 禁用时触发,返回 null。 可以通过以下代码创建 LocationListener 对象: ```java private LocationListener locationListener = new LocationListener() { public ...

    GPS 定位信息

    然而,如果这是应用程序第一次运行或者GPS没有开启,`getLastKnownLocation()` 很可能返回 `null`,因为没有历史位置信息可供使用。 为了解决这个问题,开发者需要使用 `requestLocationUpdates()` 方法来启动位置...

    android获取GPS经纬度,并根据经纬度获取准确地址 _andoid 原生开发定位无法获取经纬度,

    - 使用`getLastKnownLocation()`可能返回缓存的旧位置,确保在用户允许的情况下实时获取最新位置。 - 考虑使用 fused location provider(融合定位服务),它能更智能地选择最准确的位置源,包括GPS、Wi-Fi和移动...

    Android GPS定位

    - **LastKnownLocation问题**:`getLastKnownLocation`方法仅能获取最近一次的定位数据,如果从未进行过定位,则返回null。这意味着在首次启动应用时,需要触发一次完整的定位过程。 - **定位标志闪烁**:定位过程...

    GPS断网获取经纬度(含广播方式获取)

    需要注意的是,`getLastKnownLocation`可能返回null,表示GPS未启用或者未获取到有效位置信息,因此需要进行判断处理。 三、广播方式获取GPS信息 为了实现更灵活的定位服务,可以注册一个BroadcastReceiver来监听...

    Android地图和定位学习总结.pdf

    如果两者都不可用,`getLastKnownLocation`可能返回`null`。 为了确保应用可以访问定位服务,需要在AndroidManifest.xml中添加相应的权限声明,例如`...

    android的定位功能的实现

    它有多个方法,例如 addGpsStatusListener,addProximityAlert,getAllProviders,getBestProvider,getLastKnownLocation,getProvider 等。 在设计程序时,可以直接指定使用网络方式或 GPS 方式,也可以设定一些...

    Android 打开GPS导航并获取位置信息.doc

    `getLastKnownLocation()`可能返回`null`,尤其是在首次启动应用时。所以,如果你需要实时的位置更新,应该使用`requestLocationUpdates()`方法,并提供一个`LocationListener`: ```java LocationListener ...

    android调用系统功能

    Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); double latitude = location.getLatitude(); double longitude = location.getLongitude(); ``` 4. **监听来电** ...

    Android发短信、打电话、查询位置

    private void getLastKnownLocation() { fusedLocationClient.getLastLocation() .addOnSuccessListener(this, location -> { if (location != null) { Log.i("8026", "Last known location: " + location....

    Android判断服务是否运行及定位问题实例分析

    本文将深入探讨如何判断Android服务是否正在运行以及如何解决定位问题。 首先,我们来看如何判断一个服务是否正在运行。在Android中,服务是后台运行的组件,它们可以在用户与应用交互时继续执行任务。以下是一个...

    用Android Location获取当前地理位置的方法

    if (loc == null) { loc = locManger.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); } // 返回Location对象 return loc; } ``` 在上述代码中,`getLastKnownLocation(String provider)`方法用于...

Global site tag (gtag.js) - Google Analytics