надеюсь, все в порядке и здоровы. Если вы разработчик для Android и имеете опыт работы с местоположением на карте Google, прочитайте мой вопрос, и если вы что-нибудь знаете, он будет признателен.
Вопрос. Есть ли способ получения обновлений местоположения в фоновом режиме, даже если приложение свернуто и служба все еще работает в фоновом режиме и получает обновления местоположения.
PS: служба получает обновления местоположения, когда приложение находится на переднем плане.
Внезапно перестает получать обновления местоположения, когда приложение свернуто.
Я искал и проверял несколько ответов, прежде чем отправлять
вопрос.
Вот код. Чего мне не хватает в коде?
public class LocationService extends Service {
public static final String LOCATION_SERVICE = "binarysole.c.distancetrackingapp.LocationService";
Intent i = new Intent(LOCATION_SERVICE);
private FusedLocationProviderClient mFusedLocationClient;
private LocationCallback mLocationCallback;
private LocationRequest mLocationRequest;
public IBinder onBind(Intent intent) {
return null;
}
public void onCreate() {
super.onCreate();
}
public int onStartCommand(Intent intent, int flags, int startId) {
init();
Log.e("LocationService","onStartCommand");
return START_STICKY;
}
public void onDestroy() {
removeLocationUpdate();
Log.e("LocationService", "OnDestroy()");
ActivityStackManager.getInstance().stopLocationService(this);
super.onDestroy();
}
private void init() {
this.mFusedLocationClient = LocationServices.getFusedLocationProviderClient((Context) this);
this.mLocationCallback = new LocationCallback() {
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
LocationService.this.onNewLocation(locationResult.getLastLocation());
}
};
setLocationInterval();
getLastLocation();
requestLocationUpdates();
}
private void getLastLocation() {
try {
if (ActivityCompat.checkSelfPermission(this, "android.permission.ACCESS_FINE_LOCATION") == 0) {
this.mFusedLocationClient.getLastLocation().addOnCompleteListener(new OnCompleteListener<Location>() {
public void onComplete(@NonNull Task<Location> task) {
if (!task.isSuccessful() || task.getResult() == null) {
Log.e("Location", " getLastLocation() Error");
return;
}
LocationService.this.onNewLocation((Location) task.getResult());
Log.e("Location", " getLastLocation() Success");
}
});
}
} catch (SecurityException e) {
StringBuilder sb = new StringBuilder();
sb.append("Lost location permission.");
sb.append(e);
Log.e("Location", sb.toString());
}
}
public void onNewLocation(Location location) {
if (location != null) {
// AppPreferences.saveLocation(new LatLng(location.getLatitude(), location.getLongitude()));
i.putExtra("latitude",location.getLatitude());
i.putExtra("longtitude",location.getLongitude());
sendBroadcast(i);
StringBuilder sb = new StringBuilder();
sb.append(location.getLatitude());
sb.append(",");
sb.append(location.getLongitude());
sb.append(" (");
sb.append(Utils.getUTCDate(location.getTime()));
sb.append(")");
Log.e("Location", sb.toString());
StringBuilder sb2 = new StringBuilder();
sb2.append("accuracy = ");
sb2.append(location.getAccuracy());
Log.e("LocationService", sb2.toString());
StringBuilder sb3 = new StringBuilder();
sb3.append("timeDifference = ");
sb3.append(System.currentTimeMillis() - location.getTime());
Log.e("LocationService", sb3.toString());
if (location.getAccuracy() <= 50.0f && System.currentTimeMillis() - location.getTime() <= 180000) {
// ActivityStackManager.getInstance().stopLocationService(this);
Log.e("LocationService", "stopLocationUpdates()");
}
}
}
public void setLocationInterval() {
this.mLocationRequest = LocationRequest.create();
this.mLocationRequest.setInterval((long) 1000);
this.mLocationRequest.setFastestInterval((long) 1000);
this.mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
Log.e("LocationInterval","setLocationInterval");
}
public void requestLocationUpdates() {
if (ActivityCompat.checkSelfPermission(this, "android.permission.ACCESS_FINE_LOCATION") == 0) {
this.mFusedLocationClient.requestLocationUpdates(this.mLocationRequest, this.mLocationCallback, null);
Log.e("LocationInterval","requestLocationUpdates");
}
}
public void removeLocationUpdate() {
try {
this.mFusedLocationClient.removeLocationUpdates(this.mLocationCallback);
} catch (Exception unused) {
}
}
}