Android 6.0 運(yùn)行時(shí)權(quán)限處理

運(yùn)行時(shí)權(quán)限介紹

Android 6.0在我們?cè)械腁ndroidManifest.xml聲明權(quán)限的基礎(chǔ)上朋譬,又新增了運(yùn)行時(shí)權(quán)限動(dòng)態(tài)檢測(cè)此熬,以下權(quán)限都需要在運(yùn)行時(shí)判斷:

身體傳感器
日歷
攝像頭
通訊錄
地理位置
麥克風(fēng)
電話
短信
存儲(chǔ)空間

運(yùn)行時(shí)權(quán)限處理

Android6.0系統(tǒng)默認(rèn)為targetSdkVersion小于23的應(yīng)用默認(rèn)授予了所申請(qǐng)的所有權(quán)限滑进,所以如果你以前的APP設(shè)置的targetSdkVersion低于23,在運(yùn)行時(shí)也不會(huì)崩潰阴汇,但這也只是一個(gè)臨時(shí)的救急策略搀庶,用戶還是可以在設(shè)置中取消授予的權(quán)限铜异。
聲明目標(biāo)SDK版本我們需要在build.gradle中聲明targetSdkVersion為23

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' }
 }
}

檢查并申請(qǐng)權(quán)限我們需要在用到權(quán)限的地方,每次都檢查是否APP已經(jīng)擁有權(quán)限咆蒿,比如我們有一個(gè)下載功能沃测,需要寫SD卡的權(quán)限,我們?cè)趯懭胫皺z查是否有WRITE_EXTERNAL_STORAGE權(quán)限馏谨,沒有則申請(qǐng)權(quán)限

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
              != PackageManager.PERMISSION_GRANTED) {
          //申請(qǐng)WRITE_EXTERNAL_STORAGE權(quán)限
          ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                  WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
      }

請(qǐng)求權(quán)限后惧互,系統(tǒng)會(huì)彈出請(qǐng)求權(quán)限的Dialog

20151105111531_728.png

用戶選擇允許或需要后壹哺,會(huì)回調(diào)onRequestPermissionsResult方法, 該方法類似于onActivityResult

  @Override
  public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);
      doNext(requestCode,grantResults);
  }

我們接著需要根據(jù)requestCode和grantResults(授權(quán)結(jié)果)做相應(yīng)的后續(xù)處理

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中運(yùn)行時(shí)權(quán)限的特殊處理
在Fragment中申請(qǐng)權(quán)限管宵,不要使用ActivityCompat.requestPermissions, 直接使用Fragment的requestPermissions方法攀甚,否則會(huì)回調(diào)到Activity的 onRequestPermissionsResult

如果在Fragment中嵌套Fragment,在子Fragment中使用requestPermissions方 法炸庞,onRequestPermissionsResult不會(huì)回調(diào)回來(lái)荚斯,建議使用 getParentFragment().requestPermissions方法,這個(gè)方法會(huì)回調(diào)到父Fragment中的onRequestPermissionsResult滥壕,加入以下代碼可以把回調(diào)透?jìng)鞯阶覨ragment

 @Override
  public 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);
              }
          }
      }
  }

相關(guān)開源項(xiàng)目
PermissionsDispatcher使用標(biāo)注的方式绎橘,動(dòng)態(tài)生成類處理運(yùn)行時(shí)權(quán)限称鳞,目前還不支持嵌套Fragment稠鼻。
RxPermissions基于RxJava的運(yùn)行時(shí)權(quán)限檢測(cè)框架
Grant簡(jiǎn)化運(yùn)行時(shí)權(quán)限的處理,比較靈活
android-RuntimePermissionsGoogle官方的例子
附錄
以下權(quán)限只需要在AndroidManifest.xml中聲明即可使用

android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末苫亦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子润匙,更是在濱河造成了極大的恐慌,老刑警劉巖匠楚,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芋簿,死亡現(xiàn)場(chǎng)離奇詭異璃饱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)撩穿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門食寡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)廓潜,“玉大人,你說我怎么就攤上這事呻畸】芭欤” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵钮呀,是天一觀的道長(zhǎng)昨凡。 經(jīng)常有香客問我,道長(zhǎng)蚂四,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任久妆,我火速辦了婚禮筷弦,結(jié)果婚禮上抑诸,老公的妹妹穿的比我還像新娘。我一直安慰自己奸绷,他們只是感情好层玲,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布称簿。 她就那樣靜靜地躺著,像睡著了一般憨降。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上士嚎,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天莱衩,我揣著相機(jī)與錄音娇澎,去河邊找鬼。 笑死括细,一個(gè)胖子當(dāng)著我的面吹牛戚啥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猫十,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贷笛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起丁频,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叔磷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體繁疤,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稠腊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年鸣哀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叹放。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡井仰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出俱恶,到底是詐尸還是另有隱情范舀,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布端仰,位于F島的核電站田藐,受9級(jí)特大地震影響吱七,放射性物質(zhì)發(fā)生泄漏踊餐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一吝岭、第九天 我趴在偏房一處隱蔽的房頂上張望窜管。 院中可真熱鬧稚机,春花似錦、人聲如沸赖条。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仿贬。三九已至,卻和暖如春退个,著一層夾襖步出監(jiān)牢的瞬間调炬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工刀荒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棘钞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓泼返,卻偏偏與公主長(zhǎng)得像姨拥,于是被迫代替她去往敵國(guó)和親渠鸽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柴罐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容