android定位許可權適配看這篇就夠了

文章推薦指數: 80 %
投票人數:10人

將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中的三個定位許可權詳解 複製程式碼 為了方便表達: 我們將,ACCESS_COARSE_LOCATION和ACCESS_FINE_LOCATION統稱為普通定位許可權 將ACCESS_BACKGROUND_LOCATION稱為後臺定位許可權 網路定位許可權屬於:ACCESS_COARSE_LOCATION GPS定位許可權屬於:ACCESS_FINE_LOCATION 後臺定位許可權:ACCESS_BACKGROUND_LOCATION 谷歌在android10之後,新增的後臺定位許可權ACCESS_BACKGROUND_LOCATION。

後臺定位許可權,顧名思義,如果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,;如下 複製程式碼 這樣我們即使沒有前臺Activity,只要定位服務在後臺依然可以獲手機定位資料。

注意:定位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



請為這篇文章評分?