web-dev-qa-db-ja.com

IllegalArgumentException:プロバイダーが存在しない:Maps V1ではnull

Google Maps API V1を使用しています。私はこのエラーがあります:

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

これは私のコードです:

    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); 

    }

私はエラーを理解していますが、私の質問は、デバイスが私にこのエラーを配置したのはなぜですか?そして、どうすればこれを回避できますか?

24
user2903095

ネットワークプロバイダーがデバイスに存在しない場合、そのプロバイダーに更新を要求します。次の2行を置き換えることができます。

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

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

あなたは、デバイスがあなたの基準に提供する最高のプロバイダーを見つける努力にすでに取り組んでいるので、それが使用するものです。

または、プロバイダーの更新を登録する前に、プロバイダーが存在することを確認します。

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);

また、時間と最小距離の両方にゼロを使用しています。これは仮想デバイスでのテストに最適ですが、実際のデバイスを使用する場合は忘れずに変更してください。変更しないと、バッテリーの消耗が大きくなります。

61
NigelK

これを修正することを提案しましたが、古いAPIの代わりに新しいLocation APIを使用することになります http://developer.Android.com/google/play-services/location.html

しかし、実際に行う必要があるのは、チェックを実行することだけです。

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

プロバイダーが有効になっていない場合、それは通過せず、クラッシュしません

11
tyczj

プロバイダーがサポートされていない場合、エラーが発生します。この問題を解決する最も簡単な方法は、基準を使用することです。

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

コードで

基準-一致する必要がある基準

ブール値である2番目の引数:

enabledOnly-trueの場合、現在有効なプロバイダーのみが返されます

1
Enzokie