一、簡述
根據(jù)郭神的思路完成本此封裝,Android運行時權(quán)限申請和使用。稍微完善一點。
若喜歡看郭神原貼請參見郭神原視頻講解。
運行時權(quán)限是在Android 6.0之后增加的,6.0之前只需要在安裝的時候全部同意就行了。運行時權(quán)限是多一層安全申請,在App運行過程中涉及到危險權(quán)限,需要進(jìn)行動態(tài)申請。比如定位權(quán)限,存儲權(quán)限等。
運行時權(quán)限,是在App運行過程中在需要某些危險權(quán)限時需要動態(tài)申請,系統(tǒng)彈窗,用戶同意后才可進(jìn)行繼續(xù)操作。如果在Android 6.0之后不進(jìn)行“危險權(quán)限”申請而直接操作,應(yīng)用會崩潰。
二、思想
權(quán)限申請,須在Activity或者Fragment中申請,然后系統(tǒng)彈窗,用戶同意后會回調(diào)Activity方法通知用戶是否同意權(quán)限申請,進(jìn)而判斷是否可進(jìn)行下一步操作。
現(xiàn)在使用系統(tǒng)的權(quán)限申請繁瑣之處就在于,每次都要檢查-->申請-->回調(diào)判斷,然后再執(zhí)行,會很繁瑣。每個Activity或Fragment中都要重寫onRequestPermissionsResult方法回調(diào)判斷,所以增加很多重復(fù)代碼。程序員是懶惰的,所以封裝復(fù)用才是王道O(∩_∩)O~
實現(xiàn)思路,做Android開發(fā)一般都會寫B(tài)aseActivity,把每個頁面可能會用到的東西寫進(jìn)去,以免每個Activity都重寫。此次我們也把權(quán)限申請放到Base中,而且寫一個靜態(tài)的方法哪里都可以調(diào)用,進(jìn)行權(quán)限檢查和申請。利用接口回調(diào)進(jìn)行執(zhí)行。
1、想要隨處可調(diào),但是權(quán)限申請只能在Activity中申請回重寫回調(diào),那么就想到了Activity棧,就用棧頂Activity代勞可否。
2、所以需要自己寫一個Activity存儲類,可以取到棧頂,一般也會在自定義Application中去完成這個任務(wù)。
3、使用棧頂Activity去申請和回調(diào),然后再通過接口完成回調(diào)。
好了,開始擼代碼吧!
三、BaseActivity中怎么寫
是不是有點兒長,不多,請手動敲擊一遍,此處小坑,哈哈...
1、在Activity創(chuàng)建時候,把此Activity天驕到收集器中,在銷毀的時候從收集器中移除。
2、靜態(tài)的方法進(jìn)行權(quán)限申請,申請權(quán)限的對象就是Activity收集器中的棧頂Activity,所以權(quán)限申請回調(diào)也會在棧頂Activity中。別忘了此方法為靜態(tài)方法,所以Activity存儲方法和存儲集合也必須為“靜態(tài)”的方法和集合。
里邊先對申請的權(quán)限進(jìn)行檢查,若全部已經(jīng)被同意,則直接使用傳進(jìn)來的接口進(jìn)行全部同意方法onAllGranted回調(diào)通知,如果有沒被同意的權(quán)限則進(jìn)行權(quán)限申請。
3、權(quán)限申請回調(diào)結(jié)果onRequestPermissionsResult中遍歷回調(diào)結(jié)果,如果全部同意則回調(diào)onAllGranted方法通知,如果有被同意,有沒有被同意的,則分別放入兩個集合進(jìn)行分別在onGranted中和onDenied中回調(diào)通知。
如果申請多個權(quán)限,必要權(quán)限在onGranted中,則可進(jìn)行自己的下一步,否則不執(zhí)行下一步。
注:小坑在此,如果申請多個權(quán)限,而必要權(quán)限已經(jīng)之前已經(jīng)被同意,則不會申請,必然不會在部分權(quán)限同意的回調(diào)中找到,此時怎弄...唉...唉...唉...那就在沒被同意的權(quán)限搜索,如果不包含需要權(quán)限,則可執(zhí)行下一步,是不是就解決了O(∩_∩)O哈哈~
四、Activity收集器
沒啥可多說的!
注意集合,方法都必須是靜態(tài)的!
收集器功能也可放入自定義Application中,請自行解決!
五、完成,搞起吧...
權(quán)限申請就是這么easy,盡情擼代碼吧!
六、怎么也得放一張動態(tài)圖,展現(xiàn)功力啊!
最后:有什么不對的地方請多多指教...請多多留言...
O(∩_∩)O哈哈~