使用fusedLocationClient
來取得手機的位置訊息。並且試做定時取得位置座標資料,以及手機設定上將位置功能關閉時,程式彈出訊息讓使用者啟動位置功能。
基本上照著官方網站的說明文件去做,方向上是沒有問題的。
但是因為文件內內容繁雜,有時候還要參照多篇文章,在看的時候有時難免會有失誤,因此寫下這次實作的過程,並將一些細節記錄下來方便日後查找。
官方文件上面都有作法與說明。 總結來說,個人覺得要注意重點有以下三項。
在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的新版本出現時,對於這部分的功能都要十分注意與小心。