Android fusedlocation取得裝置位置的注意事項

Table of Contents

Table of Contents

使用fusedLocationClient來取得手機的位置訊息。並且試做定時取得位置座標資料,以及手機設定上將位置功能關閉時,程式彈出訊息讓使用者啟動位置功能。

基本上照著官方網站的說明文件去做,方向上是沒有問題的。

但是因為文件內內容繁雜,有時候還要參照多篇文章,在看的時候有時難免會有失誤,因此寫下這次實作的過程,並將一些細節記錄下來方便日後查找。



注意點

 官方文件上面都有作法與說明。 總結來說,個人覺得要注意重點有以下三項。

  • 設定App的權限需求
  • 檢查並要求權限與設定
  • 獲取權限後的處理


設定App的權限需求

AndroidManifest.xml檔中不要忘記加上所需的權限。

根據你的需求,選擇添加以下三種權限。

若需要精確性較高的位置情報的話,選擇 ACCESS_FINE_LOCATION

如使用以下的程式碼來要求高精準的位置坐標時,要注意選 ACCESS_FINE_LOCATION

val locationRequest = LocationRequest.create()?.apply {
    interval = 10000
    fastestInterval = 5000
    priority = LocationRequest.PRIORITY_HIGH_ACCURACY
}


檢查並要求權限與設定

官方文件上有檢查的作法,但我實際上照著做,卻出現明明權限與手機的位置功能都不正確也能通過檢查,這樣問題一點也檢驗不出來。

後來,透過以下修改後終於正常了。

val locationRequest = LocationRequest.create()?.apply {
    interval = 10000
    fastestInterval = 5000
    priority = LocationRequest.PRIORITY_HIGH_ACCURACY
}
// check settings
val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest!!)
val client : SettingsClient = LocationServices.getSettingsClient(this)
val checkTask : Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())
checkTask.addOnSuccessListener {
    Log.d(TAG, "checkLocationSettings is Successful: " + checkTask.isSuccessful)
    Log.d(TAG, "isLocationUsable: " + it.locationSettingsStates.isLocationUsable)
    val task = fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null)
    task.addOnFailureListener { exception ->
        Log.d(TAG, "requestLocationFailed: " + exception.message)
    }
}
checkTask.addOnFailureListener{ exception ->
    Log.d(TAG, "checkLocationSettings's exception: " + exception.message)
    if (exception is ResolvableApiException) {
        try {
            // require user to change the settings.
            exception.startResolutionForResult(this@MainActivity, REQUEST_CHECK_SETTINGS)
        } catch (sendEx: IntentSender.SendIntentException) {
        }
    }
}

檢驗方法的重點是,透過SettingsClient來啟動檢查自己設計的要求locationRequest的任務(checkTask)。

而跟官方文件不同的地方在於

val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest!!)

我使用addLocationRequest函數來加入的自己設計的要求locationRequest。 如此便可以正確做出檢驗的結果。然後在checkTask的成功與失敗的事件上分別執行該做的處理。

特別要說的是,失敗的原因若是位置機能被關閉而導致的話,可以使用startResolutionForResult函數來彈出訊息詢問使用者使否要立即開啟位置功能。



獲取權限後的處理

這個部分端看App設計者的想法。

個人認為可分位置功能為必要功能或是非必要功能兩種情形。

必要的話,若使用者不賦予權限或是不開啟位置功能時,則重複詢問或是暫停App功能。

非必要的話,則先讓App執行其他功能,以後選擇別的時間點再次詢問。



最後

手機位置情報的取得是手機APP的一項大特色,但也是使用者的一種隱私情報,再加上耗電量的問題,官方對於這種個人情報的獲取限制也是越來越重視。

以後不曉得又會有什麼樣的改變出現,每當Android的新版本出現時,對於這部分的功能都要十分注意與小心。