Google Play 服務 SDK 11.2.0 版本提供存取 Places SDK for Android 的新方式。GoogleApi
用戶端比前身 (GoogleApiClient
) 更容易使用,因為其會自動管理與 Google Play 服務的連線。這樣可減少應用程式中的樣板程式碼,並排除許多常見的錯誤。新版 API 提供許多改善功能:
- 連線程序會自動管理,因此導入新 API 的工作較少。
- API 呼叫現在會自動等待服務連線建立完成,不必等待
onConnected
再發出要求。 - Tasks API 可以讓您輕鬆撰寫非同步作業。
- 程式碼是獨立性質,可以輕鬆移至共用公用程式類別或類似項目。
如要將應用程式更新為使用 GoogleApi
用戶端,您必須變更 Places SDK for Android 的實作項目。本指南將說明 Places SDK for Android 的異動內容,以及更新應用程式以使用新版用戶端時可採取的步驟。
總覽
主要變動內容如下:
- 有兩個新的進入點:
GeoDataClient
和PlaceDetectionClient
。 應用程式現在必須同時將GeoDataClient
和PlaceDetectionClient
執行個體化,而非建立一個涵蓋所有 API 的GoogleApiClient
執行個體。 - 由於連線回呼不再需要使用,您可以安全地重構應用程式將其移除。
- 新的 Places API 方法現已非同步,並傳回
Task
,而非PendingResult
。
載入 Places API
如要載入 Places API,請宣告進入點,然後在片段或活動的 onCreate() 方法中將用戶端例項化,如以下範例所示:
// The entry points to the Places API.
private GeoDataClient mGeoDataClient;
private PlaceDetectionClient mPlaceDetectionClient;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Construct a GeoDataClient.
mGeoDataClient = Places.getGeoDataClient(this, null);
// Construct a PlaceDetectionClient.
mPlaceDetectionClient = Places.getPlaceDetectionClient(this, null);
規格比較
新的 Places API 方法現已非同步,並傳回 Task
,而非 PendingResult
。資料結構並未變更,因此處理結果的現有程式碼不需更新。下列程式碼範例會比較新版 GetCurrentPlace()
的新版本:
全新方式
Task<PlaceLikelihoodBufferResponse> placeResult = mPlaceDetectionClient.getCurrentPlace(null); placeResult.addOnCompleteListener(new OnCompleteListener<PlaceLikelihoodBufferResponse>() { @Override public void onComplete(@NonNull Task<PlaceLikelihoodBufferResponse> task) { PlaceLikelihoodBufferResponse likelyPlaces = task.getResult(); for (PlaceLikelihood placeLikelihood : likelyPlaces) { Log.i(TAG, String.format("Place '%s' has likelihood: %g", placeLikelihood.getPlace().getName(), placeLikelihood.getLikelihood())); } likelyPlaces.release(); } });
過去
PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi .getCurrentPlace(mGoogleApiClient, null); result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() { @Override public void onResult(PlaceLikelihoodBuffer likelyPlaces) { for (PlaceLikelihood placeLikelihood : likelyPlaces) { Log.i(TAG, String.format("Place '%s' has likelihood: %g", placeLikelihood.getPlace().getName(), placeLikelihood.getLikelihood())); } likelyPlaces.release(); } });
瞭解詳情
進一步瞭解如何存取 Google API。