[JAVA] Acquisition des informations de localisation à l'aide de FusedLocationProviderClient

Aperçu

Auparavant, LocationManager était couramment utilisé pour obtenir des informations de localisation dans les applications Android, mais GooglePlayServices version 11.6.0 et supérieure prend en charge le FusedLocationProviderClient plus facile à utiliser et plus précis.

exemple

Paramètres d'autorisation

Si vous souhaitez utiliser les informations de localisation dans les applications Android, vous devez ajouter des autorisations au manifeste.

AndroidManifest.xml


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

Créer une classe pour gérer les informations de localisation

Si vous avez besoin de la fonction pour acquérir des informations de localisation à plusieurs endroits dans l'application, il est pratique de créer une classe à usage général afin qu'elle puisse être appelée depuis n'importe quel endroit.

MyLocationManager


import com.google.android.gms.location.*;

public class MyLocationManager extends LocationCallback {
    private static final int LOCATION_REQUEST_CODE = 1;
    private Context context;
    private FusedLocationProviderClient fusedLocationProviderClient;
    private OnLocationResultListener mListener;

    public interface OnLocationResultListener {
        void onLocationResult(LocationResult locationResult);
    }

    public LocationManager(Context context, OnLocationResultListener mListener) {
        this.context = context;
        this.mListener = mListener;
        this.fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(context);
    }

    @Override
    public void onLocationResult(LocationResult locationResult) {
        super.onLocationResult(locationResult);
        mListener.onLocationResult(locationResult);
    }

    public void startLocationUpdates() {
        //Vérification des autorisations
        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            Logger.d("Permission required.");
            ActivityCompat.requestPermissions((Activity) context, new String[]{
                    Manifest.permission.ACCESS_FINE_LOCATION,
            }, LOCATION_REQUEST_CODE);

            return;
        }
        
        //Si le service d'informations de localisation du terminal est désactivé, affichez l'écran de configuration et demandez-lui de l'activer.
        if (!isGPSEnabled()) {
            showLocationSettingDialog();
            return;
        }

        LocationRequest request = new LocationRequest();
        request.setInterval(5000);
        request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        fusedLocationProviderClient.requestLocationUpdates(request, this,null);
    }

    public void stopLocationUpdates() {
        fusedLocationProviderClient.removeLocationUpdates(this);
    }

    private Boolean isGPSEnabled() {
        android.location.LocationManager locationManager = (android.location.LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
        return locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER);
    }

    private void showLocationSettingDialog() {
        new android.app.AlertDialog.Builder(context)
                .setMessage("Veuillez activer le service d'informations de localisation sur l'écran de configuration")
                .setPositiveButton("Réglage", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                        context.startActivity(intent);
                    }
                })
                .setNegativeButton("Annuler", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //NOP
                    }
                })
                .create()
                .show();
    }
}

Définir la classe parent

Définissez une classe abstraite qui implémente MyLocationManager.OnLocationResultListener afin que vous puissiez obtenir des informations d'emplacement avec plusieurs fragments. À ce moment, onResume / onPause gère le démarrage / l'arrêt de l'acquisition des informations de position de sorte que les informations de position ne soient acquises que lorsque Fragment est actif.

BaseFragment


public abstract class BaseFragment extends Fragment 
         implements MyLocationManager.OnLocationResultListener {
    private MyLocationManager locationManager;

    @Override
    public void onResume() {
        super.onResume();

        locationManager = new MyLocationManager(getContext(), this);
        locationManager.startLocationUpdates();
    }

    @Override
    public void onPause() {
        super.onPause();

        if (locationManager != null) {
            locationManager.stopLocationUpdates();
        }
    }
}

Exemple d'utilisation

En héritant du BaseFragment ci-dessus dans le fragment qui souhaite utiliser les informations de localisation, vous pouvez recevoir le rappel lorsque l'acquisition des informations de localisation est réussie dans onLocationResult.

python


public class SomeFragment extends Fragment {
    ...

    @Override
    public void onLocationResult(LocationResult locationResult) {
        if (locationResult == null) {
            Logger.e("# No location data.");
            return;
        }

        //Obtenir la latitude / longitude
        double latitude = locationResult.getLastLocation().getLatitude();
        double longitude = locationResult.getLastLocation().getLongitude();
    }

    ...
}

référence

Recommended Posts

Acquisition des informations de localisation à l'aide de FusedLocationProviderClient
Acquisition du contenu d'entrée à l'aide de Scanner (Java)
Obtenez rapidement des informations de localisation
Exemple d'utilisation de vue.config.js
Résumé sur la sécurité de l'information
Résumé de l'utilisation de FragmentArgs
Résumé de l'utilisation de DBFlow
Obtenir des informations de localisation Android
Exemple de paramètres utilisant where
Résumé de l'utilisation de ButterKnife
Exemple d'utilisation d'une classe abstraite
Limitation de débit à l'aide de RateLimiter of Resilience4j
Suppression des informations Exif à l'aide de sanselan