我正在使用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);
}
我理解错误,我的问题是,设备是否给我这个错误?我怎么能避免这个呢?
答案 0 :(得分:58)
当设备上不存在该提供程序时,您正在请求网络提供程序的更新。您可以替换这两行:
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);
您还使用零时间和最小距离。这非常适合在虚拟设备上进行测试,但请记住在使用真实设备时更改它们,否则电池消耗会很高。
答案 1 :(得分:11)
建议修复此问题的方法是使用新的位置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);
}
如果未启用提供程序,则它不会通过并且不会崩溃
答案 2 :(得分:2)
如果不支持提供程序,则会出现错误,解决此问题的最简单方法是使用条件。
locationManager.requestLocationUpdates(locationManager.(new Criteria(),true), 0, 0, locationListener);
在代码中
标准 - 需要匹配的标准
第二个arg是布尔值:
enabledOnly - 如果为true,则只返回当前启用的提供程序