Android6.0 權限管理那些事(一)

運行時權限介紹

Android 6.0在咱們原有的AndroidManifest.xml聲明權限的基礎上,java

又新增了運行時權限動態檢測,如下權限都須要在運行時判斷:android

身體傳感器日曆攝像頭通信錄地理位置麥克風電話短信存儲空間

運行時權限處理

Android6.0系統默認爲targetSdkVersion小於23的應用默認授予了所申請的全部權限,web

因此若是你之前的APP設置的targetSdkVersion低於23,在運行時也不會崩潰,app

但這也只是一個臨時的救急策略,用戶仍是能夠在設置中取消授予的權限。ide

  • 聲明目標SDK版本gradle

    咱們須要在build.gradle中聲明targetSdkVersion爲23ui

    android {    compileSdkVersion 23    buildToolsVersion "23.0.1"    defaultConfig {        applicationId "com.yourcomany.app        minSdkVersion 18        targetSdkVersion 23        versionCode 1        versionName "1.0"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}
  • 檢查並申請權限this

    咱們須要在用到權限的地方,每次都檢查是否APP已經擁有權限,spa

    好比咱們有一個下載功能,須要寫SD卡的權限,code

    咱們在寫入以前檢查是否有WRITE_EXTERNAL_STORAGE權限,沒有則申請權限

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)        != PackageManager.PERMISSION_GRANTED) {    //申請WRITE_EXTERNAL_STORAGE權限    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},            WRITE_EXTERNAL_STORAGE_REQUEST_CODE);}
  • 請求權限後,系統會彈出請求權限的Dialog

  • 用戶選擇容許或須要後,會回調onRequestPermissionsResult方法, 該方法相似於onActivityResult

    @Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {    super.onRequestPermissionsResult(requestCode, permissions, grantResults);    doNext(requestCode,grantResults);}
  • 咱們接着須要根據requestCode和grantResults(受權結果)作相應的後續處理

    private void doNext(int requestCode, int[] grantResults) {       if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {           if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {               // Permission Granted           } else {               // Permission Denied           }       }   }

Fragment中運行時權限的特殊處理

  • 在Fragment中申請權限,不要使用ActivityCompat.requestPermissions, 直接使用Fragment的requestPermissions方法,不然會回調到Activity的onRequestPermissionsResult

  • 若是在Fragment中嵌套Fragment,在子Fragment中使用requestPermissions方法,onRequestPermissionsResult不會回調回來,建議使用getParentFragment().requestPermissions方法,這個方法會回調到父Fragment中的onRequestPermissionsResult,加入如下代碼能夠把回調透傳到子Fragment

    @Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {    super.onRequestPermissionsResult(requestCode, permissions, grantResults);    List<Fragment> fragments = getChildFragmentManager().getFragments();    if (fragments != null) {        for (Fragment fragment : fragments) {            if (fragment != null) {                fragment.onRequestPermissionsResult(requestCode,permissions,grantResults);            }        }    }}
相關文章
相關標籤/搜索