android - Ice Cream Sandwich 的位置管理器问题

标签 android gps

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

E/AndroidRuntime(891): java.lang.RuntimeException: 无法启动 Activity ComponentInfo{com.example.getaddress/com.example.getaddress.MainActivity}: java.lang.IllegalArgumentException: 请求的提供商网络没有不存在

最佳答案

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

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

症状

基本上是这段代码:

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

会导致以下异常:

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

在所有 Android 4+ 裸模拟器上(与 Google 绑定(bind)的模拟器相对)

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

诊断

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

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

我可以看到网络提供商出现在

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

但不上

  • Android 15 级 (4.0.3) 模拟器,带有 Google APIs
  • android 4.2 模拟器(无 Google API)

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

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

对您的应用的可能影响

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

  • 在一定程度上削弱了你的测试能力
  • 对于使用自定义/非 Google Android 版本(又是 Kindle?)的用户来说是一个兼容性问题

如何检测

一个简单的测试,例如:

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

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

关于android - Ice Cream Sandwich 的位置管理器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11394825/

相关文章:

android - UnitySendMessage 不适用于非统一 Activity

android - 使用 SQLite 和 Android 查找附近的位置

algorithm - map 上许多点之间的距离

android - SettingsApi 已弃用

php - 连接android与php和mysql

android - 有没有一种简单的方法可以在同一个项目中复制 Android Activity

Android Studio - 无法解析符号 FacebookContentProvider

android - Phonegap 构建启动画面

android - 如何找到一个 GPS 点是否位于给定的一组开始和结束 GPS 位置?

iphone - 在 iPhone 上构建 "find nearest"位置感知应用程序的最佳方法是什么?