記Android6.0動態權限處理引發的問題

最近項目上線,有些渠道需要Apk的targetversion設置爲26或以上,爲此引發一系列的問題記錄一下。


Android權限的動態申請

安卓6.0之前的版本,所有權限只要在文件中聲明,系統都會默認給權限。安卓6.0以後,如果app的targetversion低於23的,安卓還是會使用舊版本的權限機制。高於23的,安卓會啓用新的權限檢測機制。那麼,完整的權限申請流程是咋樣的?下面會列舉一下整個流程以及其中自己遇到的一些坑。

  1. 檢測權限接口
    Android有兩個檢測權限的接口,ContextCompat.checkSelfPermissionPermissionChecker.checkSelfPermission()。
    這兩個接口的區別是如果targetversion23以下的話,即使你的設備是在Android6.0以上,ContextCompat.checkSelfPermission返回的值都會是0(PERMISSION_GRANTED)。所以針對targetversion23以下的設置,需要調用PermissionChecker.checkSelfPermission()。
  2. 根據檢測結果決定調用是否需要請求權限
    這裏需要注意的是檢測結果未授權的話還需要分兩種情況,一種是請求過但是玩家拒絕了,另外一種是未請求的。
    如果是沒有權限,調用ActivityCompat.requestPermissions去請求權限,onRequestPermissions中回調使用ActivityCompat.shouldShowRequestPermissionRationale檢測玩家是否拒絕,如果是拒絕的話需要再次彈出窗口和玩家說明爲什麼需要這個權限,然後再次請求權限。玩家拒絕過後第二次請求權限時,權限窗口會有一個不再提示的選項,玩家如果點了不再提示的選項並再次拒絕。需要在onRequestPermissions通過ActivityCompat.shouldShowRequestPermissionRationale檢測是否拒絕。
    注意,ActivityCompat.shouldShowRequestPermissionRationale返回false有3種情況
    1重來沒有詢問過
    2拒絕並選擇不再提醒
    3已授權
    下面貼一張流程圖,網上找的=。=
  3. 這次適配遇到的一個大坑,就是Unity在使用Application.persistentDataPath的時候,有存儲權限和沒有存儲權限返回的是兩個路徑,這個在小米的機型上測試是這樣的,但是還不確定是否在所有的手機上都會有這樣的問題,所以有些路徑如果是一開始就使用Application.persistentDataPath拼接好的,那麼就需要在獲取存儲權限的時候就重新設置一下這個路徑。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章