10

谁能解释一下这个错误是什么?我只为 android 4 + 而不是以下:

E/AndroidRuntime(891): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.getaddress/com.example.getaddress.MainActivity}: java.lang.IllegalArgumentException: requested provider network doesn't exisit

4

1 回答 1

24

在没有 Google API的 Android 4+ 模拟器中似乎无法访问 NETWORK_PROVIDER 位置提供程序(实际上我还没有对它们进行测试,见下文)。我测试过的真实设备都可以使用它(但它们都有谷歌服务,用定制的、干净的 Android 版本进行测试会很有趣,也许用 Kindles?)。

这不是在设备设置中启用/禁用提供程序的问题,它根本不存在于模拟器中。

症状

基本上这段代码:

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,mLocListener);

将导致以下异常:

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

在所有 Android 4+ 裸模拟器上(与谷歌绑定的模拟器相反)

注意:“exisit”中的错字在实际的日志行中。

诊断

使用以下内容获取目标设备上所有位置提供程序的列表:

List<String> providers = locationManager.getAllProviders();

我可以看到网络提供商在

  • 物理设备
  • android 2.3.3 模拟器(无 Google API)
  • android 级别 17 (4.2) 模拟器(使用 Google API)

但不上

  • 带有 Google API 的 android 级别 15 (4.0.3) 模拟器
  • android 4.2 模拟器(无 Google API)

我的猜测是,出于非技术原因,Google 不允许在 AOSP 中使用网络定位服务,并将其使用限制在 4.2(?)之后的 Google 绑定版本的操作系统中。

我不知道在非谷歌设备(如 Kindle)上是否有替代网络位置服务。

可能对您的应用产生影响

我不认为这会对大多数智能手机和平板电脑产生任何影响。不过可以

  • 有点损害你的测试能力
  • 对于使用自定义/非 Google 版本的 Android 的用户来说是一个兼容性问题(又是 Kindle?)

如何检测

一个简单的测试,例如:

locationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER)

可以轻松地告诉您设备上是否存在网络提供商。请注意,如果它存在,但用户尚未激活它,您的 LocationListener 将在位置请求之后收到onProviderDisabled回调。

于 2012-12-13T00:57:16.270 回答