2015-06-05 12 views
9

Tôi gặp sự cố lạ với một địa điểm cụ thể. Bất kỳ ý tưởng ?Không nhận được Địa điểm cụ thể từ PlaceBuffer

Mã này hoạt động tốt, nhưng đối với một địa điểm (vô tình được chọn vì bắt đầu bằng aaa - chỉ để thử nghiệm) không thể lấy đối tượng Địa điểm từ bộ đệm. Ngay cả một truy vấn đã thành công (log: PlaceAutocompleteAdapt ﹕ Query hoàn thành. Đã nhận được 5 dự đoán.) Unfortunatelly, ứng dụng bị lỗi. Nó làm cho API này rất nguy hiểm, những gì khác nên được xử lý trong cố gắng nắm bắt khối chắc chắn?

 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

PlaceAutocomplete là gì? Có thể bạn đang nhận được ID xấu từ đó. Tôi đã thử kiểm tra ID từ thông điệp tường trình của bạn "ChIJcYm-YVpzE0cR-OIfKj2KTKc" và tôi không nhận được bất kỳ kết quả nào. Có vẻ như không có chỗ nào với ID đó. Trong trường hợp đó, API cung cấp cho bạn một vùng đệm với các kết quả bằng không bên trong nó. Nếu bạn gọi places.get (0) bạn đang cố gắng lấy ra một thứ không tồn tại. Vấn đề với lý thuyết này là places.getStatus(). IsSuccess() sẽ trả về false trong trường hợp đó, mà bạn đã kiểm tra. Cân nhắc việc ghi lại places.getCount() để hỗ trợ gỡ lỗi. –

+1

PlaceAutocomplete là API từ google https://developers.google.com/places/android/autocomplete Có, placeID trả về kết quả trống. Nhưng tại sao tôi nhận nó ở vị trí đầu tiên? Khi trạng thái là THÀNH CÔNG và đếm là 5 (đăng nhập: Đã nhận được 5 dự đoán.). Làm thế nào có thể bộ đệm trống? Dường như một lỗi) -: – Wooff

+0

hãy đảm bảo thêm '.addApi (Places.GEO_DATA_API)' vào GoogleApiClient –

Trả lời

-1

này xảy ra với tôi nếu placeId đã sai/không hợp lệ trong các cuộc gọi

Places.GeoDataApi.getPlaceById(((MainActivity) getActivity()).mGoogleApiClient, placeId); 
0

Tôi cũng gặp vấn đề tương tự.

Tôi nhận được Place ID: ChIJD1eejrW35zsRDFfkT-PSbm4 từ phương thức item.getPlaceId(), nhưng khi tôi làm Reverse Geocoding by Place ID, tôi không nhận được bất kỳ kết quả nào.

Có thể có nhiều nơi trả về kết quả tương tự như vậy, vì vậy tôi hy vọng Google nhận ra vấn đề này.

Nhưng bây giờ tôi đã làm điều này:

/** 
* 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(); 
    } 
}; 
+0

Cảm ơn bạn đã xác nhận ... – Wooff

5

Thêm điều kiện && places.getCount() > 0

Ví dụ từ tài liệu:

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(); 
    } 
}); 
Các vấn đề liên quan