Geocoder返回零长度的地址

时间:2017-07-20 07:27:32

标签: android android-location

Geocoder工作正常,直到今天。它开始返回0长度的String。 注意:这不是Geocoder线程的副本,我在启动线程之前使用了intent服务和AsyncTask来获取它(并且AsyncTask方法在8个月内正常工作),检查了this code和新的code谷歌使用FusedLocationProviderClient(这是官方代码)它还返回零长度的字符串。来自官方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 =添加到for循环,以便不在Android 7上检索长度为零的地址。您不需要在某些版本上执行此操作。此外,Google引用的Github网页上的代码缺少 = 。这就是为什么我无法找到原因的原因。

2 个答案:

答案 0 :(得分:8)

问题在于这一行:

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

必须是: for(int i = 0; i&lt; = address.getMaxAddressLineIndex(); i ++) 因为getMaxAddressLineIndex返回最大的索引。

答案 1 :(得分:1)

我刚刚在我的代码中注意到了完全相同的问题。显然,这是API中的更改,您可以在documentation中看到。现在getMaxAddressLineIndex()

  

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

所以你需要按@DavidBar

的建议更改for循环的条件