在 Wear OS 上偵測位置

手錶的板型規格小巧,其中資訊一目瞭然,因此對於可以記錄、回報使用者位置資訊並做出回應的應用程式,Wear OS 是理想的平台。舉例來說,您可以建構應用程式,為使用者提供距離、速度和路線的即時更新資訊,或是一目瞭然的周遭環境提示。

詳情請參閱「建構位置辨識應用程式」。

部分手錶內建 GPS 感應器,可擷取位置資料,無需使用連線的手機。在手錶應用程式中要求位置資料時,系統會使用最省電的方法從手機或手錶擷取位置資訊。因此,即使手錶沒有 GPS 感應器,仍然可以取得位置資訊。

為降低位置資料擷取作業對電池續航力的影響,請使用 PRIORITY_BALANCED_POWER_ACCURACY 值呼叫 setPriority()。不同的優先順序設定可能會以不同的方式最佳化方塊

在可行情況下,請以每分鐘不超過 1 次的頻率,使用 setInterval() 要求位置資訊,節省電池電力。

如以下各節所述,當沒有感應器的手錶與手機中斷連線時,應用程式需要處理位置資料的遺失問題

選擇要採用的方式

您可以透過兩種方式為 Wear OS 應用程式提供位置資料:使用整合式位置預測提供工具 (FLP)Wear 健康照護服務 (WHS)。FLP 是 Google Play 服務 API。

您可在下列情況下使用 FLP:

  • 您需要當下的位置資料,而非連續的位置資料,例如標示停車車輛的位置。
  • 您需要連續的位置資訊,但不需使用定位記錄。

您可在下列情況下使用 WHS:

  • 您需要其他感應器提供的資料,或未來可能需要其他感應器提供的資料。
  • 您的應用程式是健身或運動應用程式,需要在特定時間間隔內追蹤位置資料。

如果是與 iPhone 配對的手錶,請參閱「與 iPhone 配對的手錶位置資料」。

使用整合式位置預測提供工具

在手錶上,請使用 FusedLocationProviderClient 取得位置資料。FLP 可能會使用手機提供的位置資料。詳情請參閱「建立定位服務用戶端」。

如要瞭解如何要求位置更新通知並持續追蹤使用者的位置,請參閱「要求位置更新通知」。

偵測內建 GPS

如果使用者配戴沒有內建 GPS 感應器的智慧手錶慢跑,也沒有攜帶配對的手機,手錶應用程式就無法透過連線裝置取得位置資料。請在應用程式中偵測此情況,並警示使用者位置資訊功能無法運作。

如要判斷手錶是否具有內建 GPS 感應器,請使用 PackageManager.FEATURE_LOCATION_GPS 呼叫 hasSystemFeature() 方法。以下程式碼會在活動啟動時,偵測手錶是否具有內建 GPS 感應器:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_activity)

    if (!hasGps()) {
        Log.d(TAG, "This hardware doesn't have GPS.")
        // Fall back to functionality that doesn't use location or
        // warn the user that location function isn't available.
    }
}

private fun hasGps(): Boolean =
        packageManager.hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)

Java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

    if (!hasGps()) {
        Log.d(TAG, "This hardware doesn't have GPS.");
        // Fall back to functionality that doesn't use location or
        // warn the user that location function isn't available.
    }
    ...
}

private boolean hasGps() {
    return getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS);
}

處理連線中斷事件

如果手錶沒有內建 GPS 感應器,且失去與手機的連線,手錶就會遺失位置資料串流。如果應用程式需要持續的資料串流,就必須偵測連線中斷情形、警示使用者,並將功能優雅降級。

與行動裝置的處理方式相同,使用 FusedLocationProviderClient.requestLocationUpdates() 要求位置更新通知時,須傳入 LocationCallbackPendingIntent。這兩者都會提供位置資訊和 LocationAvailability 狀態。

使用 LocationCallback 選項時,請覆寫 onLocationAvailability() 來接收位置資訊可用性狀態相關更新。

使用 PendingIntent 選項並傳回 Intent 時,請使用 LocationAvailability.extractLocationAvailability(Intent) 方法,從 Intent 中擷取位置資訊可用性狀態。

處理找不到位置資訊的情況

失去 GPS 訊號時,可以擷取使用者手錶的最後已知位置。當您無法修正 GPS 問題,或手錶缺少內建 GPS 且與手機中斷連線時,擷取最後已知位置是非常實用的做法。詳情請參閱「取得最後已知位置」。

使用批次呼叫清除位置資訊

如果使用批次呼叫,請在螢幕重新開啟 (或從微光模式返回) 時呼叫 flushLocations(),這樣就能立即將任何已批次處理的位置資訊傳回至所有已註冊的 LocationListenersLocationCallbacksPending Intents