【问题标题】:Geocoder's isPresent() method always returns falseGeocoder 的 isPresent() 方法总是返回 false
【发布时间】:2012-01-31 06:39:09
【问题描述】:

我写了一个简单的 Activity 来测试 Geocoder 的存在,调用 Geocoder.isPresent() 总是返回 false。

类:

public class LocationTestActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        LocationManager locationManager = (LocationManager)  this.getSystemService(Context.LOCATION_SERVICE);
        Log.d( "LocationTestActivity", "Geocoder.isPresent : " + Geocoder.isPresent() );

    }
}


AndroidManifest.xml 在“application”元素之前也有以下条目:

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>


环境:Eclipse Indigo 3.7.1,XP Professional 2002 SP 3 上的 ICS 4.0 模拟器

请帮助我理解:
1. 为什么 Geocoder.isPresent() 总是返回 false?
2. 为了让 Geocoder.isPresent() 返回 true 需要做哪些更改?

非常感谢!

【问题讨论】:

  • 我什至尝试在我的模拟器中将“Google API”作为目标,但是没有用。
  • 我也尝试在构建路径中包含 maps.jar (\android-sdk\add-ons\addon-google_apis-google_inc_-14\libs),但没有用。
  • 我可以澄清一下。地理编码器“后端”是否存在仍然只取决于用户的设备对吗?也就是说,即使我们针对包含外部地图库的“Google API 插件”进行构建,也不意味着我们的应用程序在发布到市场时会包含“后端”,对吗?所以即使Google APIs addon包含了“后端服务实现”,也不能保证最终用户的设备会?
  • 应用程序 (.apk) 永远不会隐式包含 Geocoder 后端服务实现。不过,您可以明确选择这样做。这就像编写一个 JDBC 类(应用程序的一部分)并部署在不同的环境中。环境必须提供 JDBC 实现,或者您可以选择在应用程序中捆绑 JDBC 实现/jar 文件。因此,即使环境不提供实现,如果您在应用程序中捆绑了 JDBC 实现/jar 文件,您的应用程序仍然可以访问数据库。
  • 我的荣幸。虽然电话正在拨打网络电话,但实际上它是利用网络信号而不是互联网连接。不幸的是,那里的许多示例在 Geocoder 示例中使用 INTERNET 权限。当我的代码不起作用时,我搜索并盲目地遵循示例。后来,当我发现解决方案时,我意识到不需要 INTERNET 权限,正如documentation 明确指出的那样。希望这会有所帮助...

标签: android google-geocoder


【解决方案1】:

其实Geocoder需要框架在后台运行一个Service。

来自文档:

如果没有,Geocoder 查询方法将返回一个空列表 平台中的后端服务。使用 isPresent() 方法 确定是否存在 Geocoder 实现。

所以如果我们查看isPresent() 的文档,它会说明。

如果 Geocoder 方法 getFromLocation 和 getFromLocationName 已实现。缺乏网络连接可能 仍然会导致这些方法返回 null 或空列表。

注意:请记住,isPresent() 在 Pre-Api 9 平台中不可用。

【讨论】:

  • 我同意。所以,如果你看到我的 AndroidManifest.xml sn-p,我使用 API 级别 14。
  • 使用 API 级别 14 并不能保证后台服务正在运行..
  • 很好,我还尝试在构建路径中包含 maps.jar (\android-sdk\add-ons\addon-google_apis-google_inc_-14\libs),但是没有用。那么,我如何使用/启用后端服务,哪一个最好?
  • 实际上,当我遇到这个问题时,我自己做了一个地理编码器,它总是向我返回响应。所以我建议你不要依赖 Geocoder。
【解决方案2】:

使用AsyncTask 使用geocoder 从服务器获取坐标。例如,getFromLocationName() 应使用AsyncTask 调用。 UI线程(主要活动)不允许花费太多时间的任务,因此该方法返回空列表。

【讨论】:

  • 我认为 OP 想知道为什么 Geocoder isPresent 方法返回 false。这不是并发问题,问题是 OP 无法使用 Geocoder 底层服务。
【解决方案3】:

在模拟器或设备中测试此代码?我在 2.2 模拟器上使用 GeoCoder 时遇到了同样的问题。但代码在 2.1 模拟器上运行良好。尝试使用 2.1

并且代码必须在设备上运行良好。

【讨论】:

  • 由于我的 Activity 没有任何功能,模拟器只是在资源中声明的 TextView 中显示带有静态字符串的布局。但是,当我记录一条消息时,LogCat 总是显示为 false。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
相关资源
最近更新 更多