web-dev-qa-db-fra.com

IllegalArgumentException: le fournisseur n'existe pas: null sur Maps V1

J'utilise l'API Google Maps V1. J'ai cette erreur:

     Java.lang.IllegalArgumentException: provider doesn't exisit: null

Voici mon code:

    locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    String provider = locationManager.getBestProvider(criteria, true);

    if (provider != null)
    {

        startTime = System.currentTimeMillis(); 

        geoLocTimeOutTask = new GeoLocTimeOutTask();
        geoLocTimeOutTask.execute();

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
    }
    else
    {
        geoLocCallbackObj.geoLocationCallback(tagCallback); 

    }

Je comprends l'erreur, mais ma question est: pourquoi l'appareil m'a-t-il mis cette erreur? Et comment puis-je éviter cela s'il vous plaît?

24
user2903095

Vous demandez des mises à jour au fournisseur de réseau lorsque ce fournisseur n'existe pas sur l'appareil. Vous pouvez remplacer ces deux lignes:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

avec

locationManager.requestLocationUpdates(provider, 0, 0, locationListener);

Vous avez déjà fait l'effort de trouver le meilleur fournisseur que l'appareil propose pour vos critères afin que ce soit celui à utiliser.

Alternativement, vérifiez que le fournisseur existe avant de vous inscrire pour les mises à jour de celui-ci:

if (locationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER))
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

if (locationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER))
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

Vous utilisez également zéro pour le temps et la distance minimale. C'est parfait pour tester sur un appareil virtuel, mais n'oubliez pas de les changer lorsque vous utilisez un appareil réel, sinon la décharge de la batterie sera élevée.

61
NigelK

il a été suggéré de résoudre ce problème en utilisant la nouvelle API de localisation au lieu de l'ancienne http://developer.Android.com/google/play-services/location.html

mais vraiment tout ce que vous avez à faire est de vérifier

if(locationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER) && locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
}

si le fournisseur n'est pas activé, il ne passera pas et ne plantera pas

11
tyczj

Lorsque le fournisseur n'est pas pris en charge, vous obtenez une erreur, le moyen le plus simple de résoudre ce problème consiste à utiliser un critère.

locationManager.requestLocationUpdates(locationManager.(new Criteria(),true), 0, 0, locationListener);

Dans le code

critères - les critères qui doivent être mis en correspondance

Le deuxième argument qui est un booléen:

enabledOnly - si true hen, seul un fournisseur actuellement activé est renvoyé

1
Enzokie