android定位許可權適配看這篇就夠了
文章推薦指數: 80 %
將ACCESS_BACKGROUND_LOCATION 稱為後臺定位許可權. 網路定位許可權屬於:ACCESS_COARSE_LOCATION. GPS定位許可權屬於:ACCESS_FINE_LOCATION.
MdEditor
android定位許可權適配看這篇就夠了
語言:CN/TW/HK
時間 2021-01-1615:18:26
IT網際網路大叔
主題:
Android
一、前言
本文件的目的是梳理,android1.0~android11定位許可權幾次重大變更和適配。
如果你正在學習android11、android10、android6定位許可權的適配,那麼本篇最適合你不過了。
如果你想學習android許可權的機制,那麼本篇非常適合你,透過區域性看全域性,定位許可權是android許可權中非常典型的一個許可權。
如果以上都不是,你只是一個路過的android開發,那麼輕輕的你來了,點個收藏再輕輕的走。
如果你不是一個android開發,請走開,您來錯地方了。
定位許可權適配確實坑會比較多,且不易描述,看過很多相關的blog,大都寫的比較侷限不易懂;
於是大叔自己動手,嘗試寫一篇通俗易懂且實用blog。
如果我做到了,給個贊,認可下吧。
二、android定位許可權機制的幾次重大變更
上圖是,原生android系統,定位許可權申請的幾次重大變更。
對於理解如何適配定位許可權十分重要。
三、android中的三個定位許可權詳解
後臺定位許可權,顧名思義,如果APP沒有獲得後臺定位許可權,當APP處在後臺時,獲取定位會失敗。
四、需要特別注意3點:
後臺定位許可權(ACCESS_BACKGROUND_LOCATION)十分敏感,與其他新增的許可權不太一樣。
理論上,android10新增的許可權,新特性不會作用在targetSdkVersion小於android10的APP上。
但是:谷歌對後臺定位許可權做了十分嚴格的處理。
android10的手機上targetSDK小於android10也需要做兼。
但是:谷歌對後臺定位許可權做了十分嚴格的處理。
android10的手機上targetSDK小於android10也需要做兼。
但是:谷歌對後臺定位許可權做了十分嚴格的處理。
android10的手機上targetSDK小於android10也需要做兼。
在android10以上的手機,即使targetSdkVersion小於android10,如果使用者沒有主動授權後臺定位許可權,APP處在後臺也將無法獲取定位。
並且,targetSdkVersion小於android10,申請普通定位許可權的彈窗有所變化。
請注意,上面的彈窗的前兩個選項;
請注意,上面的彈窗的前兩個選項;
請注意,上面的彈窗的前兩個選項;
APP的targetSdkVersion=26,android10的系統。
只申請ACCESS_FINE_LOCATION許可權:
彈窗也會有Allowonlywhileusingtheapp和Allowallthetime:
android10系統上,可以在同一個許可權彈窗中同時申請:ACCESS_FINE_LOCATION和ACCESS_BACKGROUND_LOCATION許可權。
如下程式碼,系統將會彈窗
classMainActivity:AppCompatActivity(){
overridefunonCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
requestPermissions(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_BACKGROUND_LOCATION),100)
}
}
複製程式碼
只請求Manifest.permission.ACCESS_FINE_LOCATION許可權,只有兩個按鈕。
android11系統上,將後臺定位許可權又做了一次調整。
targetSdkVersion=android11時,不能同時申請普通定位許可權和後臺定位許可權。
只有成功申請了普通定位許可權,才能申請後臺定位許可權。
這裡千萬要注意,targetSdkVersion=android11,在Activity.requestPermissions()中,同時申請,普通定位許可權和後臺定位許可權,將不會彈窗,直接授權失敗。
這裡千萬要注意,targetSdkVersion=android11,在Activity.requestPermissions()中,同時申請,普通定位許可權和後臺定位許可權,將不會彈窗,直接授權失敗。
這裡千萬要注意,targetSdkVersion=android11,在Activity.requestPermissions()中,同時申請,普通定位許可權和後臺定位許可權,將不會彈窗,直接授權失敗。
和第二點同樣的程式碼,這次將會呼叫失敗
classMainActivity:AppCompatActivity(){
overridefunonCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
//targetSdkVersion=android11,在android11手機上,將直接授權失敗
requestPermissions(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_BACKGROUND_LOCATION),100)
}
}
複製程式碼
也就是說,如果你想獲得後臺定位許可權,必須彈窗兩次:
第一次,申請普通定位許可權的彈窗。
第二次,在使用者同意了普通定位許可權之後,申請後臺定位許可權時彈窗。
這裡也要千萬注意,在沒有拿到普通定位許可權的時候,直接申請後臺定位許可權,將不彈窗直接授權失敗。
五、只有普通定位許可權,如何讓APP在後臺時定位?
android10以上裝置,只有普通定位許可權,沒有Activity在前臺時,APP還能獲得定位嗎?
答案是肯定的。
通過定位服務。
後臺定位服務需要滿足3個條件:
APP至少已獲得普通定位許可權
Service必須是前臺服務foregroundService
在androidmenifest.xml中必須申明foregroundServiceType,;如下
注意:定位Service有個缺陷,就是這個Service必現是前臺Service。
也就意味著必須有通知欄。
注意:定位Service有個缺陷,就是這個Service必現是前臺Service。
也就意味著必須有通知欄。
注意:定位Service有個缺陷,就是這個Service必現是前臺Service。
也就意味著必須有通知欄。
「其他文章」
元件化開花,就問你香不香
欲學Flow先Sequence:kotlin《序列vs集合》
深入kotlin:const對話val,有必要用const申明變數嗎?
android定位許可權適配看這篇就夠了
2020年,103粉,小小程式設計師平庸的一年|掘金年度徵文
我反編譯了《wifi萬能鑰匙apk》,把岳父的《wifi萬能鑰匙》解除安裝了
android獲取程序名函式,如何優化到極致?
google為何選擇kotlin?kotlin如何解決java開發痛點?
打破你的認知,java,除以0一定會崩潰嗎?
把斷言(Assert)用的淋漓精緻,提高程式碼的健壯性
「Android」
撒花,2022Android最新面試專題:完結篇
應用程式與AMS的通訊實現——ActivityManager函式
Android元件化開發,其實就這麼簡單
YYEVA動效播放器--動態元素完美呈現新方案
58同城AndroidApp啟動優化實踐
升級Android13,三星GalaxySIII和NoteII用上LineageOS20
Android技術週刊(第8期):又來了22篇,優化有點多~
微軟SurfaceDuo3安卓摺疊屏手機專利曝光:超越三星GalaxyZFold4等單一折疊
共碼未來|持續賦能開發者和初創生態
要近萬元買iPhone14Pro才能玩靈動島?Android開發者:別急,我給你自制了一個App
延伸文章資訊
- 1Android 10 privacy changes for accessing device location
Android 10 introduces new location permission, ACCESS_BACKGROUND_LOCATION when you target Android...
- 2Android Q 新特性(一) 位置访问权限 - 简书
如果应用程序请求 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION ,系统会自动添加 ACCESS_BACKGROUND_LOCATION 到请求中。 ...
- 3请求位置权限| Android 开发者
在Android 10(API 级别29)及更高版本中,您必须在应用的清单中声明 ACCESS_BACKGROUND_LOCATION 权限,以便请求在运行时于后台访问位置信息。
- 4Android 10 权限说明-实用工具-开发指南 - 高德地图API
Android 10 新增加了后台定位权限:ACCESS_BACKGROUND_LOCATION,该权限对应始终允许;老的权限:ACCESS_FINE_LOCATION和ACCESS_COARS...
- 5Despite no ACCESS_BACKGROUND_LOCATION permission ...
java - Android 10 (Q) ACCESS_BACKGROUND_LOCATION ...