說到地理位置,你們應該就是很是熟悉了,不論是你的應用須要最簡單的定位,仍是經過一些用戶所在的位置信息去作一些更高級的功能,比方說給用戶推薦附近的餐廳,或是幫用戶尋找附近的好友,還有景點等等這些功能,你都會不可避免地須要用到地理位置權限。安全
在 Android Q 以前,也就是 Android P 或者更早的版本,若是你的 APP 須要一個地理位置權限的話,用戶就會看到這樣的一個彈窗出來,而後用戶基本上就只有兩個選項:容許或者拒絕。若是用戶點擊容許的話,那麼你的 APP 是能夠同時得到前臺和後臺的地理位置權限的。也就是說在任什麼時候間,被受權的 API 均可以得到手機的地理位置。 app
在 Android Q 中,最大的變化就是在地理位置權限這一塊新增長了一個狀態,這個狀態叫作僅在使用該應用時容許。 post
在 Android Q 以前,若是你須要使用地理位置權限的話,你須要在 Android manifest 的文件裏面添加一個 uses-permission 的申請。以前是有兩種,COARSE-LOCATION 和 FINE-LOCATION。它們並無先後臺的區別,它們的惟一的區別就只是在精度上。COARSE-LOCATION 大約只會精確到城市級,FINE-LOCATION 能精確到手機提供的位置。 3d
Android Q SDK有一大好處,就是說你能夠根據你的 app 的使用狀況,還有你所須要的範圍來申請這個位置權限。比方說你的 APP 只須要在前臺使用地理位置信息,你就能夠顯示這樣的一個彈框給用戶,而後用戶能夠很清楚看到下面那排小字寫的是「只有當您使用該應用時,該應用纔有權訪問地理位置信息」。而後這對於用戶會感受更安全,由於以前的話他是沒有這個選項,如今他有了使用中的保證以後,他可能會更加願意把這個位置權限給到相對應的應用。 cdn
而後你也能夠考慮漸進式地申請地理位置權限,比方說如今你看到的彈框,他就是在申請前臺的地理位置權限,而後用戶能夠選擇容許或者是拒絕。而後當你有一個特殊的用例,或者是有更進一步的用例,你須要用到後臺的地理位置時,你能夠再彈出一個新的框,問用戶是否是要給你更多位置權限,你能夠看到用戶如今的選擇就是變成一概容許或者是保持現有狀態。 blog
用地圖 App 作一個例子:比方說我這個地圖 App 的主要的功能是說在用戶開啓個人 App 時,顯示周圍地區的地理情況給用戶。實際上我就能夠考慮,我只在 App 開啓的時候問用戶,拿前臺的地理位置權限。用戶須要一個更高級的功能時,例如他須要在後臺的時候,地圖 App 還要給他推送實時交通情況,或是幫用戶預計回家要花多長時間等功能。其實這些功能就不會在前臺運行,而是在後臺。比方說到了下午6點鐘去拿一次用戶的地理位置,而後幫他計算一下回家時間。若是說用戶須要開啓這些功能,或者是通過 App 的某一個推薦讓他開啓這個功能的時候,我地圖的應用再去問這個用戶拿後臺的地理位置信息的權限就會顯得合理不少,而後用戶也會更願意根據用例去給應用更高級的位置權限。繼承
從 Android 6.0開始,由於位置權限做爲比較隱私的權限,它已經在剛剛的 Android manifest 裏面申請還不夠,還須要動態地在代碼裏面去申請,而後 requestpermissions 就是說咱們如今在 Android P 裏面都會須要作的就 COARSE-LOCATION 和 FINE-LOCATION。 開發
而後這一點在 Android Q 裏面對於前臺的地理位置權限是保持不變的,也就是說你的 App 只須要前臺地理位置權限,你就是隻須要在你的代碼裏寫這樣的一個 requestpermissions。若是說你須要後臺地理位置權限的話,你須要再申請一個 ACCESS-BACKGROUND-LOCATION。 rem
同時咱們也建議你和 checkSelfPermission API 結合起來使用,由於如今咱們有了三個地理位置權限的狀態,因此你須要去檢查一下你如今的地理位置權限是什麼等級,是根本沒有,仍是說你有前臺,仍是說你如今已經有了全市的地理位置權限的訪問。get
須要注意的是有一點你可能會問,若是說用戶以前如今手上是 Android P 的手機,而後他這個手機經過 OEM 推送升級到了 Android Q,他手機上以前裝的那些須要訪問地理位置的這些應用會不會受到影響?答案是否認的。以前有地理位置權限訪問的應用,它是會有前臺和後臺,由於是 Android P 到 Q 裏面依舊會繼承訪問權限,依舊會有前臺和後臺的地理位置訪問權限。若是沒有的話就是沒有。
還有一點是對於 Target Q 以前的 SDK version App 有特別大的影響,就是說 While-in-use permission 在系統的設置裏面,其實用戶是能夠進到每個 App 具體的 Location 設置頁面,它能夠選擇把應用的後臺或者整個 App 的 Permission 關掉。 若是說你的應用是 Target Q 以前的 SDK Level,若是用戶又恰巧把你的後臺的 Location Permission 關掉了的話,你的應用是沒有辦法經過API檢測到改變,而後你也沒有辦法經過任何 API 去從新得到後臺的地理位置權限。因此說若是你的應用是有很是重要的用例,必定要在後臺使用地理位置的話,請必定要升級你的 Target Q 到 Q SDK Version,這樣的話你纔可使用最新的這些 API 還有 Manifest Permission。
接下來咱們想講一下關於前臺服務和最新的 Location Permission 的改變。
咱們仍是用地圖的應用做爲範例,能夠看到用戶若是在地圖裏面開始了一次導航以後,而後又離開了地圖的應用,不論是去到別的APP裏面,仍是說把手機屏幕熄掉,這個地圖的應用,他就會開始一個前臺服務,也就是 Foreground service 來繼續導航任務。
但須要注意的是,若是你的應用,也就是比方說咱們剛剛那個例子裏面的地圖應用,它只有前臺地理方位置訪問的權限的話,它須要在它的前臺服務裏面添加一個新的 attribute,這個 attribute 是最新的 foregroundServiceLocationType="location",它才能夠在前臺服務裏面訪問到地理位置信息。並且須要注意的是說 attribute 它是在 Q SDK 纔有的,因此你的應用是須要用 Q 的 SDK 來編譯,你不須要 target 。並且就算你的應用沒有 target Q SDK 也會受到限制,你的 service 會在必定的狀況下沒有辦法拿到這個 location。
用戶的地理位置控制權,從以前只有 Yes 和 No,變成了有三個等級,並有了一個逐漸遞進的過程。
咱們還增長了用戶對於地理位置信息的這一塊的透明度。
這個圖就是咱們會在新的 Android Q 裏面給用戶展現的一個關於地理位置使用情況的通知。My Train Commute 是一個APP的名字,能夠看到這個 App 正在使用你的地理位置,此應用隨時可使用你的位置信息點按便可更改。
若是用戶按了通知,會進到一個設置頁面系統設置頁面裏面,可讓用戶把應用的地理位置權限從全時(All all the time)改爲僅在前臺(Allow only while using the app)或者直接把整個權限 關掉(Deny)。
你可能會問這個通知他是在何時纔會出現,他會不會說出現得很頻繁,讓用戶以爲很煩。通知只會在以上兩種狀況同時知足的時候纔出現,一個就是說應用它必需要有全時的地理位置權限,它既有前臺也有後臺的地理位置權限。還有它出現的時間點是在這個應用它進入了後臺,而且第一次接收到 fine location 信息的時候,須要注意的是,若是說用戶他去到系統設置裏面,把應用的全時的地理位置權限改爲了僅在前臺,或者說直接關掉,而後又改回了全時,那麼這個技術它是會被清零的,也就是說下一次能應用在後臺收到第一個 fine location 的信息的時候,通知會再出現一次。
以上就是全部的 Android Q 裏面關於地理位置權限的改變。
我想給你們總結在 Android Q 裏面的 Best Practice。
第一點,請你們只在須要的時候申請地理位置信息權限。由於每申請你每次接觸到地理位置權限的時候,你的應用都須要給用戶一個彈框,而後對於用戶來講,固然你是但願越少彈框越好。因此說若是你不須要的時候,請不要申請地理位置權限。
第二點是但願僅申請須要的地理位置權限。由於咱們剛剛提到有不少個等級的地理位置,權限有 COARSE-LOCATION 和 FINE-LOCATION,有前臺的也有後臺的,請你們仔細考慮一下,你的用例到底是一個什麼樣的場景,而後只申請你須要的等級。
第三點就是關於申請的問題了,可能有一些開發者會以爲若是在個人代碼裏面找到全部的我須要使用地理位置權限的點有太多又太複雜,我乾脆就直接在應用第一次開啓,或者是找一個就是統一的時間點一口氣把全部的權限都申請完,對我來講很省事,一些代碼就放在一個地方就行了。但實際上這對用戶來講他是比較困擾的,由於他甚至都不知道你的應用要作什麼,他就已經看到你再要求一些很是對他來講很隱私很涉及安全性的一些權限了。因此咱們但願儘可能大家把這些權限的申請放在有一個上下文的環境裏面。 比方說你是一個外賣 App,你須要獲取用戶的地址來給他送外賣,在這個過程以前,咱們就但願你不要就趕快把 COARSE-LOCATION 和 FINE-LOCATION 都申請了,只在就是用戶進入到他填寫地址那一步,再彈出申請 COARSE-LOCATION和FINE-LOCATION 彈框。
第四點是但願你們用一個漸進式的方式去申請 location,也就是說咱們剛剛最開始提到的,若是你的 App 在此刻只須要申請前臺的地理位置權限就能夠知足你的需求,那就請把後臺地理位置權限留到後面,等你真正須要的時候再去申請。
最後一點其實也是最重要的一點,但願開發者在寫全部須要地理位置權限的代碼這一塊,注意檢查一下你如今的 Locaiton 等級是什麼?由於如今有三個等級,你須要看一看你是否是已經有了你須要的 Location Permission,並且最重要的一點是,若是你沒有你須要的 Location Permission,那是否是能夠考慮一下有一個備用方案是否是你的 App 真的就是真的運行不了。由於就像我剛剛說的外賣 App,若是說用戶在填寫他地址的時候,你的 App 彈框問用戶要地理位置權限,用戶說我不給,其實用戶也能夠按照他本身的地理地理位置他本身去填寫,他從省市直接選到街道,他能夠本身去填寫,他未必須要你定位,而後你幫他去找地理位置。