【问题标题】:Geocoder returns an address with zero length地理编码器返回一个长度为零的地址
【发布时间】:2017-12-25 18:16:39
【问题描述】:

直到今天,Geocoder 工作正常。它开始返回长度为 0 的字符串。 注意:这不是 Geocoder 线程的副本,我在启动线程之前使用了意图服务和 AsyncTask 来获取它(并且 AsyncTask 方法在 8 个月内运行良好),使用 FusedLocationProviderClient 从 Google 检查了this code 和新的code(这是官方代码)它还返回长度为零的字符串。来自Android官方页面的This link显示了如何使用意图服务获取它。

我在 Android 5.1 上获得完整地址,但在 Android 7.1 上它返回长度为零的地址。

我以前使用的代码,直到今天都运行良好。

private void getAddressFromCoordinates() {

    new AsyncTask<Void, String, Void>() {

        @Override
        protected Void doInBackground(Void... params) {

            try {
                addresses.clear();
                addresses.addAll(geocoder.getFromLocation(mCurrentLocation.getLatitude(),
                        mCurrentLocation.getLongitude(), 1));


            } catch (IOException e) {
                e.printStackTrace();
                showToastAsync(getString(R.string.activity_loc_no_location_info));
            } catch (IllegalArgumentException illegalArgumentException) {
                // Catch invalid latitude or longitude values.
                showToastAsync("Invalid latitude or longitude values");
            }

            // Handle case where no address was found.
            if (addresses == null || addresses.size() == 0) {
                showToastAsync(getString(R.string.activity_loc_no_address_is_found));
            } else {
                Address address = addresses.get(0);
                ArrayList<String> addressFragments = new ArrayList<String>();
                for (int i = 0; i < address.getMaxAddressLineIndex(); i++) {
                    addressFragments.add(address.getAddressLine(i));
                }

                addressInfo = TextUtils.join(System.getProperty("line.separator"), addressFragments);
                addressSingleLine = LocationActivity.addressInfo.replaceAll("[\r\n]+", " ");
            }
            return null;
        }

    }.execute();
}

答案是在 for 循环中添加 = 以在 Android 7 上不检索长度为零的地址。您不需要在某些版本上执行此操作。此外,Google 引用的 Github 页面上的代码也缺少 =。这就是为什么我无法找到原因。

【问题讨论】:

    标签: android android-location


    【解决方案1】:

    问题出在这一行:

    for (int i = 0; i

    必须是:for (int i = 0; i 因为 getMaxAddressLineIndex 返回最大的索引。

    【讨论】:

    • 是的,=是应该添加的,但如果Android版本不是7,它就可以工作。这很有趣。如果版本不是 Anroid 7,谁能解释为什么它可以工作?
    • 是的,有效。他们的 API 发生了多么奇怪的变化。
    【解决方案2】:

    我刚刚在我的代码中注意到了完全相同的问题。正如您在 documentation 中看到的,显然这是 API 的变化。现在getMaxAddressLineIndex():

    返回当前用于指定地址行的最大索引。如果没有指定地址行,则返回 -1。

    所以您需要按照@DavidBar 的建议更改for 循环的条件

    【讨论】:

    • 是的,我今天看了,添加 = 到 foo 循环是缺少的。有趣的是它可以在没有等号的 Android 5 和 6 上运行。我真的很想知道为什么它不能在某些 Android 版本上运行而在其他版本上运行。
    猜你喜欢
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多