web-dev-qa-db-fra.com

API Google Places pour Android Erreur: Status {statusCode = NETWORK_ERROR, resolution = null}

J'ai créé un projet dans la console de développement Google et je souhaitais utiliser l'API Google Adresses pour Android. J'ai activé l'API et intégré à mon application Android conformément aux instructions du site Web des développeurs Google ( https://developers.google.com/places/Android/start ). L'API donne cette erreur et après des heures (et des jours) de débogage et de recherche sur Internet, je ne pouvais pas circonscrire le problème. Toute piste serait appréciée sur la raison pour laquelle cette erreur est à venir. 

Erreur: Status{statusCode=NETWORK_ERROR, resolution=null}

Ce qui suit est la fonction de l'exemple de code google où Places Auto Complet est appelé.

private ArrayList<PlaceAutocomplete> getAutocomplete(CharSequence constraint) {
    if (mGoogleApiClient != null) {
        Log.i(TAG, "Starting autocomplete query for: " + constraint);

        // Submit the query to the autocomplete API and retrieve a PendingResult that will
        // contain the results when the query completes.
        PendingResult<AutocompletePredictionBuffer> results =
                Places.GeoDataApi
                        .getAutocompletePredictions(mGoogleApiClient, constraint.toString(),
                                mBounds, mPlaceFilter);

        // This method should have been called off the main UI thread. Block and wait for at most 60s
        // for a result from the API.
        AutocompletePredictionBuffer autocompletePredictions = results
                .await(60, TimeUnit.SECONDS);

        // Confirm that the query completed successfully, otherwise return null
        final Status status = autocompletePredictions.getStatus();
        if (!status.isSuccess()) {
            Toast.makeText(getContext(), "Error contacting API: " + status.toString(),
                    Toast.LENGTH_SHORT).show();
            Log.e(TAG, "Error getting autocomplete prediction API call: " + status.toString());
            autocompletePredictions.release();
            return null;
        }

        Log.i(TAG, "Query completed. Received " + autocompletePredictions.getCount()
                + " predictions.");

        // Copy the results into our own data structure, because we can't hold onto the buffer.
        // AutocompletePrediction objects encapsulate the API response (place ID and description).

        Iterator<AutocompletePrediction> iterator = autocompletePredictions.iterator();
        ArrayList resultList = new ArrayList<>(autocompletePredictions.getCount());
        while (iterator.hasNext()) {
            AutocompletePrediction prediction = iterator.next();
            // Get the details of this prediction and copy it into a new PlaceAutocomplete object.
            resultList.add(new PlaceAutocomplete(prediction.getPlaceId(),
                    prediction.getDescription()));
        }

        // Release the buffer now that all data has been copied.
        autocompletePredictions.release();

        return resultList;
    }
    Log.e(TAG, "Google API client is not connected for autocomplete query.");
    return null;
}

Autorisations AndroidManifiest.xml

<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
<uses-permission Android:name="com.google.Android.providers.gsf.permission.READ_GSERVICES"/>
<uses-feature Android:glEsVersion="0x00020000" Android:required="true"/>
8
Sharief Shaik

Vous pouvez mettre null à la place de la propriété AutocompleteFilter dans la méthode getAutocompletePredictions si vous souhaitez obtenir des prédictions de tous types.

3
Eldar Miensutov

Himanshu a raison; ça m'arrive aussi je voulais filtrer par villes et ajouté:

AutocompleteFilter.create(Arrays.asList(
    Place.TYPE_LOCALITY, Place.TYPE_ADMINISTRATIVE_AREA_LEVEL_3));

ce résultat dans Status {statusCode = NETWORK_ERROR, resolution = null} 

Toutes les constantes de Place ne sont pas disponibles pour le filtrage avec AutocompleteFilter, seules deux sont disponibles sur Android: Place.TYPE_GEOCODE et Place.TYPE_ESTABLISHMENT ('adresse' apparaît dans la documentation mais n'est pas constant dans Place)

Lisez attentivement ici: https://developers.google.com/places/supported_types#table3

Si une autre constante (par exemple, Place.TYPE_LOCALITY) est utilisée, la demande entraînera une erreur d'état source de confusion.

7
ciprian
Please ensure the folowing.

1. The package name given in console registration page is same as that of actvity/fragment we are using. ie; if are using this auto search button inside com.example.rajeesh.UI.fragements.SearchFragment, 
then inside console registration page  package name should be 
com.example.rajeesh.UI.fragements
This is different from the package name we given in manifest file.

2. Inside manifest please  change 
  <meta-data
                Android:name="com.google.Android.maps.v2.API_KEY"
                Android:value="@string/google_maps_api_key" />
to

      <meta-data
                Android:name="com.google.Android.geo.API_KEY"
                Android:value="@string/google_maps_api_key" />


3. Enable Google Places API for Android in console page.
4
rajeesh

Pour moi, j'avais donné meta tag pour Map et Geo .

<meta-data
        Android:name="com.google.Android.geo.API_KEY"
        Android:value="*********************"/>
<meta-data
        Android:name="com.google.Android.maps.v2.API_KEY"
        Android:value="**********************" />

puis j'ai supprimé Map Meta et ensuite il a commencé à fonctionner.

2
Tarun Varshney

Le problème avec votre code peut provenir du fait que vous utilisez un type de lieu autre que l’établissement, l’adresse et le code géographique dans votre filtre automatique. Pour l'instant, seuls ces trois sont pris en charge. Pièces de code de la documentation de Google.

Facultatif: Un filtre de complétion automatique contenant un ensemble de types de lieu, que Vous pouvez utiliser pour limiter les résultats à un ou plusieurs types de lieu. Les types de lieu Suivants sont pris en charge dans le filtre: géocodage - Renvoie Uniquement les résultats de géocodage, plutôt que les entreprises. En général, vous utilisez Cette demande pour lever l’ambiguïté des résultats lorsque l’emplacement spécifié peut Être indéterminé. adresse - Renvoie uniquement les résultats de saisie semi-automatique avec une adresse précise de . En règle générale, vous utilisez cette demande lorsque vous savez que l'utilisateur Recherchera une adresse entièrement spécifiée. établissement - Ne renvoie que les lieux qui sont des entreprises.

0
Himanshu Virmani