Android getMaxAddressLineIndex returns 第 1 行为 0

Android getMaxAddressLineIndex returns 0 for line 1

出于某种原因,getMaxAddressLineIndex 的实现最近发生了变化。现在此方法 returns 0 用于第 1 行。

我有一个可用的现有代码:i<address.getMaxAddressLineIndex()。但是,它以某种方式被破坏了。

不知道是因为新的Google Api还是别的原因。

有人可以在这里向我确认发生了什么事吗?

我也遇到过同样的情况。 我验证了开发者参考 (https://developer.android.com/reference/android/location/Address.html#getMaxAddressLineIndex()) 现在指出:

int getMaxAddressLineIndex ()

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

所以它似乎反映了新的行为。

无论如何,为了安全起见,我将 getAddressLine(i) 包含在 try\catch

我遇到了同样的问题,这只是一个解决方法。

if (address.getMaxAddressLineIndex() > 0) {
    for (int i = 0; i < address.getMaxAddressLineIndex(); i++) {
        addressFragments.add(address.getAddressLine(i));
    }
} else {
    try {
        addressFragments.add(address.getAddressLine(0));
    } catch (Exception ignored) {}
}

希望对您有所帮助

我认为 getAddressLine() 已经改变了。它曾经在对 ...getAddressLine(0)...getAddressLine(1) 等的单独调用中 return 地址的各个元素,直到 getAddressLine(n) 其中 n...getMaxAddressLineIndex().

现在似乎 return 整个地址连接并以逗号分隔进入对 ...getAddressLine(0) 的调用,并且 ...getMaxAddressLineIndex() 始终 return 为零(如果地址是 returned,如果没有地址 returned,则为 -1)。

例如,在旧版本中,伦敦议会大厦的 lat/long 将 return(对于第一个地址 returned)4 个地址行:

addressLines=[0:"9748 Abingdon Street",1:"Westminster, London",2:"SW1P 3JY",3:"UK"]

现在 return 一行:

addressLines=[0:"9748 Abingdon St, Westminster, London SW1P 3JY, UK"]

我好像就是这样。我已经在 Moto G5 PlusAndroid 7Samsung 上试过了Android 6 的平板电脑。我的 Android 模拟器仍然以旧方式工作。有人告诉我我是否理解错了!

注意:过去您可以测试 i < address.getMaxAddressLineIndex() 而不是 <= 。这只是意味着你没有得到最后一个元素,它似乎总是缩写的国家名称(例如 "USA")。现在 .getMaxAddressLineIndex() 似乎总是 return 零,那是行不通的。但请注意,您将 "USA" 附加到字符串 returned to .getAddressLine(0).

正如 user8533943 上面指出的那样,实施已被秘密更改。但是我认为

geocoder.getFromLocation()

已更改其实现。它 return 是一个地址列表,每个地址都由地址行组成。 但据我所知,当我使用 SDK 版本 26 进行编译时,没有 "address lines" 被 returned,而是每个地址只有一行。

因此,如果您只有一个地址,那么

getMaxAddressLineIndex()

实际上 return 0

按如下方式更新您的实施以使用 <= 比较。

for(int i = 0; i <= address.getMaxAddressLineIndex(); i++) {
                addressFragments.add(address.getAddressLine(i));