web-dev-qa-db-ja.com

Google Places API for Android Error:Status {statusCode = NETWORK_ERROR、resolution = null}

Google Developer Consoleでプロジェクトを作成し、Android用のGoogle PlacesAPIを使用したいと考えました。 APIを有効にして、Googleデベロッパーウェブサイトのガイドラインに従ってAndroidアプリケーションに統合しました( https://developers.google.com/places/Android/start =)。APIがこのエラーを出し、インターネットのデバッグと検索を数時間(および数日)行った後、問題を絞り込むことができませんでした。このエラーが発生する理由について、リードをいただければ幸いです。

エラー:Status{statusCode=NETWORK_ERROR, resolution=null}

以下は、Places AutoCompleteが呼び出されるGoogleサンプルコードの関数です。

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;
}

AndroidManizest.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"/>
9
Sharief Shaik

型の予測を取得したい場合は、nullメソッドにAutocompleteFilterプロパティの代わりにgetAutocompletePredictionsを指定できます。

2
Eldar Miensutov

Himanshuは正しいです。それは私にも起こり、都市でフィルタリングしたかったので追加しました:

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

この結果はStatus {statusCode = NETWORK_ERROR、resolution = null}になります

AutocompleteFilterでのフィルタリングにPlaceのすべての定数を使用できるわけではありません。Androidで使用できるのは2つだけです:Place.TYPE_GEOCODEおよびPlace.TYPE_ESTABLISHMENT( 'address'はドキュメントに表示されますが、Placeでは定数ではありません)

ここを注意深く読んでください: https://developers.google.com/places/supported_types#table

他の定数の場合(例:Place.TYPE_LOCALITY)を使用すると、リクエストによって混乱を招くステータスエラーが発生します。

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.
5
rajeesh

私の場合、Mapと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="**********************" />

その後、マップメタを削除してから機能し始めました。

2
Tarun Varshney

Places APIは2019年1月以降変更されています:実装を変更してみてください:implementation 'com.google.Android.gms:play-services-places:16.0.0' to'implementation 'com.google.Android.libraries.places:places-compat:2.1.0'

0
kim Jose

Google PlaceAPIの場合GoogleCloudから課金システムを有効にする必要があります。 Googleは無料の場所APIを提供しなくなったためです。

0
Rakesh Jha

コードの問題は、オートコンプリートフィルターで施設、住所、および地理コード以外の場所の種類を使用していることである可能性があります。現在、これら3つだけがサポートされています。 Googleのドキュメントからパーツをコーディングします。

オプション:場所タイプのセットを含むAutocompleteFilter。これを使用して、結果を1つ以上のタイプの場所に制限できます。フィルタでは、次の場所の種類がサポートされています。geocode–ビジネスではなく、ジオコーディングの結果のみを返します。通常、このリクエストを使用して、指定した場所が不確定である可能性のある結果を明確にします。 address –正確な住所を持つオートコンプリート結果のみを返します。通常、このリクエストは、ユーザーが完全に指定されたアドレスを探していることがわかっている場合に使用します。設立–ビジネスである場所のみを返します。

0