探索Android Q上的位置權限

做者:Joe Birchjava

翻譯:Google Translate + Leelion6android

原文連接:joebirch.co/2019/03/18/…git

所需材料及源碼下載:github.com/hitherejoe/…github

發佈日期:2019年3月18日安全

上個月咱們看到了Android Q beta版本的宣佈 🎉 隨之帶來了一系列使人興奮的變化,咱們須要瞭解這些變化才能讓咱們的應用程序作好準備。app

正如 Android Q 的 測試版發行說明中所述,新版變化之一是應用內處理用戶獲取位置的方式——這些更改會影響前臺和後臺中對位置的訪問,使得咱們的用戶能夠更好地按照他們的想法來選擇應用什麼時候可以訪問其位置,以及用戶僅在使用應用的時候作一些限制。在這篇文章中,我想讓你快速瞭解這些變化將如何影響應用程序,以及咱們須要作些什麼來適應這些變化。ide

前臺獲取位置權限

在某些狀況下,您的應用程序須要在前臺運行時訪問用戶位置。例如,您的應用可能會向用戶提供導航功能,一旦用戶打開了應用的導航首頁,您就會但願繼續訪問其位置以繼續向他們提供導航服務。若是您的應用程序須要訪問此時的位置數據,那麼讓您的用戶知道訪問的緣由就很是重要。測試

首先,使用用戶位置的任何此類服務都須要聲明爲位置前臺服務。這能夠經過在 manifest 清單文件中聲明服務時使用 foregroundServiceType 來達成。this

<service
    android:name="ForegroundService"
    android:foregroundServiceType="location"/>
    
複製代碼

在嘗試啓動前臺服務以前,咱們須要確保已得到用戶所需的權限,咱們能夠經過檢查 ACCESS_COARSE_LOCATION 來確認這一點。對如今來講,這不是一個新的權限——實際上,它從API級別1開始就存在了。然而,咱們之前只須要在應用程序 manifest 清單文件中定義, 如今咱們必須在運行時請求此權限。您能夠看到,如今咱們的用戶對如何使用該權限有了更多的控制。spa

val hasLocationPermission = ActivityCompat.checkSelfPermission(this, 
    Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED if (hasLocationPermission) {
    // handle location update
} else {
    ActivityCompat.requestPermissions(this,
        arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION), REQUEST_CODE_FOREGROUND)
}
複製代碼

在上面的代碼中,您能夠看到咱們首先檢查是否具備位置權限。若是是這樣,咱們能夠繼續處理位置流程,不然必須請求用戶的許可。若是是這種狀況,那麼咱們將在調用類中的 onRequestPermissionsResult() 的回調中接收權限狀態。

當咱們請求此權限時,咱們的用戶將顯示如下對話框:

正如您所看到的,請求權限的意圖已經很是明確 - 應用程序只能在前臺訪問其位置(例如,正在使用該應用程序)。若是用戶在任什麼時候候拒絕了此權限,而且應用再次請求獲取權限時,那麼對話框的內容將產生略微變化:

與Android中的獲取運行時權限的工做方式相似,用戶能夠選擇再也不被詢問一個權限請求。由於有這個功能的存在,因此開發者只能在須要的時候採起請求這個前臺位置訪問權限,這一點很重要,會讓用戶能夠更明確地知道什麼時候須要權限,而不是讓用戶以爲應用在平白無故地請求權限。

後臺獲取位置權限

當咱們的應用程序在後臺訪問用戶位置時,實現的方式會有不一樣。首先須要爲咱們的 manifest 清單文件添加一個新權限 —— ACCESS_BACKGROUND_LOCATION 。雖然這是在 manifest 清單中聲明的,但用戶仍可隨時撤銷它。

<manifest>
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
複製代碼

請注意,這裏咱們不須要將 foregroundServiceType 服務類型添加到咱們的服務聲明中,這是由於咱們不須要那種短暫的權限就能夠在應用外運行? 這個背景權限已經使咱們的應用程序可以執行此操做。

譯者注:此處未能理解做者的原意,因此不知如何翻譯,指望有明白的大佬能夠在評論區告知
做者原句:this is because we don’t need momentary permission to run outside of our app – this background permission already gives our application the ability to do this.

除了上述內容以外,用戶還須要在運行時授予權限。所以,在咱們嘗試從後臺訪問用戶位置以前,咱們須要確保咱們擁有用戶所需的權限。咱們能夠經過檢查 ACCESS_BACKGROUND_LOCATION 權限來完成此操做。您能夠再次看到它如今如何讓咱們的用戶更好地控制如何使用此權限,並避免濫用後臺位置訪問。

咱們檢查權限的代碼以下所示:

val hasForegroundLocationPermission = ActivityCompat.checkSelfPermission(this, 
    Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED if (hasForegroundLocationPermission) {
    val hasBackgroundLocationPermission = ActivityCompat.checkSelfPermission(this, 
        Manifest.permission.ACCESS_BACKGROUND_LOCATION) == PackageManager.PERMISSION_GRANTED if (hasBackgroundLocationPermission) {
        // handle location update
    } else {
        ActivityCompat.requestPermissions(this,
            arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), REQUEST_CODE_BACKGROUND)
    }
} else {
    ActivityCompat.requestPermissions(this,
        arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_BACKGROUND_LOCATION), REQUEST_CODE_BACKGROUND)
}
複製代碼

您會注意到此代碼與咱們爲前臺位置權限定義的檢查很是類似。在這裏,咱們檢查兩種權限,若是用戶因爲某種緣由拒絕咱們進行後臺訪問,咱們會在位置檢索中給予回退。

當咱們請求此權限時,咱們的用戶將顯示如下對話框:

許可的意圖已經很是明確 - 咱們的應用程序將可以在後臺訪問他們的位置。若是用戶在任什麼時候候拒絕了此權限而且咱們再次請求它,那麼對話框顯示的內容將會略微變化:

與Android中的獲取運行時權限的工做方式相似,用戶能夠選擇再也不被詢問一個權限請求。由於有這個功能的存在,因此開發者只能在須要的時候採起請求這個後臺位置訪問權限,指導用戶能夠更明確地知道什麼時候須要權限,而不是讓用戶以爲應用在平白無故地請求權限。

總結

咱們能夠從這篇文章中看到,Android Q改變了應用程序獲取位置權限的方式。咱們的應用程序將沒法再從服務中自由訪問用戶位置,不管是在前臺仍是後臺。

爲了應用具備更好的兼容性,若是您的應用程序未以Q爲目標,則在聲明 COARSEFINE 權限時將添加 ACCESS_BACKGROUND_LOCATION 權限。一樣,在運行時請求二者中的任何一個也將授予權限。

這些更改使咱們的用戶能夠更好地控制應用程序訪問其位置的方式,從而使咱們可以建立具備註重用戶隱私和安全性的應用程序。有關這些位置變化的任何問題?歡迎在評論中與咱們聯繫!

相關文章
相關標籤/搜索