4

最近将 Google API 版本从 11.8.0 升级到 12.0.1 导致task.result.release()我的完成侦听器Task<AutocompletePredictionBufferResponse>被标记为内部。

我应该以不同的方式处理内部数据泄露的可能性吗?Google Places API 现在是否自行处理发布结果?我在12.0.0 或 12.0.1 的发行说明中找不到有关此的信息。当前的文档仍然说您必须发布结果

这是我使用它的地方:

.addOnCompleteListener { task: Task<AutocompletePredictionBufferResponse> ->
    if (task.isSuccessful) {

        {...}

        //Release to avoid internal data leak
        task.result.release()
    } else {
        Log.e("AutoCompletePredictions", task.exception?.message)

        //Release to avoid internal data leak
        task.result.release()
    }
}
.addOnFailureListener(this@NewLocationActivity) {
    Log.e("AutoCompletePredictions", it.message)
}

这是我收到的错误消息:

zzb.release 被标记为内部,不应从应用程序访问少... (⌘F1) 此 API 已被标记为具有尚未满足的限制。API 限制示例: * 方法只能由子类调用 * 方法只能从同一个库中访问(由 Gradle 库组 ID 定义)。* 方法只能从测试中访问。. 您可以使用 @RestrictTo 注释添加自己的 API 限制。

我使用完成侦听器的完整getSuggestions()方法

private fun getSuggestions() {
    val filter = AutocompleteFilter.Builder()
        .setTypeFilter(AutocompleteFilter.TYPE_FILTER_ADDRESS)
        .setCountry(CountryManager.getCountryISO())
        .build()

    Places.getGeoDataClient(this@NewLocationActivity/*, null*/) // uncomment for v11.8.0
        .getAutocompletePredictions(
            activity_new_location_edit_text.text.toString(),
            null,
            filter
        )
        .addOnCompleteListener { task: Task<AutocompletePredictionBufferResponse> ->
            if (task.isSuccessful) {
                val addressList: ArrayList<String> = arrayListOf()

                var index = 0
                for(item in task.result) {
                    if(index >= MAX_SUGGESTION_RESULTS)
                        break

                    addressList.add(item.getFullText(null).toString())
                    index++
                }

                if(!(addressList.size == 1 && addressList[0] == activity_new_location_edit_text.text.toString()))
                    loadGoogleAddressesIntoSuggestionList(addressList)

                //Release to avoid internal data leak
                task.result.release()
            } else {
                Log.e("AutoCompletePredictions", task.exception?.message)

                //Release to avoid internal data leak
                task.result.release()
            }
        }
        .addOnFailureListener(this@NewLocationActivity) {
            Log.e("AutoCompletePredictions", it.message)
        }
}
4

1 回答 1

4

似乎是一个意想不到的变化。

它始于 12.0.0,在其发行说明中有以下“已知问题” :

注释会导致虚假的 lint 错误声明GoogleSignIn,并且 CredentialsClient仅限于内部。这些可以安全地忽略。

猜猜它们不仅适用于GoogleSignInand CredentialsClient,而且只修复了12.0.1中的那些:

修复了导致虚假 Android lint 错误声明 GoogleSignInCredentialsClient仅限内部的问题。

的相应源代码release()在 11.8.0-12.0.1 版本之间似乎是相同的,所以我相信您可以放心地忽略这些警告。

于 2018-04-11T11:33:06.473 回答