Pourquoi mon OnLocationChanged() n'obtiennent jamais appelé?
Ce que je suis en train de faire:
Je suis en train de développer une application qui nécessite seulement l'emplacement de l'utilisateur au démarrage d'une activité. De sorte que lorsque l'utilisateur est à l'intérieur de l'activité, l'emplacement est mis à jour que ce soit par réseau ou GPS. En conséquence, l'utilisateur peut choisir une piscine intérieure une carte.
Qu'est-ce que mon problème:
Cependant, je trouve que l'application est toujours à l'aide de l'histoire de l'emplacement, et de ne jamais les mises à jour de l'emplacement. Je présume qu'il doit être quelque chose de mal avec mon
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
Mais je ne sais pas où est le problème.
Liées extrait de code:
Dans mon Activity
, j'ai:
locationDetector = new LocationDetector(MapSelectionActivity.this);
//try to get the current location
if (locationDetector.checkLocationServiceAvailability()) {
location = locationDetector.getLocation();
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
Log.d("MapSelectionActivity", latitude + " " + longitude);
//locationDetector.stopLocalization(); //stop the localization to save the energy
} else { //if no location service, requires the user to turn GPS on
locationDetector.showSettingsAlert();
}
Mon LocationDetector
classe est comme suit:
public final class LocationDetector implements LocationListener {
private final Context mContext;
private boolean isNetworkEnabled = false;
private boolean isGPSEnabled = false;
private boolean canGetLocation = false;
private Location location;
private String providerUsed;
//The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0; //0 meters
//The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = (long) (1000 * 60 * 0.5); //0.5 minute
//Declaring a Location Manager
protected LocationManager locationManager;
//constructor
public LocationDetector(Context context) {
this.mContext = context;
locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
}
//NOTE call checkLocationServiceAvailability(); first before calling this!
public Location getLocation() {
//I SUSPECT SOMETHING IS WRONG HERE
if (isNetworkEnabled) { //use network
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("LocationDetector", "Using Network");
if (locationManager != null) {
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
providerUsed = "Network";
} else if (isGPSEnabled) { //use GPS
if (location == null) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("LocationDetector", "Using GPS");
if (locationManager != null) {
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
}
providerUsed = "GPS";
} else { //neither the network nor the GPS is on
providerUsed = null;
Toast.makeText(mContext, "Location service is unavaliable", Toast.LENGTH_SHORT).show();
}
return location;
}
//call this to restart requesting the detecting
public void startLocalization() {
if (locationManager != null) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
}
}
//call this to stop the detecting to save power
public void stopLocalization() {
if (locationManager != null) {
locationManager.removeUpdates(LocationDetector.this);
}
}
//check location service availability
public boolean checkLocationServiceAvailability() {
//check GPS on or off
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
//check Internet access
ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()) {
isNetworkEnabled = true;
} else {
isNetworkEnabled = false;
}
if (isGPSEnabled || isNetworkEnabled) {
canGetLocation = true;
} else {
canGetLocation = false;
}
return canGetLocation;
}
public String getLocationProvider() {
return providerUsed;
}
//show alert dialog to direct the users to the settings
public void showSettingsAlert() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
//make it uncancellable
alertDialog.setCancelable(false);
//Setting Dialog Title
alertDialog.setTitle("Forgot to turn GPS on?");
//Setting Dialog Message
alertDialog.setMessage("Currently there is no Internet access.\n\nLocalization requires GPS when Internet is unavailiable.\n\nDo you want to enable GPS so as to proceed?");
//On pressing Settings button
alertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(intent);
Toast.makeText(mContext, "After enabling GPS, press the physical 'Back' button to return", Toast.LENGTH_LONG).show();
}
});
//on pressing cancel button
alertDialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
Toast.makeText(mContext, "No location service, please choose map manually", Toast.LENGTH_LONG).show();
}
});
//Showing Alert Message
alertDialog.show();
}
@Override
public void onLocationChanged(Location _location) {
//IT NEVER GETS CALLED
location = _location;
//update the text view
MapSelectionActivity.coordinatesTextView.setText("(" + Math.round(location.getLatitude() * 1000) / 1000.0 + ", " + Math.round(location.getLongitude() * 1000) / 1000.0 + ")");
//update the marker on Google Maps
MapSelectionActivity.googleMap.clear();
MapSelectionActivity.googleMap.addMarker(new MarkerOptions().position(new LatLng(location.getLatitude(), location.getLongitude())).title("I am here!"));
MapSelectionActivity.googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 15)); //15 is the approporiate zooming level
//re-suggest the map
int recommendedMapSequenceNumber = MapSelectionActivity.mapDatabase.getMapSequenceNumber(location.getLatitude(), location.getLongitude());
MapSelectionActivity.recommendedMapTextView.setTextColor(Color.parseColor("red"));
if (recommendedMapSequenceNumber == -1) { //the so-called nearest is still too far
Toast.makeText(mContext, "Please manually select one to proceed", Toast.LENGTH_LONG).show();
MapSelectionActivity.recommendedMapTextView.setText("No recommended maps");
MapSelectionActivity.autoSelectButton.setEnabled(false);
} else { //suggest a map
Toast.makeText(mContext, "One suitable map found", Toast.LENGTH_SHORT).show();
MapSelectionActivity.recommendedMapTextView.setText(MapSelectionActivity.mapDatabase.getMapName(recommendedMapSequenceNumber));
}
Toast.makeText(mContext, "New location detected", Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}
Je ne vois jamais de Toast
dans onLocationChanged()
, ce qui signifie qu'il n'est jamais appelé!
Aussi à partir de la carte, je peux voir la situation n'est pas mis à jour.
(1000 * 60 * 0.5)
ce sera effectivement en 30 secondes, vous avez besoin de le changer pour (1000 * 60 * 5)
pour 5 minutes d'intervalle, Cependant ce n'est pas le véritable problème.Avez-vous donné les autorisations nécessaires dans le Manifeste ?
Ces 5 minutes, je pense sont relatives à la
GPS_PROVIDER
, parce qu'ils sont tout à fait OK pour le NETWORK_PROVIDER
?ok bon, maintenant commenter ce code
if (locationManager != null) { location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); }
et essayer de l'exécution de votre code une fois de plus.Vous avez peut-être l'emplacement rafraîchi par la GPS_PROVIDER, mais puisque vous le donner 30 secondes pour le refresh - il n'est jamais assez, et c'est pourquoi il ne vient pas de l'actualiser. De l'autre côté, vous êtes
getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
, qui n'est jamais actualisée, depuis la préférence fournisseur de GPS - droit?
OriginalL'auteur Sibbs Gambling | 2013-07-23
Vous devez vous connecter pour publier un commentaire.
Puisque cela semble être un problème commun avec l'obtention de Android Endroits, je vais le mettre vers le bas d'une liste de contrôle rapide de solutions courantes:
Vérifier votre manifeste!
L'une des questions les plus courantes que les autorisations de droite n'ont jamais été donnée. Si vous utilisez le GPS (avec ou sans Réseau), l'utilisation
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
, sinon utiliser<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
. Google FusedLocationApi nécessiteACCESS_FINE_LOCATION
.(Pour Android 6+) Vérifier les autorisations d'exécution!
Vérifier et de demander des autorisations! Si vous n'êtes jamais donné les autorisations, vous vous retrouverez avec des plantages, ou pire (si vous attraper toutes les exceptions), vous vous retrouverez avec aucune indication de quoi que ce soit! Il n'a pas d'importance si l'utilisateur vous accorde la permission au début de l'application, toujours vérifier pour voir si vous avez les autorisations pour tous les appels. L'utilisateur peut facilement aller à leurs paramètres et de les révoquer.
Vérifiez votre code!
Êtes-vous sûr que vous êtes de passage dans le bon auditeur? A ajouter que
BroadcastReceiver
ouIntentService
à votre manifeste? Êtes-vous à l'aide dePendingIntent.getService()
sur unBroadcastReceiver
classe, ougetBroadcast()
sur unIntentService
classe? Êtes-vous sûr que vous n'êtes pas l'annulation de l'inscription de votre auditeur quelque part dans votre code immédiatement après la demande?Vérifier les paramètres de l'appareil!
Évidemment, assurez-vous que vous avez activé les services de localisation.
Si vous êtes à utiliser les services de Réseau, avez-vous transformer sur "la Numérisation Toujours Disponible"? Avez-vous votre position en mode "Best" ("Haute Précision") ou "Économie de Batterie" ("Réseau")?
Si vous utilisez le GPS, avez-vous d'activer les "Meilleurs" ("Haute Précision") ou "Appareil uniquement" à l'emplacement de mode?
Vérifiez votre code!
Oui, c'est ici deux fois. Avez-vous essayez d'utiliser un
LocationListener
au lieu d'unPendingIntent
, ou vice-versa, afin de vous assurer effectivement mis en œuvreLocationManager
correctement? Êtes-vous sûr que la demande d'emplacement n'est pas retiré dans une partie de l'Activité ou du cycle de vie des Services que vous ne vous attendiez pas à arriver?Vérifier votre environnement!
Êtes-vous tester le GPS sur le premier étage d'un immeuble dans le centre de San Francisco? Êtes-vous tester les emplacements Réseau dans le milieu de nulle part? Travaillez-vous dans un secret bunker souterrain, vide de tous les signaux radio, vous demandez-vous pourquoi votre appareil n'est pas d'obtenir l'emplacement? Vérifiez toujours si votre entourage pour essayer de résoudre les problèmes de localisation!
Il pourrait y avoir de nombreuses autres raisons moins évidentes pourquoi emplacement n'est pas le travail, mais avant de chercher ces ésotérique de bugs, il suffit d'exécuter à travers cette liste de contrôle rapide.
OriginalL'auteur Pablo Baxter
Ce qui est juste, vous pourriez faire face à un problème matériel. S'il vous plaît installer sur l'appareil l'Application :l'ÉTAT du GPS afin de voir si votre GPS est workin bien!
OriginalL'auteur jeorfevre
locationManager.requestLocationUpdates
(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Pour cette ligne
MIN_DISTANCE_CHANGE_FOR_UPDATES = 0 mètre.
MIN_TIME_BW_UPDATES = 1000 secondes.
Pour en venir à votre question, onLocationChanged() sera appelée si l'emplacement actuel de mise à jour ne correspond pas avec le dernier emplacement connu.
La mise à jour de l'emplacement du être changé pour chaque minTime (dans mon cas, 1000 milli secondes) et également si l'appareil est déplacé minDistance (dans mon cas 0 mètres) de distance.
J'espère que vous le comprendrez.
OriginalL'auteur Hitesh Danidhariya