我有一个每分钟运行的服务,并且应该不断跟踪位置。该服务实现了LocationListener。我觉得我没有正确理解这一点,因为我实际上并没有使用LocationListener方法: onLocationChanged onProviderEnabled onProviderDisabled 等
我的课程中有这些方法但我实际上并没有对它们做任何事情。我所做的就是每次运行我的服务时都会根据可用的GPS和网络提供商调用LocationManager.getLastKnownLocation。
这就是我的代码:
服务每分钟运行一次:
Intent i = new Intent(context, GPSTracker.class);
PendingIntent pi = PendingIntent.getService(context, 0, i, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if(isOn) {
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), POLL_INTERVAL, pi);
} else {
alarmManager.cancel(pi);
pi.cancel();
}
我处理意图:
protected void onHandleIntent(Intent intent) {
Log.i(TAG, "In onHandleIntent!");
Location currentLocation = getLocation(this);
if(currentLocation == null) {
saveLocation(-8.0, -8.0, "nothing", "nothing", "nothing");
} else {
Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(this, Locale.getDefault());
try {
addresses = geocoder.getFromLocation(latitude, longitude, 1);
String city = addresses.get(0).getLocality();
String country = addresses.get(0).getCountryCode();
String state = addresses.get(0).getAdminArea();
saveLocation(currentLocation.getLatitude(), currentLocation.getLongitude(), city, state, country);
} catch (IOException e) {
e.printStackTrace();
}
}
}
getLocation()可以完成真正的工作:
public Location getLocation(Context context) {
try {
locationManager = (LocationManager) context
.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
this.canGetLocation = true;
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled) {
if (location == null) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
但有些事似乎并不合适。首先,就像我说的那样,我不使用任何LocationListener方法,而且它似乎也不是很准确。当我在坐在电脑桌前的手机上进行测试时,每次都能看到它。然而,今天我在工作时曾经在手机上运行,而另一次我在街上行走时,这些地方的位置距离他们两英里。奇怪的是,它为这两个地方提供了完全相同的错误位置。这些都是网络提供商,因为我没有使用GPS。
我做错了什么,如果我没有做错任何事,我怎样才能让它更准确?
答案 0 :(得分:0)
getLastKnownLocation()将提供最后的已知位置(不是当前位置)。如果设备已关闭并移动到其他位置,则位置可能已过期。
您需要使用LocationClient来使用Google定位服务获取当前位置。它易于集成。您需要为LocationClient创建一个实例并进行连接。建立连接时有回调方法。一旦连接,您可以从mLocationClient.getLastLocation()中检索当前位置(返回当前可用的最新位置)。
点击此链接https://developer.android.com/training/location/retrieve-current.html
答案 1 :(得分:0)
由于您的关注是要获得更准确的结果,那么您应该使用GPS。您只需添加GPS启用按钮即可要求用户打开GPS。
gpsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
isGpsON = true;
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
});
您没有使用任何LocationListener,但我认为您应该使用它来进行位置更新
@Override
public void onProviderEnabled(String provider) {
getLocation(this);
}