Geocoder returns 一个零长度的地址

Geocoder returns an address with zero length

Geocoder 直到今天都运行良好。它开始 return 长度为 0 的字符串。 注意:这不是 Geocoder 线程的副本,我在启动线程之前使用了意图服务和 AsyncTask 来获取它(并且 AsyncTask 方法在 8 个月内工作正常),从官方 Android 页面检查 this code and new code from Google with FusedLocationProviderClient(this is offical code) it also returns string with zero length.This link展示了如何通过 Intent 服务获取它。

我在 Android 5.1 上获得完整地址,但在 Android 7.1 上它 return 是一个长度为零的地址。

直到今天我一直在使用并且工作正常的代码。

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 页面上的代码也丢失 =。这就是我找不到原因的原因。

问题出在这一行:

for (int i = 0; i < address.getMaxAddressLineIndex(); i++)

必须是:for (int i = 0; i <= address.getMaxAddressLineIndex(); i++) 因为getMaxAddressLineIndex returns 最大的index.

我刚才注意到我的代码中存在完全相同的问题。正如您在 documentation 中看到的那样,显然这是 API 中的一个更改。现在 getMaxAddressLineIndex():

Returns the largest index currently in use to specify an address line. If no address lines are specified, -1 is returned.

所以你需要按照@DavidBar

的建议改变你的for循环的条件