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.
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"/>
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é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();
}
}
}
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();
}
...
}
Recommended Posts