这段时间,定位的头个难题就是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);
}
}
分享到:
相关推荐
最近在做一个 Android 项目,需要用到GPS获取位置信息,从 API 查了一下,发现获取位置信息仅需极其简单的一句即可: 代码如下:getLastKnownLocation(LocationManager.GPS_PROVIDER),于是高兴地不得了。可是一写进...
首先,尝试通过`LocationManager.getLastKnownLocation("gps")`获取Location对象时,如果返回null,通常是因为模拟器尚未接收到任何GPS数据。一种常见的解决办法是在DDMS(Dalvik Debug Monitor Service)的Emulator...
这时的定位方式为GPS,由于GPS定位慢,所以它不可能立即返回你一个Location对象,所以就返回null了。 **3.推荐locationManager.requestLocationUpdates();方法** LocationManager中设定监听位置变化的代码如下: ``...
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { double latitude = location.getLatitude(); double longitude = location.getLongitude(); ...
然而,`getLastKnownLocation`可能返回null,尤其是在GPS信号未初始化或不可用时。为了持续获取位置更新,我们需要实现`LocationListener`接口。下面的代码展示了如何创建自定义的`LocationListener`并请求位置更新...
如果设备从未获取过位置或者位置提供者不可用,此方法可能会返回null,这就是`gtLastKnownLocation()`可能出现的问题。 为了解决这个问题,我们可以采用异步加载的方式来获取地理位置,即在后台线程中执行定位操作...
* onProviderDisabled(String provider):GPS 禁用时触发,返回 null。 可以通过以下代码创建 LocationListener 对象: ```java private LocationListener locationListener = new LocationListener() { public ...
然而,如果这是应用程序第一次运行或者GPS没有开启,`getLastKnownLocation()` 很可能返回 `null`,因为没有历史位置信息可供使用。 为了解决这个问题,开发者需要使用 `requestLocationUpdates()` 方法来启动位置...
- 使用`getLastKnownLocation()`可能返回缓存的旧位置,确保在用户允许的情况下实时获取最新位置。 - 考虑使用 fused location provider(融合定位服务),它能更智能地选择最准确的位置源,包括GPS、Wi-Fi和移动...
- **LastKnownLocation问题**:`getLastKnownLocation`方法仅能获取最近一次的定位数据,如果从未进行过定位,则返回null。这意味着在首次启动应用时,需要触发一次完整的定位过程。 - **定位标志闪烁**:定位过程...
需要注意的是,`getLastKnownLocation`可能返回null,表示GPS未启用或者未获取到有效位置信息,因此需要进行判断处理。 三、广播方式获取GPS信息 为了实现更灵活的定位服务,可以注册一个BroadcastReceiver来监听...
如果两者都不可用,`getLastKnownLocation`可能返回`null`。 为了确保应用可以访问定位服务,需要在AndroidManifest.xml中添加相应的权限声明,例如`...
它有多个方法,例如 addGpsStatusListener,addProximityAlert,getAllProviders,getBestProvider,getLastKnownLocation,getProvider 等。 在设计程序时,可以直接指定使用网络方式或 GPS 方式,也可以设定一些...
`getLastKnownLocation()`可能返回`null`,尤其是在首次启动应用时。所以,如果你需要实时的位置更新,应该使用`requestLocationUpdates()`方法,并提供一个`LocationListener`: ```java LocationListener ...
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); double latitude = location.getLatitude(); double longitude = location.getLongitude(); ``` 4. **监听来电** ...
private void getLastKnownLocation() { fusedLocationClient.getLastLocation() .addOnSuccessListener(this, location -> { if (location != null) { Log.i("8026", "Last known location: " + location....
本文将深入探讨如何判断Android服务是否正在运行以及如何解决定位问题。 首先,我们来看如何判断一个服务是否正在运行。在Android中,服务是后台运行的组件,它们可以在用户与应用交互时继续执行任务。以下是一个...
if (loc == null) { loc = locManger.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); } // 返回Location对象 return loc; } ``` 在上述代码中,`getLastKnownLocation(String provider)`方法用于...