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"/>
型の予測を取得したい場合は、null
メソッドにAutocompleteFilterプロパティの代わりにgetAutocompletePredictions
を指定できます。
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
)を使用すると、リクエストによって混乱を招くステータスエラーが発生します。
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.
私の場合、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="**********************" />
その後、マップメタを削除してから機能し始めました。
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'
Google PlaceAPIの場合GoogleCloudから課金システムを有効にする必要があります。 Googleは無料の場所APIを提供しなくなったためです。
コードの問題は、オートコンプリートフィルターで施設、住所、および地理コード以外の場所の種類を使用していることである可能性があります。現在、これら3つだけがサポートされています。 Googleのドキュメントからパーツをコーディングします。
オプション:場所タイプのセットを含むAutocompleteFilter。これを使用して、結果を1つ以上のタイプの場所に制限できます。フィルタでは、次の場所の種類がサポートされています。geocode–ビジネスではなく、ジオコーディングの結果のみを返します。通常、このリクエストを使用して、指定した場所が不確定である可能性のある結果を明確にします。 address –正確な住所を持つオートコンプリート結果のみを返します。通常、このリクエストは、ユーザーが完全に指定されたアドレスを探していることがわかっている場合に使用します。設立–ビジネスである場所のみを返します。