J'essaie de faire en sorte qu'une application fournisse des mises à jour de localisation pendant que l'application est en arrière-plan. Lorsque l'application est ouverte, le service fonctionne correctement. Lorsque l'application est en arrière-plan, le service continue de s'exécuter mais les mises à jour de localisation s'arrêtent. J'ai essayé d'utiliser un service de premier plan mais cela n'a pas aidé.

J'utilise fusedLocationProviderClient de google

public int onStartCommand(Intent intent, int flags, int startId) {
      client.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper());
}

Avec une demande de localisation définie dans onCreate()

locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(500);
locationRequest.setFastestInterval(500);

Et le rappel défini comme :

private final LocationCallback locationCallback = new LocationCallback() {
    @Override
    public void onLocationResult(LocationResult locationResult) {
        List<Location> locationList = locationResult.getLocations();
        if (locationList.size() != 0) {
            Location location = locationList.get(0);
            Log.e("AppLocationService", "Latitude  - " +location.getLatitude()+", longitude  - " +location.getLongitude() );
        }
    }

Je suis vraiment nouveau sur Android Studio, donc toute aide est très appréciée !

MISE À JOUR:

Service démarré via startService()

public class BackgroundService2 extends Service {
private FusedLocationProviderClient client;
private LocationRequest locationRequest;

@Override
public void onCreate() {
    super.onCreate();
    client = LocationServices.getFusedLocationProviderClient(this);
    locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(500);
    locationRequest.setFastestInterval(500);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent,flags,startId);
    try {
        if ( Build.VERSION.SDK_INT >= 23 &&
                ContextCompat.checkSelfPermission( getBaseContext(), android.Manifest.permission.ACCESS_FINE_LOCATION ) == PackageManager.PERMISSION_GRANTED &&
                ContextCompat.checkSelfPermission( getBaseContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            client.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper());
        }

    } catch (SecurityException ignore) {
        Log.e("AppLocationService", "SecurityException - " + ignore.toString(), ignore);
    }
    return START_STICKY;
}


private final LocationCallback locationCallback = new LocationCallback() {
    @Override
    public void onLocationResult(LocationResult locationResult) {
        List<Location> locationList = locationResult.getLocations();
        if (locationList.size() != 0) {
            Location location = locationList.get(0);
            Log.e("AppLocationService", "Latitude  - " +location.getLatitude()+", longitude  - " +location.getLongitude() );
        }
    }

};


@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    return null;
}

}

1
YellowBranch23 16 sept. 2020 à 15:36

1 réponse

Meilleure réponse

Il s'avère que c'était un problème avec mon manifeste. Il faut non seulement déclarer le service, mais aussi son type.

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

Aussi bien que

<service
        android:name=".BackgroundService"
        android:enabled="true"
        android:exported="true"
        android:foregroundServiceType="location" />
0
YellowBranch23 16 sept. 2020 à 18:39