@隨手筆記篇
1.Android6.0之后運(yùn)行時(shí)權(quán)限策略變化
從Android6.0(API23)開始雀久,對系統(tǒng)權(quán)限做了很大的改變,在之前用戶安裝app前朱监,只是把a(bǔ)pp需要的使用的權(quán)限列出來告知用戶一下岸啡,app安裝后都可以訪問這些權(quán)限原叮。從6.0開始赫编,一些敏感權(quán)限需要在使用是動(dòng)態(tài)申請,并且用戶可以選擇拒絕授權(quán)訪問這些權(quán)利奋隶,已授予過的權(quán)限擂送,用戶也可以去app設(shè)置界面去關(guān)閉授權(quán)。這對用戶來說提高了安全性唯欣,可以防止一些應(yīng)用惡意訪問用戶數(shù)據(jù)嘹吨,但是對于開發(fā)來說,也增加了不少的工作量境氢,這塊不做適配處理的話蟀拷,app在訪問權(quán)限的時(shí)候容易出現(xiàn)crash。
2.權(quán)限等級
2.1萍聊、正常權(quán)限
正常權(quán)限涵蓋應(yīng)用需要訪問其沙盒外部數(shù)據(jù)或資源问芬,但對用戶隱私或其他應(yīng)用操作風(fēng)險(xiǎn)很小的區(qū)域。應(yīng)用聲明其需要正常權(quán)限寿桨,系統(tǒng)會(huì)自動(dòng)授予該權(quán)限此衅。例如設(shè)置時(shí)區(qū),只要應(yīng)用聲明過權(quán)限亭螟,系統(tǒng)就直接授予應(yīng)用此權(quán)限挡鞍。
2.2、危險(xiǎn)權(quán)限
危險(xiǎn)權(quán)限涵蓋應(yīng)用需要涉及用戶隱私信息的數(shù)據(jù)或資源预烙,或者可能對用戶存儲(chǔ)的數(shù)據(jù)或其他應(yīng)用的操作產(chǎn)生影響的區(qū)域墨微。例如讀取用戶聯(lián)系人,在6.0以上系統(tǒng)中扁掸,需要在運(yùn)行時(shí)明確向用戶申請權(quán)限翘县。
3.運(yùn)行時(shí)請求權(quán)限
3.1、檢查權(quán)限
應(yīng)用每次需要危險(xiǎn)權(quán)限時(shí)也糊,都要判斷應(yīng)用目前是否有該權(quán)限炼蹦。兼容庫中已經(jīng)做了封裝,只需要通過下面代碼即可:
ContextCompat.checkSelfPermission(context,permission)狸剃;
如果有權(quán)限則返回PackageManager.PERMISSION_GRANTED掐隐,否則返回PackageManager.PERMISSION_DENIED
3.2、請求權(quán)限
當(dāng)應(yīng)用需要某個(gè)權(quán)限時(shí),可以申請獲取權(quán)限虑省,這時(shí)會(huì)有彈出一個(gè)系統(tǒng)標(biāo)準(zhǔn)Dialog提示申請權(quán)限匿刮,此Diolog不能定制,用戶同意或者拒絕后會(huì)通過方法onRequestPermissionsResult()返回結(jié)果探颈,通過下面代碼:
ActivityCompat.requestPermissions(@NonNull String[] permissions, intrequestCode)熟丸;
3.3、處理權(quán)限請求響應(yīng)
當(dāng)用戶處理權(quán)限請求后伪节,系統(tǒng)會(huì)回調(diào)申請權(quán)限的Activity的onRequestPermissionsResult()方法光羞,只需要覆蓋此方法,就能獲得返回結(jié)果.
4.Android O的運(yùn)行時(shí)權(quán)限策略變化
4.1在 Android O 之前怀大,如果應(yīng)用在運(yùn)行時(shí)請求權(quán)限并且被授予該權(quán)限纱兑,系統(tǒng)會(huì)錯(cuò)誤地將屬于同一權(quán)限組并且在清單中注冊的其他權(quán)限也一起授予應(yīng)用。
4.2對于針對Android O的應(yīng)用化借,此行為已被糾正潜慎。系統(tǒng)只會(huì)授予應(yīng)用明確請求的權(quán)限。然而一旦用戶為應(yīng)用授予某個(gè)權(quán)限蓖康,則所有后續(xù)對該權(quán)限組中權(quán)限的請求都將被自動(dòng)批準(zhǔn),但是若沒有請求相應(yīng)的權(quán)限而進(jìn)行操作的話就會(huì)出現(xiàn)應(yīng)用crash的情況.
例如铐炫,假設(shè)某個(gè)應(yīng)用在其清單中列出READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE。應(yīng)用請求READ_EXTERNAL_STORAGE蒜焊,并且用戶授予了該權(quán)限倒信,如果該應(yīng)用針對的是API級別24或更低級別,系統(tǒng)還會(huì)同時(shí)授予WRITE_EXTERNAL_STORAGE山涡,因?yàn)樵摍?quán)限也屬于STORAGE權(quán)限組并且也在清單中注冊過堤结。如果該應(yīng)用針對的是Android O,則系統(tǒng)此時(shí)僅會(huì)授予READ_EXTERNAL_STORAGE鸭丛,不過在該應(yīng)用以后申請WRITE_EXTERNAL_STORAGE權(quán)限時(shí)竞穷,系統(tǒng)會(huì)立即授予該權(quán)限,而不會(huì)提示用戶鳞溉。但是若沒有申請WRITE_EXTERNAL_STORAGE權(quán)限瘾带,而去進(jìn)行寫存儲(chǔ)卡的操作的時(shí)候,就會(huì)引起應(yīng)用的崩潰熟菲。