Intereting Posts
Как правильно обращаться с ошибками при использовании HTTP-клиента в Котлине? Невозможно ссылаться на методы сопутствующих объектов Kotlin \ Java – Строка типа "$ 1" на номер Любой способ унаследовать один и тот же общий интерфейс дважды (с отдельными типами) в Котлин? Почему неразрешенная ссылка на попытку доступа к постоянным значениям? изменять внешний класс через анонимный внутренний объект в котлине Android Studio не скомпилирует изменения до второго компиляции с Kotlin Несогласованность получения данных из базы данных Firebase с тем же классом данных Нет аргументов типа, ожидаемых для fun findViewById (p0: Int): View Невозможно подтвердить приостановленный блок, переданный для forEach Проверка наличия пустых строк в Котлине Android, тест Espresso не может работать с записью активности на Kotlin Проблема с kotlin для Android Kotlin: Оператор '==' не может применяться к 'kotlin.Int' и 'Person?' ошибка Kapt + LoganSquare не работает должным образом при сопоставлении

API автозаполнения Google Places дает ошибку API_NOT_CONNECTED в конфигурации Instant Apps

Я пытаюсь добавить API автозаполнения Google Адресов в свой проект Android Instant Apps.

Я выполнил этот образец, чтобы реализовать API.

Класс My PlacesAdapter :

 package net.epictimes.uvindex.autocomplete import android.content.Context import android.graphics.Typeface import android.text.style.StyleSpan import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.Filter import android.widget.Filterable import android.widget.TextView import com.google.android.gms.common.data.DataBufferUtils import com.google.android.gms.location.places.AutocompletePrediction import com.google.android.gms.location.places.GeoDataClient import com.google.android.gms.maps.model.LatLng import com.google.android.gms.maps.model.LatLngBounds import com.google.android.gms.tasks.RuntimeExecutionException import com.google.android.gms.tasks.Tasks import timber.log.Timber import java.util.concurrent.ExecutionException import java.util.concurrent.TimeUnit import java.util.concurrent.TimeoutException class PlacesAdapter(context: Context, private val geoDataClient: GeoDataClient) : ArrayAdapter<AutocompletePrediction>(context, android.R.layout.simple_expandable_list_item_2, android.R.id.text1), Filterable { private val resultList = mutableListOf<AutocompletePrediction>() private val styleBold = StyleSpan(Typeface.BOLD) override fun getCount(): Int = resultList.size override fun getItem(position: Int): AutocompletePrediction = resultList[position] override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val row = super.getView(position, convertView, parent) // Sets the primary and secondary text for a row. // Note that getPrimaryText() and getSecondaryText() return a CharSequence that may contain // styling based on the given CharacterStyle. val item = getItem(position) val textView1 = row.findViewById<View>(android.R.id.text1) as TextView val textView2 = row.findViewById<View>(android.R.id.text2) as TextView textView1.text = item.getPrimaryText(styleBold) textView2.text = item.getSecondaryText(styleBold) return row } override fun getFilter(): Filter { return object : Filter() { override fun performFiltering(constraint: CharSequence?): FilterResults { val results = FilterResults() // We need a separate list to store the results, since // this is run asynchronously. var filterData: ArrayList<AutocompletePrediction>? = ArrayList() // Skip the autocomplete query if no constraints are given. if (constraint != null) { // Query the autocomplete API for the (constraint) search string. filterData = getAutocomplete(constraint) } results.values = filterData if (filterData != null) { results.count = filterData.size } else { results.count = 0 } return results } override fun publishResults(constraint: CharSequence?, results: FilterResults?) { if (results != null && results.count > 0) { // The API returned at least one result, update the data. resultList.clear() resultList.addAll(results.values as ArrayList<AutocompletePrediction>) } notifyDataSetChanged() } } } /** * Submits an autocomplete query to the Places Geo Data Autocomplete API. * Results are returned as frozen AutocompletePrediction objects, ready to be cached. * Returns an empty list if no results were found. * Returns null if the API client is not available or the query did not complete * successfully. * This method MUST be called off the main UI thread, as it will block until data is returned * from the API, which may include a network request. * * @param constraint Autocomplete query string * @return Results from the autocomplete API or null if the query was not successful. * @see GeoDataClient.getAutocompletePredictions * @see AutocompletePrediction.freeze */ private fun getAutocomplete(constraint: CharSequence): ArrayList<AutocompletePrediction>? { Timber.d("Starting autocomplete query for: " + constraint) val latLngBounds = LatLngBounds(LatLng(-34.041458, 150.790100), LatLng(-33.682247, 151.383362)) // Submit the query to the autocomplete API and retrieve a PendingResult that will // contain the results when the query completes. val results = geoDataClient.getAutocompletePredictions(constraint.toString(), latLngBounds, null) // This method should have been called off the main UI thread. Block and wait for at most // 60s for a result from the API. try { Tasks.await(results, 60, TimeUnit.SECONDS) } catch (e: ExecutionException) { Timber.e(e) } catch (e: InterruptedException) { Timber.e(e) } catch (e: TimeoutException) { Timber.e(e) } Timber.d("Query completed. Received " + results.result.count + " predictions.") return try { // Freeze the results immutable representation that can be stored safely. DataBufferUtils.freezeAndClose<AutocompletePrediction, AutocompletePrediction>(results.result) } catch (e: RuntimeExecutionException) { // If the query did not complete successfully return null Timber.e("Error getting autocomplete prediction API call", e) null } } } 

Когда я запускаю проект в конфигурации app он работает нормально .

Но когда я запускаю его в конфигурации instantapp он бросает это:

 D/PlacesAdapter: Starting autocomplete query for: is E/GmsClient: unable to connect to service: com.google.android.gms.location.places.GeoDataApi on com.google.android.gms E/PlacesAdapter: java.util.concurrent.ExecutionException: com.google.android.gms.common.api.ApiException: 17: API_NOT_CONNECTED at com.google.android.gms.tasks.Tasks.zzc(Unknown Source:17) at com.google.android.gms.tasks.Tasks.await(Unknown Source:53) at net.epictimes.uvindex.autocomplete.PlacesAdapter.getAutocomplete(PlacesAdapter.kt:116) at net.epictimes.uvindex.autocomplete.PlacesAdapter.access$getAutocomplete(PlacesAdapter.kt:25) at net.epictimes.uvindex.autocomplete.PlacesAdapter$getFilter$1.performFiltering(PlacesAdapter.kt:64) at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.os.HandlerThread.run(HandlerThread.java:65) Caused by: com.google.android.gms.common.api.ApiException: 17: API_NOT_CONNECTED at com.google.android.gms.common.internal.zzb.zzz(Unknown Source:14) at com.google.android.gms.common.internal.zzbk.zzaa(Unknown Source:0) at com.google.android.gms.common.internal.zzbl.zzs(Unknown Source:32) at com.google.android.gms.common.api.internal.zzs.zzc(Unknown Source:46) at com.google.android.gms.common.api.internal.zzs.setResult(Unknown Source:42) at com.google.android.gms.common.api.internal.zzm.zzv(Unknown Source:17) at com.google.android.gms.common.api.internal.zzc.zzt(Unknown Source:2) at com.google.android.gms.common.api.internal.zzbr.zzx(Unknown Source:27) at com.google.android.gms.common.api.internal.zzbp.handleMessage(Unknown Source:386) at android.os.Handler.dispatchMessage(Handler.java:101) at android.os.Looper.loop(Looper.java:164) at android.os.HandlerThread.run(HandlerThread.java:65) W/Filter: An exception occured during performFiltering()! com.google.android.gms.tasks.RuntimeExecutionException: com.google.android.gms.common.api.ApiException: 17: API_NOT_CONNECTED at com.google.android.gms.tasks.zzn.getResult(Unknown Source:14) at net.epictimes.uvindex.autocomplete.PlacesAdapter.getAutocomplete(PlacesAdapter.kt:123) at net.epictimes.uvindex.autocomplete.PlacesAdapter.access$getAutocomplete(PlacesAdapter.kt:25) at net.epictimes.uvindex.autocomplete.PlacesAdapter$getFilter$1.performFiltering(PlacesAdapter.kt:64) at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.os.HandlerThread.run(HandlerThread.java:65) Caused by: com.google.android.gms.common.api.ApiException: 17: API_NOT_CONNECTED at com.google.android.gms.common.internal.zzb.zzz(Unknown Source:14) at com.google.android.gms.common.internal.zzbk.zzaa(Unknown Source:0) at com.google.android.gms.common.internal.zzbl.zzs(Unknown Source:32) at com.google.android.gms.common.api.internal.zzs.zzc(Unknown Source:46) at com.google.android.gms.common.api.internal.zzs.setResult(Unknown Source:42) at com.google.android.gms.common.api.internal.zzm.zzv(Unknown Source:17) at com.google.android.gms.common.api.internal.zzc.zzt(Unknown Source:2) at com.google.android.gms.common.api.internal.zzbr.zzx(Unknown Source:27) at com.google.android.gms.common.api.internal.zzbp.handleMessage(Unknown Source:386) at android.os.Handler.dispatchMessage(Handler.java:101) at android.os.Looper.loop(Looper.java:164) at android.os.HandlerThread.run(HandlerThread.java:65) 

API_NOT_CONNECTED код ошибки в документах :

Клиент попытался вызвать метод из API, который не смог подключиться. Возможные причины:

  • API ранее не смог соединиться с разрешаемой ошибкой, но пользователь отказался от разрешения.
  • Устройство не поддерживает GmsCore.
  • Конкретный API не может подключиться к этому устройству.

Я обновил Службы Google Play на эмуляторе (это 11.7.46 (470-175121617) BTW), но он не изменил никакого значения.

Я включил зависимости в Google Play Services в base модуль. Я проверил объединенные файлы манифеста, все они имеют ключи API Google Play.

На сайте разработчиков Android они указали API Google Адресов в списке поддерживаемых API.

Я использую API Google Location в другом функциональном модуле, и он работает как в конфигурациях app и в instantapp .

Так что я делаю неправильно здесь?

Я решил подключить API с помощью GoogleApiClient:

 GoogleApiClient.Builder(this) .enableAutoManage(this, this) .addApi(Places.GEO_DATA_API) .build() .connect() 

Но попытка подключения не выполнена с кодом состояния API_UNAVAILABLE в конфигурации API_UNAVAILABLE .

В документах API_UNAVAILABLE означает, что API недоступен для Instant Apps:

При отладке мгновенного приложения, использующего библиотеку служб Google Play, отличную от тех, которые включены в список выше, вы можете увидеть ошибку API_UNAVAILABLE в своем отладочном выходе. Ошибка API_UNAVAILABLE указывает, что библиотека не была адаптирована для использования в Android Instant Apps.

Поэтому я сбросил автозаполнение Places и продолжил с чем-то похожим на геокодирование .