Je travaillais récemment sur un projet Android et j'avais besoin d'utiliser le GPS pour obtenir des informations de localisation. Après avoir vérifié l'API, j'ai découvert que l'obtention d'informations de localisation ne nécessite qu'une phrase extrêmement simple :
getLastKnownLocation(LocationManager.GPS_PROVIDER),
Alors je l'ai fait. était très heureux. Mais dès que je l'ai écrit dans le code, la valeur de retour (type d'emplacement) était toujours nulle... ce qui était très frustrant. Après avoir longuement cherché sur Internet, j'ai découvert que de nombreuses personnes, comme moi, sont aux prises avec ce problème. Certaines personnes disent que c'est parce que le GPS n'est pas activé, et d'autres disent que c'est parce que les autorisations pertinentes ne sont pas ajoutées. Mais le mien a évidemment été activé dans les paramètres, et les autorisations sont également ajoutées naturellement. Après avoir longtemps lutté avec l'API, j'ai finalement découvert la raison. Il s'avère que l'activation du GPS dépend en fait de cette phrase :
setTestProviderEnabled("gps",true);
et cela n'a rien à voir avec les paramètres du GPS. téléphone (du moins c'est ce que j'ai testé sur mon téléphone). Même si les paramètres du téléphone sont désactivés, cette phrase peut toujours être activée et même si les paramètres du téléphone sont activés, elle est inutile sans cette ligne ; Correspondant à cette phrase est
setTestProviderEnabled("gps",false);
utilisé pour éteindre le GPS
Puis-je utiliser la méthode ci-dessus pour obtenir la localisation après l'activation du GPS ? Ce n'est toujours pas possible ! Pour être précis, c'est parfois possible, car cette fonction obtient les informations de position obtenues la dernière fois. Imaginez que si ce programme est exécuté pour la première fois, les informations de position n'ont pas été obtenues auparavant, et bien sûr la valeur de retour sera nulle. . Après avoir soigneusement vérifié l'API, j'ai trouvé cette phrase dans
requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener)
: La réception de la localisation la plus récente peut prendre un certain temps. Si une localisation immédiate est requise, les applications peuvent utiliser la méthode getLastKnownLocation(String) . Par conséquent, afin d'obtenir des informations de localisation, vous devez utiliser cette méthode pour définir un écouteur pour le gestionnaire et l'obtenir dans onLocationChanged(Location location) dans l'écouteur.
Le code de test est le suivant :
public void onLocationChanged(Location location) { Log.i("onLocationChanged", "come in"); if (location != null) { Log.w("Location","Current altitude = "+ location.getAltitude()); Log.w("Location","Current latitude = "+ location.getLatitude()); } }
Après le test, la Localisation peut être obtenue après un certain temps (le temps d'acquisition est lié à minTime et minDistance). Un autre problème qui mérite votre attention est qu'après avoir configuré l'écouteur, vous ne pouvez pas utiliser la méthode ci-dessus pour désactiver le GPS avant de supprimer l'écouteur, sinon une erreur sera signalée. Par conséquent, la méthode pour désactiver le GPS est
manager.removeUpdates (listener);//listener 即为监听器实例 manager.setTestProviderEnabled("gps",false);
Ce qui suit est le code de test, les autorisations requises sont :
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"></uses-permission> <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"></uses-permission>
import android.app.Activity; import android.content.Context; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; public class audio extends Activity { /** Called when the activity is first created. */ LocationManager locationManager; LocationListener llistener; String provider; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); String serviceName = Context.LOCATION_SERVICE; locationManager = (LocationManager) getSystemService(serviceName); locationManager.setTestProviderEnabled("gps", true); provider = locationManager.getBestProvider(criteria, true); Log.d("provider", provider); llistener = new LocationListener() { @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub Log.i("onLocationChanged", "come in"); if (location != null) { Log.w("Location", "Current altitude = " + location.getAltitude()); Log.w("Location", "Current latitude = " + location.getLatitude()); } locationManager.removeUpdates(this); locationManager.setTestProviderEnabled(provider, false); } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub Log.i("onProviderDisabled", "come in"); } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub Log.i("onProviderEnabled", "come in"); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub Log.i("onStatusChanged", "come in"); } }; locationManager.requestLocationUpdates(provider, 1000, (float) 1000.0, llistener); } protected void onDestroy() { locationManager.removeUpdates(llistener); locationManager.setTestProviderEnabled(provider, false); super.onDestroy(); }
Plus Ouvrir la navigation GPS sur plusieurs Androids et obtenir des informations de localisation renvoie une solution nulle Pour les articles connexes, veuillez faire attention au site Web PHP chinois !