- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 LocationService,它启动 MainActivity 的 onResume()
并停止 onDestroy()
。
@Override
protected void onResume() {
super.onResume();
//Start the service using alaram manager
//If its not running currently
if (isLocationServiceRunning(this)) {
am = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent intent = new Intent(this, LocationService.class);
pi = PendingIntent.getService(this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
am.cancel(pi);
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(), 1 * 60 * 1000, pi);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (isLocationServiceRunning(this)) {
stopService(new Intent(this, LocationService.class));
if (am != null && pi != null) {
am.cancel(pi);
}
}
}
LocationService.java
public class LocationService extends Service implements LocationListener {
public static double curLat = 0.0;
public static double curLng = 0.0;
private LocationManager mgr;
private String best;
private Location location;
private Location currentBestLocation;
private static final int TWO_MINUTES = 1000 * 60 * 2;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mgr = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean gps_enabled = mgr
.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (gps_enabled) {
// If GPS is enabled, set criteria as ACCURACY_FINE
// and get the best provider(which usually will be GPS_PROVIDER)
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
best = mgr.getBestProvider(criteria, true);
// getLastKnownLocation so that user don't need to wait
location = mgr.getLastKnownLocation(best);
if (location == null) {
// request for a single update, and try again.
// Later will request for updates every 10 mins
mgr.requestSingleUpdate(criteria, this, null);
location = mgr
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
if (location != null) {
// If the GPS gives a location, update curLat and curLng
dumpLocation(location);
} else {
// If the location is still null, go for NETWORK_PROVIDER
best = LocationManager.NETWORK_PROVIDER;
location = mgr.getLastKnownLocation(best);
if (location != null) {
// If the NETWORK gives a location, update curLat and curLng
dumpLocation(location);
}
}
// Register the Location Manager for updates, with both the
// providers
// Since GPS updates are expensive, we ask update every 10 mins and
// unregister updates if GPS is disabled in onProviderDisabled
// callback
mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,
10 * 60 * 1000, 50, this);
// NETWORK_PROVIDER updates every 20 secs
mgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
20 * 1000, 0, this);
return START_NOT_STICKY;
} else {
// If GPS is disables, go with NETWORK_PROVIDER
best = LocationManager.NETWORK_PROVIDER;
location = mgr.getLastKnownLocation(best);
if (location != null) {
dumpLocation(location);
}
// Register NETWORK_PROVIDER for updates every 20 secs
mgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
20 * 1000, 0, this);
return START_NOT_STICKY;
}
}
private void dumpLocation(Location l) {
// Called to update the curLat and curLng.
currentBestLocation = l;
SimpleDateFormat s = new SimpleDateFormat("dd/MM/yyyy:hh:mm:ss",
Locale.ENGLISH);
String format = s.format(l.getTime());
try {
Geocoder coder = new Geocoder(this);
List<Address> address;
Address location = null;
address = coder.getFromLocation(l.getLatitude(), l.getLongitude(),
1);
location = address.get(0);
} catch (Exception e) {
Log.e("Exception while getting address", e.getMessage() + "");
}
curLat = l.getLatitude();
curLng = l.getLongitude();
}
@Override
public void onLocationChanged(Location location) {
// called when location is changed, since we registered Location
// Providers
// for updates
if (isBetterLocation(location, currentBestLocation)) {
dumpLocation(location);
} else {
Log.d("Not a Better Location", "Ignore");
}
}
@Override
public void onProviderDisabled(String provider) {
// Check if best(the currently being used provider) is not null
if (best != null) {
// if best and disabled provider are same, the remove updates
if ((provider.equalsIgnoreCase(LocationManager.GPS_PROVIDER) && best
.equals(LocationManager.GPS_PROVIDER))
|| provider
.equalsIgnoreCase(LocationManager.NETWORK_PROVIDER)
&& best.equals(LocationManager.NETWORK_PROVIDER)) {
if (mgr != null) {
mgr.removeUpdates(this);
}
}
}
}
@Override
public void onProviderEnabled(String provider) {
// This will be taken care in the onStartCommand where if gps_enabled
// case is used.
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// No need to care about, because any thing like OUT_OF_SERVICE occurs,
// location being fetched will be null and such cases are handled above.
if ((provider.equals(LocationManager.GPS_PROVIDER))
&& (LocationProvider.OUT_OF_SERVICE == status)) {
if (mgr != null) {
mgr.removeUpdates(this);
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
// triggered when we call stopService(LocationService);
// which is done in onDestroy of MainActivity
// Because LocationService must be stopped
// when application is closed to avoid data usage
if (mgr != null) {
mgr.removeUpdates(this);
}
}
protected boolean isBetterLocation(Location location,
Location currentBestLocation) {
if (currentBestLocation == null) {
// A new location is always better than no location
return true;
}
// Check whether the new location fix is newer or older
long timeDelta = location.getTime() - currentBestLocation.getTime();
boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
boolean isNewer = timeDelta > 0;
// If it's been more than two minutes since the current location, use
// the new location
// because the user has likely moved
if (isSignificantlyNewer) {
return true;
// If the new location is more than two minutes older, it must be
// worse
} else if (isSignificantlyOlder) {
return false;
}
// Check whether the new location fix is more or less accurate
int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation
.getAccuracy());
boolean isLessAccurate = accuracyDelta > 0;
boolean isMoreAccurate = accuracyDelta < 0;
boolean isSignificantlyLessAccurate = accuracyDelta > 200;
// Check if the old and new location are from the same provider
boolean isFromSameProvider = isSameProvider(location.getProvider(),
currentBestLocation.getProvider());
// Not significantly newer or older, so check for Accuracy
if (isMoreAccurate) {
// If more accurate return true
return true;
} else if (isNewer && !isLessAccurate) {
// Same accuracy but newer, return true
return true;
} else if (isNewer && !isSignificantlyLessAccurate
&& isFromSameProvider) {
// Accuracy is less (not much though) but is new, so if from same
// provider return true
return true;
}
return false;
}
// Checks whether two providers are the same
private boolean isSameProvider(String provider1, String provider2) {
if (provider1 == null) {
return provider2 == null;
}
return provider1.equals(provider2);
}
}
服务确实按预期启动和停止,我可以在日志中看到位置详细信息,这很好。
问题是当我移动到一个完全不同的位置(300 英里)时,当我打开申请。
是不是因为我在设备运动时没有运行服务(因为我的应用程序没有运行)?
因为当我打开 FourSquare 等其他应用程序(获取正确的位置)然后重新打开我的应用程序时,它会显示正确的位置。
我还应该做些什么才能正确刷新位置。
最佳答案
我认为你的问题出在这里
best = mgr.getBestProvider(criteria, true);
// getLastKnownLocation so that user don't need to wait
location = mgr.getLastKnownLocation(best);
if (location == null) {
// request for a single update, and try again.
// Later will request for updates every 10 mins
mgr.requestSingleUpdate(criteria, this, null);
location = mgr
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
因为之前有一个位置 location = mgr.getLastKnownLocation(best);
返回那个位置没有启动提供者(参见 the android documentation 。所以位置不是null 和 mgr.requestSingleUpdate(criteria, this, null);
永远不会运行。
要获取最新的位置数据,必须启动提供程序。
所以更正可能是:
best = mgr.getBestProvider(criteria, true);
// getLastKnownLocation so that user don't need to wait
mgr.requestSingleUpdate(best, this, null);
location = mgr.getLastKnownLocation(best);
此外,我不确定它是否有意,但即使 GPS 数据可用且更准确(由于为 GPS 更新和数据过时选择了 10 分钟和 2 分钟时间),此服务仍将使用网络提供商。
附言您是否有特定原因不想使用作为 Google Play 服务一部分的 FusedLocationProvider?我发现它更简单,并且据说针对选定的最佳供应商进行了优化并节省了电量。
关于android - 无法从 LocationListener 获取当前位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19946219/
我终于找到了一个获取用户 GPS 位置的应用程序,但我找到了实现 LocationListener 的应用程序。它工作正常,但我需要在不实现它的情况下执行它,因为我必须创建一个不实现方法的类。 我搜索
出现以下错误 Error:(197, 28) error: no suitable method found for requestLocationUpdates (String,long,fl
我想问一下这两个库中的 onLocaticonChange 方法。我可以从 android.location.LocationListener 捕获位置,但是当我决定使用 google.android
这是我获取经度和纬度的源代码,但是我如何在Location Listener中实现语句,我是新手,我真的需要帮助,请提供帮助,谢谢。 public class Location extends App
我正在尝试使用 LocationManager 和 LocationListener 获取用户的当前位置。但没有获得任何值(value)。 下面是我在 Java 中使用的代码: // activi
我有一个获取用户位置的应用程序。我已经在 oncreate() 中注册了 locationManager 和 listener。我已分别请求并删除了 onResume() 和 onPause()
我正在开发一个 Android 应用程序 (minSDK=8),这个应用程序有一张 map ,上面绘制了用户的当前位置。昨天,我正在修复一些路线制定的错误,一切都很好。然后,我不知道我做了什么,但设备
我已经注册了一个位置监听器,它将使用NETWORK_PROVIDER 接收位置更新。如果 activity 在前台,监听器会收到位置更新。如果我离开应用程序,一段时间后它会停止接收位置更新。这有点奇怪
我有以下代码可以从 NETWORK_PROVIDER 和 GPS_PROVIDER 请求位置更新。 locManager.requestLocationUpdates(LocationManager.
我想每 10 秒向远程服务器发送一些数据和坐标。我想,最好的匹配是 public void onCreate( Bundle savedInstanceState ) { //snip loc
我正在尝试使用 LocationListener 获取我的 GPS 速度。 我在第一次启动应用程序时请求许可,然后授予许可并且“onLocationChanged()”立即显示 toast ,但不会再
我写了这段代码,但是 MyLocationListener 类不起作用。当我像“找我”这样的短信时,代码必须给我大概的位置,但它什么也没做。这里有什么问题吗? public class SMSRece
我有以下代码使用 GPS 获取用户位置。(代码工作正常) 但我的问题是,当我关闭程序(按后退按钮)时,它会生成错误消息 应用程序......已停止工作............请重试。 . 我认为我必须
我正在尝试调试我的应用程序,但出于某种原因,当我开始获取当前位置时,我从未收到 LocationListener 的更新...我已在 list 中添加了正确的权限。这是我用来测试是否至少调用了一个回调
我正在尝试让位置更新在后台服务中运行。该服务正在运行自己的工作线程,它已经在做很多其他事情,比如套接字通信。我希望它也能处理位置更新,但这似乎只适用于一项 Activity 。据我所知,这是由于工作线
我目前正在使用计时器来确定位置监听器是否已超时?问题是 gps 仍然打开。我不知道为什么,是否有一种方法可以在 locationlistener 超时时重写或更优雅的方法? 最佳答案 考虑向您的位置管
根据sample app找到用户位置最好在 Activity 中监听位置变化: class MyActivity extends Activity implements LocationListene
我需要在我的整个应用程序中实现一个 LocationListener。 我知道我可以将服务与 LocationListener 一起使用,但问题是我必须在位置更改时使用一些通知程序。当我能够随时获得最
我在 eclipse for android 中使用 loactionListener 时遇到问题。我已经用谷歌搜索了一段时间,但我似乎不明白为什么这不起作用。我唯一能想到的是,也许是因为我的测试设备
我有一个使用 LocationListener 的服务,它将无限期地从启动运行。我的问题是,监听位置更新的频率有多高? 5分钟是电池 killer 吗? 1 呢? 最佳答案 是的,5 分钟是电池 ki
我是一名优秀的程序员,十分优秀!