取得最後已知位置

應用程式可透過 Google Play 服務 Location API,要求取得使用者裝置的最後已知位置。多數情況下,您會關注使用者目前的位置,通常相當於裝置的最後已知位置。

具體來說,請使用整合式位置預測提供工具,來擷取裝置的最後已知位置。整合式位置預測提供工具是 Google Play 服務中的其中一項 Location API。該服務可管理基本的位置技術,並提供簡易 API,方便您指定高層級的要求,例如高準確度或低功耗。此外還會最佳化裝置的電池用量。

注意:應用程式在背景中執行時,存取位置資訊應對對應用程式的核心功能至關重要,同時必須適當地向使用者揭露。

本課程說明如何使用整合式位置預測提供工具中的 getLastLocation() 方法,來對裝置的位置發出單一請求。

設定 Google Play 服務

如要存取整合式位置預測提供工具,應用程式的開發專案必須包含 Google Play 服務。透過 SDK Manager 下載並安裝 Google Play 服務元件,然後將程式庫新增至專案。詳情請參閱設定 Google Play 服務指南

指定應用程式權限

如果應用程式功能使用定位服務,必須要求位置存取權 (視這些功能的用途而定)。

建立定位服務用戶端

在活動的 onCreate() 方法中,如以下程式碼片段所示,建立整合式位置預測提供工具用戶端的執行個體。

Kotlin

private lateinit var fusedLocationClient: FusedLocationProviderClient

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}

Java

private FusedLocationProviderClient fusedLocationClient;

// ..

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
}

取得最後已知位置

建立「定位服務」用戶端後,即可取得使用者裝置的最後已知位置。將應用程式連線至這些用戶端後,即可使用整合式位置預測提供工具的 getLastLocation() 方法來擷取裝置位置。此呼叫傳回的位置準確度取決於您在應用程式資訊清單中進行的權限設定,詳情請參閱如何要求位置存取權的指南。

如要要求最後已知位置,請呼叫 getLastLocation() 方法。下列程式碼片段會說明要求,以及簡單的回應處理方式:

Kotlin

fusedLocationClient.lastLocation
        .addOnSuccessListener { location : Location? ->
            // Got last known location. In some rare situations this can be null.
        }

Java

fusedLocationClient.getLastLocation()
        .addOnSuccessListener(this, new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                // Got last known location. In some rare situations this can be null.
                if (location != null) {
                    // Logic to handle location object
                }
            }
        });

getLastLocation() 方法會傳回 Task,您可以用於取得 Location 物件,並包含地理位置的經緯度座標。在以下情況中,位置物件可能是 null

  • 定位服務在裝置設定中已關閉。即使最後位置是先前擷取的,系統仍會將其設為 null,因為停用定位服務也會清除快取。
  • 裝置並未記錄其位置資訊,例如新裝置或已還原至原廠設定的裝置。
  • 裝置上的 Google Play 服務已重新啟動,且在服務重新啟動後,並未啟用要求定位服務的整合式位置預測提供工具用戶端。如要避免這種情況發生,您可以建立新用戶端,並自行要求位置更新通知。詳情請參閱接收位置更新通知一節。

選擇最佳位置的預測結果

FusedLocationProviderClient 提供多種方法來擷取裝置位置資訊。視應用程式的用途而定,從下方選擇其中一項:

  • getLastLocation() 會更快取得位置資訊的預測結果,並盡量減少可能歸因於應用程式的電池用量。但如果最近沒有其他用戶端經常使用位置資訊,則位置資訊可能已經過時。
  • getCurrentLocation() 會取得更穩定準確的新位置。然而,這個方法可能會導致裝置的有效位置計算功能

    這是盡可能取得最新位置的建議方式,而且使用 requestLocationUpdates() 來自行啟動和管理位置更新比其他方法更安全。如果應用程式呼叫 requestLocationUpdates(),當應用程式無法取得位置資訊,或是取得新位置資訊後無法正確停止要求,有時可能會耗用大量電力。