LocationListener de NETWORK_PROVIDER est activé mais onLocationChanged n’est jamais appelé

Je développe une application qui positionne le téléphone toute la journée en 6 et 6 minutes dans un service, cela fonctionne très bien mais parfois la méthode OnLocationChanged de l’écouteur du fournisseur de réseau cesse d’être appelée, et je ne sais pas pourquoi.

Pour une raison quelconque, ils cessent d’être appelés, mais le fournisseur est activé et le Lister fonctionne, lorsque onProviderEnabled ou désactive le fournisseur manuellement, onProviderEnabled et onProviderDisabled sont appelés.

Cela arrive juste avec NETWORK_PROVIDER , le GPS_PROVIDER fonctionne bien.

Auditeur:

 LocationListener locationListenerGPS = new LocationListener() { // @Override public void onStatusChanged(Ssortingng provider, int status, Bundle extras) { // TODO locationListenerGPS onStatusChanged Log.d(TAG, "Provedor trocado"); } // @Override public void onProviderEnabled(Ssortingng provider) { Log.w(TAG, "PROVEDOR " + provider + " HABILITADO!"); } // @Override public void onProviderDisabled(Ssortingng provider) { Log.w(TAG, "PROVEDOR " + provider + " DESABILITADO!"); } // @Override public void onLocationChanged(Location location) { longitudeGPS = location.getLongitude(); latitudeGPS = location.getLatitude(); Log.d(TAG,"LocationChangedGPS LAT: "+latitudeGPS+" longi: "+longitudeGPS); gpsComSinal = true; } }; LocationListener locationListenerNET = new LocationListener() { // @Override public void onStatusChanged(Ssortingng provider, int status, Bundle extras) { // TODO locationListenerNET onStatusChanged Log.d("Contele", "Provedor foi mudado"); } // @Override public void onProviderEnabled(Ssortingng provider) { Log.i(TAG, "PROVEDOR " + provider + " HABILITADO!"); } // @Override public void onProviderDisabled(Ssortingng provider) { Log.i(TAG, "PROVEDOR " + provider + " DESABILITADO!"); } @Override public void onLocationChanged(Location location) { longitudeNET = location.getLongitude(); latitudeNET = location.getLatitude(); Log.d(TAG,"LocationChangedNET LAT: "+latitudeNET+" longi: "+longitudeNET); netComSinal = true; } }; 

Code:

 public void initProviders() { localizacao = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE); localizacao.removeUpdates(locationListenerNET); localizacao.removeUpdates(locationListenerGPS); localizacao.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGPS); localizacao.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNET); Log.d(TAG,"EsperaGPS"); Handler esperaGPS = new Handler() { public void handleMessage(Message msg) { requestGPS(); } }; Message msgEsperaGPS = Message.obtain(); msgEsperaGPS.what = 0; esperaGPS.sendMessageDelayed(msgEsperaGPS, 35000); } public void requestGPS() { if (gpsComSinal) { Log.d(TAG,"PEGO SINAL DE GPS"); rastreio = "GPS"; longitude = longitudeGPS; latitude = latitudeGPS; Log.d(TAG, "Utilizando provedor GPS."); localizacao.removeUpdates(locationListenerGPS); localizacao.removeUpdates(locationListenerNET); } else { Log.d(TAG,"Sem GPS... pegar NEt"); // Setando os valores para usar network localizacao.removeUpdates(locationListenerGPS); localizacao.removeUpdates(locationListenerNET); localizacao .requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNET); Log.d(TAG,"EsperaNET"); requestNET(); } } public void requestNET() { if (netComSinal) { Log.d(TAG,"PEGO SINAL DE NET"); rastreio = "NET"; longitude = longitudeNET; latitude = latitudeNET; Log.d(TAG, "Utilizando provedor NET."); localizacao.removeUpdates(locationListenerNET); } else { localizacao.removeUpdates(locationListenerGPS); localizacao.removeUpdates(locationListenerNET); Log.d(TAG,"Sem sinal"); } } 

Rapport dans un Samsung Galaxy S3: entrer la description de l'image ici

Je reçois encore “Sem sinal” pendant 4 jours d’affilée.

Ce problème est déjà arrivé avec Galaxy Y et LG Optimus l5

J’ai fait un autre test pour voir si d’autres applications ont obtenu les positions NET, et j’ai découvert qu’elles passent pour le même problème, elles ne peuvent pas obtenir la position NET juste la GetLastknowLocation; pour tester que j’ai utilisé un Galaxy S3 avec ce problème, et j’ai désactivé le fournisseur GPS. (Testé dans Cerberus).

Je n’ai trouvé aucune explication à la raison pour laquelle les auditeurs de NETWORKSLOCATIONS cessent de donner des positions, mais c’est peut-être parce que cela ne devrait pas fonctionner avant 2 ou 3 jours.

J’ai fait des tests avec d’autres applications pour voir si ce problème se produisait avec mon application, et j’ai découvert qu’elles rencontraient le même problème, comme dans Cerberus par exemple:

Je désactiver le fournisseur GPS dans un téléphone portable (Galaxy S3) avec le problème “Sem sinal”, jetez un oeil:

Mon rapport: entrer la description de l'image ici

Et Cerberus (impression prise le 14/05/2013) report: entrer la description de l'image ici

Mais quand j’ai ouvert Google Maps, cela semble fonctionner correctement, j’ai essayé de passer à un endroit éloigné pour voir si cela afficherait le GetLastknowLocation , mais non, Google Maps m’a mis au bon endroit pour le moment, alors j’ai réalisé que Google Maps utilisait motionevent pour me déplacer sur la carte;

Imprimez également le journal de Google Maps pour obtenir NetWorkProvider:

Cas normal:

entrer la description de l'image ici

Cas séminal:

entrer la description de l'image ici

J’ai rencontré des problèmes similaires avec le fournisseur de réseau et seule la solution consistait à redémarrer le périphérique . Bien que google map montrait toujours l’emplacement correct, car il utilise d’autres informations de capteurs également à part du fournisseur de localisation réseau.

Mais voici une bonne nouvelle , il n’y a pas longtemps. Google a introduit des api de Fused Location Provider via son Google Service Service Framework, qui est très facile à utiliser que les fournisseurs de localisation GPS / réseau.

Compatible jusqu’à API Level 8, maintenant, quand je reçois ce problème étrange de fournisseur de réseau, Fused Location me donne en même temps un emplacement précis (sans redémarrage de l’appareil).

J’ai engagé un projet de test FusedLocation de travail ici , vous pouvez cloner et tester vous-même ..

Voici l’extrait de code: –

 package com.example.fusedLoctionTest.service; import android.app.Service; import android.content.Context; import android.content.Intent; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesClient; import com.google.android.gms.location.LocationClient; import com.google.android.gms.location.LocationRequest; public class FusedLocationService extends Service implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener{ private static final LocationRequest REQUEST = LocationRequest.create() .setInterval(0) .setFastestInterval(0) .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); public static final Ssortingng LOCATION_RECEIVED = "fused.location.received"; private Long now; private LocationClient mLocationClient; private final Object locking = new Object(); private Runnable onFusedLocationProviderTimeout; private Handler handler = new Handler(); @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); now = Long.valueOf(System.currentTimeMillis()); mLocationClient = new LocationClient(this, this, this); mLocationClient.connect(); return START_STICKY; } @Override public void onConnected(Bundle bundle) { Log.d("FusedLocationService", "Fused Location Provider got connected successfully"); mLocationClient.requestLocationUpdates(REQUEST,this); onFusedLocationProviderTimeout = new Runnable() { public void run() { Log.d("FusedLocationService", "location Timeout"); Location lastbestStaleLocation=getLastBestStaleLocation(); sendLocationUsingBroadCast(lastbestStaleLocation); if(lastbestStaleLocation!=null) Log.d("FusedLocationService", "Last best location returned ["+lastbestStaleLocation.getLatitude()+","+lastbestStaleLocation.getLongitude()+"] in "+(Long.valueOf(System.currentTimeMillis())-now)+" ms"); if(mLocationClient.isConnected()) mLocationClient.disconnect(); } }; handler.postDelayed(onFusedLocationProviderTimeout, 20000);//20 sec } private void sendLocationUsingBroadCast(Location location) { Intent locationBroadcast = new Intent(FusedLocationService.LOCATION_RECEIVED); locationBroadcast.putExtra("LOCATION", location); locationBroadcast.putExtra("TIME", Long.valueOf(System.currentTimeMillis()-now) +" ms"); LocalBroadcastManager.getInstance(this).sendBroadcast(locationBroadcast); stopSelf(); } @Override public void onDisconnected() { Log.d("FusedLocationService","Fused Location Provider got disconnected successfully"); stopSelf(); } @Override public void onLocationChanged(Location location) { synchronized (locking){ Log.d("FusedLocationService", "Location received successfully ["+location.getLatitude()+","+location.getLongitude()+"] in "+(Long.valueOf(System.currentTimeMillis()-now))+" ms"); handler.removeCallbacks(onFusedLocationProviderTimeout); if(mLocationClient.isConnected()) mLocationClient.removeLocationUpdates(this); sendLocationUsingBroadCast(location); if(mLocationClient.isConnected()) mLocationClient.disconnect(); } } @Override public void onConnectionFailed(ConnectionResult connectionResult) { Log.d("FusedLocationService", "Error connecting to Fused Location Provider"); } public Location getLastBestStaleLocation() { Location bestResult = null; LocationManager locMgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Location lastFusedLocation=mLocationClient.getLastLocation(); Location gpsLocation = locMgr.getLastKnownLocation(LocationManager.GPS_PROVIDER); Location networkLocation = locMgr.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (gpsLocation != null && networkLocation != null) { if (gpsLocation.getTime() > networkLocation.getTime()) bestResult = gpsLocation; } else if (gpsLocation != null) { bestResult = gpsLocation; } else if (networkLocation != null) { bestResult = networkLocation; } //take Fused Location in to consideration while checking for last stale location if (bestResult != null && lastFusedLocation != null) { if (bestResult.getTime() < lastFusedLocation.getTime()) bestResult = lastFusedLocation; } return bestResult; } @Override public IBinder onBind(Intent intent) { return null; } } 

J’ai exactement le même problème et la seule solution pour moi est de redémarrer l’appareil. Ce qui est intéressant, c’est qu’aucune des applications ne dispose d’informations de localisation à l’exception des cartes Google.
Google Maps app trouve en quelque sorte un emplacement! ..

PS en utilisant un LocationListener en service, donc ce n’est certainement pas un problème de mauvaise référence, object mort et ainsi de suite.

J’ai encore ce problème. Mais je suis toujours à la recherche d’une réponse, j’ai essayé de l’implémenter dans l’auditeur de NETWORK_PROVIDER:

 public void onStatusChanged(final Ssortingng provider, final int status, final Bundle extras) { switch( status ) { case LocationProvider.AVAILABLE: // ... break; case LocationProvider.OUT_OF_SERVICE: // ... break; case LocationProvider.TEMPORARILY_UNAVAILABLE: // ... break; } } 

Parce que: OUT_OF_SERVICE si le fournisseur est hors service, et que cela ne devrait pas changer dans un avenir proche; TEMPORARILY_UNAVAILABLE si le fournisseur est temporairement indisponible mais devrait être disponible sous peu; et DISPONIBLE si le fournisseur est actuellement disponible. onStatusChanged

Et je pensais que OUT_OF_SERVICE était mon problème, et il n’y a pas de solution à ce jour, juste redémarrer le périphérique, puis j’ai essayé de faire des rapports quand cela se produisait et lorsque cela se produirait, je demanderais à l’utilisateur ce statut

Semble un bogue ouvert, problème de fournisseur de réseau signalé sur le projet Open Source Android, Issue Tracker: https://code.google.com/p/android/issues/detail?id=57707 . En bref: problème rapporté le 17 juillet 2013 – dernier blog Le 7 janvier 2015, le problème est apparu sur Android 4.1.x, apparaît dans une grande variété d’appareils, “Non résolu dans la dernière bibliothèque du service Play”, aucune solution de contournement suggérée dans Blog.

Je comprends quelque chose dans notre question; vous appelez la méthode requestGPS et ensuite découvrez son emplacement.Si gps activé, obtenu via gps. Autre option: gott via NET. Lorsque vous appelez requestGPS et que le fournisseur de contrôle que lat-lang mais supprimez les mises à jour (ne pas appeler car vous avez supprimé sortinggger sortinggger);

 if (gpsComSinal) { Log.d(TAG,"PEGO SINAL DE GPS"); rastreio = "GPS"; longitude = longitudeGPS; latitude = latitudeGPS; Log.d(TAG, "Utilizando provedor GPS."); // if you remove update don't call onLocationChanged localizacao.removeUpdates(locationListenerGPS); localizacao.removeUpdates(locationListenerNET); } else { Log.d(TAG,"Sem GPS... pegar NEt"); // Setando os valores para usar network localizacao.removeUpdates(locationListenerGPS); localizacao.removeUpdates(locationListenerNET); localizacao.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNET); Log.d(TAG,"EsperaNET"); requestNET(); } 

NETWORK_PROVIDER ne se met pas à jour lorsque le GPS du téléphone fonctionne et reçoit un signal. Si vous éteignez le GPS et que vous forcez le téléphone à trouver son emplacement sur le réseau, vous recommencerez à recevoir des mises à jour.

Je pense que c’est parce que votre application est “tuée” en arrière-plan. J’ai déjà rencontré ce problème et je l’ai résolu en déplaçant la création du LocationListener dans un service. Assurez-vous de garder une référence à l’auditeur. Cela pourrait simplement résoudre le problème.