這兩天著實頭疼了一番,因為適配android 6.0的權限,眾所周知,android6.0權限需要動態申請,簡單說一下過程吧,一般是根據Build.VERSION.SDK_INT來判斷當前手機版本大于M(23)那么就需要獲取權限,一般來說第一是判斷是否擁有該權限,即ContextCompat.checkSelfPermission(getApplication(), Manifest.permission.WRITE_EXTERNAL_STORAGE)==PackageManager.PERMISSION_GRANTED;這種方式。如果有權限當然是直接做該做的事情沒有就只能申請了ActivityCompat.requestPermissions()也就是這個方法,同時復寫onRequestPermissionsResult()這個方法,這個方法是申請權限的回調。我們通過他的一些參數來判斷當前是否請求成功,這個網上比較多我就不一一贅述了。關鍵是來看這個方法ActivityCompat.requestPermissions(),很明顯他是在activity調用的,第一個坑,如果是fragment調用怎么調用,getactivity?答案是否定的,fragemnt擁有自己的方法直接使用Fragment的requestPermissions方法。同時也是復寫onRequestPermissionsResult().在fragment中。
如果在6.0及以下申請權限會怎么樣呢?會直接返回正確的值,即是否擁有,或者,沒有權限,這個就取決于你是否在清單文件中注冊。并不會有6.0的提示框,這個時候更大的坑來了!
在6.0以下你打電話開相機之類的竟然!也彈框問你是否訪問!!!!!!!!!!!這個搞什么鬼!ok針對這個問題具體分析下:
1.因為rom的自定制問題,即使你在清單文件注冊了,在使用權限的時候仍然會有提示框,提示你是否使用。
2.這個提示即便你在清單文件中注冊了權限仍然可以干涉你的操作拒絕你的請求,
3.并沒有相關的api及回調,也就是無法監聽。并不會走6.0權限的回調。
4.目前經測試最合適的方式是采用try cath的方式來捕獲異常提示用戶。
5,RECORD_AUDIO:系統在調用需要這個權限的功能的時候,如果被安全軟件拒絕,會拋出異常,可以在catch中處理沒有權限的情況(MOTO XT1085 系統自帶安全軟件下測試)。主流軟件中,微信通過返回值異常交互,高德,QQ通過catch異常。
CAMERA:調用系統攝像頭的時候不會拋出異常(微信,QQ發送照片均無反饋),調用自定義的camera會拋出異常(微信二維碼掃描)
LOCATION:對于需要這個權限的應用,可能沒有比較好的方法處理,因為高德地圖中定位權限被拒絕,同樣沒有交互。
總結:簡單說,怎么解決呢。就是報異常就捕獲,然后告訴用戶,你看看你是不是哪里有問題,開啟下,至于你開沒開,反正我是給你提示了。反正我這邊不好使。一般項目開發中最后去解決這個問題吧,個人感覺,省的你開始全捕獲了,后面是不是你的鍋你都甩