我有一个特定的地方有奇怪的问题。有什么想法吗?
这段代码运行正常,但是对于一个地方(由于aaa启动而意外选择 - 仅用于测试),它无法从缓冲区获取Place对象。甚至查询都是成功的(日志:PlaceAutocompleteAdapt:查询已完成。收到5个预测。) 不幸的是,它崩溃了应用程序。它使这个API非常危险,还有什么应该在try catch块中处理?
addressAutocompleteText.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
/*
Retrieve the place ID of the selected item from the Adapter.
The adapter stores each Place suggestion in a PlaceAutocomplete object from which we
read the place ID.
*/
final PlaceAutocompleteAdapter.PlaceAutocomplete item = ((MainActivity) getActivity()).mAdapter.getItem(position);
final String placeId = String.valueOf(item.placeId);
Log.i(TAG, "Autocomplete item selected: " + item.description);
/* Issue a request to the Places Geo Data API to retrieve a Place object with additional details about the place. */
PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi.getPlaceById(((MainActivity) getActivity()).mGoogleApiClient, placeId);
placeResult.setResultCallback(new ResultCallback<PlaceBuffer>() {
@Override
public void onResult(PlaceBuffer places) {
if (!places.getStatus().isSuccess()) {
// Request did not complete successfully
Log.e(TAG, "Place query did not complete. Error: " + places.getStatus().toString());
places.release();
return;
}
try {
// Get the Place object from the buffer.
final Place place = places.get(0); // Throws IllegalStateException
if (null != place) {
coordinate = new Coordinate(place.getLatLng().latitude, place.getLatLng().longitude);
}
} catch (IllegalStateException e) {
Log.w(TAG, "Fail to get place or its coordinates");
}
places.release();
}
});
// hideKeyboard(addressAutocompleteText);
Log.i(TAG, "Called getPlaceById to get Place details for " + item.placeId);
}
});
LOG:
Starting autocomplete query for: aaa
06-05 08:05:29.618 6403-7777/...I/PlaceAutocompleteAdapt﹕ Query completed. Received 5 predictions.
06-05 08:05:39.248 6403-6403/...I/FavoriteLocationCreateFragment﹕ Autocomplete item selected: AAA Auto A.s., Zlín, Česká republika
06-05 08:06:01.278 6403-6403/...I/FavoriteLocationCreateFragment﹕ Called getPlaceById to get Place details for ChIJcYm-YVpzE0cR-OIfKj2KTKc
06-05 08:30:46.823 19727-19727/... D/AndroidRuntime﹕ Shutting down VM
06-05 08:30:46.833 19727-19727/... E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: ..., PID: 19727
java.lang.IllegalStateException
at com.google.android.gms.common.internal.zzv.zzP(Unknown Source)
at com.google.android.gms.common.data.zzc.zzaB(Unknown Source)
at com.google.android.gms.common.data.zzc.<init>(Unknown Source)
at com.google.android.gms.location.places.internal.zzq.<init>(Unknown Source)
at com.google.android.gms.location.places.internal.zzo.<init>(Unknown Source)
at com.google.android.gms.location.places.PlaceBuffer.get(Unknown Source)
at ....FavoriteLocationCreateFragment$3$1.onResult(FavoriteLocationCreateFragment.java:129)
at ....FavoriteLocationCreateFragment$3$1.onResult(FavoriteLocationCreateFragment.java:117)
at com.google.android.gms.common.api.AbstractPendingResult$CallbackHandler.deliverResultCallback(Unknown Source)
at com.google.android.gms.common.api.AbstractPendingResult$CallbackHandler.handleMessage(Unknown Source)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5832)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
答案 0 :(得分:7)
添加条件&& places.getCount() > 0
文档示例:
Places.GeoDataApi.getPlaceById(mGoogleApiClient, placeId)
.setResultCallback(new ResultCallback<PlaceBuffer>() {
@Override
public void onResult(PlaceBuffer places) {
if (places.getStatus().isSuccess() && places.getCount() > 0) {
final Place myPlace = places.get(0);
Log.i(TAG, "Place found: " + myPlace.getName());
} else {
Log.e(TAG, "Place not found");
}
places.release();
}
});
答案 1 :(得分:2)
还需要places.getCount()检查。请参阅此处https://developers.google.com/places/android-api/place-details
答案 2 :(得分:1)
我也有同样的问题。
我从Place ID: ChIJD1eejrW35zsRDFfkT-PSbm4
方法获得item.getPlaceId()
,但当我Reverse Geocoding by Place ID时,我没有得到任何结果。
可能会有很多地方返回与此相同的结果,所以我希望Google能够识别出这个问题。
但是现在我已经这样做了:
/**
* Callback for results from a Places Geo Data API query that shows the first place result in
* the details view on screen.
*/
private ResultCallback<PlaceBuffer> fromPlaceResultCallback = new ResultCallback<PlaceBuffer>() {
@Override
public void onResult(@NonNull PlaceBuffer places) {
if (!places.getStatus().isSuccess()) {
places.release();
return;
}
// Get the Place object from the buffer.
if(places.getCount() > 0) {
// Got place details
Place place = places.get(0);
// Do your stuff
} else {
// No place details
Toast.makeText(SelectLocation.this, "Place details not found.", Toast.LENGTH_LONG).show();
}
places.release();
}
};
答案 3 :(得分:-1)
如果 placeId 在通话
中错误/无效,就会发生这种情况Places.GeoDataApi.getPlaceById(((MainActivity) getActivity()).mGoogleApiClient, placeId);