Maison > Java > javaDidacticiel > le corps du texte

Android ouvre la navigation GPS, obtient des informations de localisation et renvoie une solution nulle

高洛峰
Libérer: 2017-01-07 14:47:21
original
1940 Les gens l'ont consulté

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),
Copier après la connexion

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);
Copier après la connexion

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);
Copier après la connexion

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)
Copier après la connexion

 : 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());
                }
            }
Copier après la connexion

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);
Copier après la connexion

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>
Copier après la connexion
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();
     }
Copier après la connexion

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 !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!