Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 6.0權限管理,sdk)=23請求權限

Android 6.0權限管理,sdk)=23請求權限

編輯:關於Android編程

如果APP運行在Android 6.0或以上版本的手機,並且target sdk>=23,那麼在使用一些相對敏感的權限時,需要征求用戶的許可。比如讀寫sdcard,攝像,聯系人信息等。

 

這裡寫圖片描述

 

android 6.0發布幾個月之後,升級率很低,很少應用會使用sdk23編譯項目,如果要編譯,就必須了解request權限的一些事。

一,Android 6.0 運行時權限

Android 6.0不僅UI改進很多,體驗也不錯哦。仿照iOS權限做法,在原有的AndroidManifest.xml聲明權限的基礎上,新增了運行時權限動態檢測,以下權限都是dangerous permissions ,需要在運行時判斷:
1. 身體傳感器
2. 日歷 攝像頭
3. 通訊錄
4. 地理位置
5. 麥克風
6. 電話
7. 短信
8. 存儲空間
運行時權限處理

PS:targetSdkVersion小於23的應用默認授予了所申請的所有權限,所以如果你以前的APP設置的targetSdkVersion低於23,也能正常使用。等於或者大於23,則必須 request permission,否則會崩潰閃退。

二,聲明目標SDK版本

我們需要在build.gradle中聲明targetSdkVersion為23.

android {
 compileSdkVersion 23
 buildToolsVersion "23.0.2"

 defaultConfig {
     applicationId "com.youapp"
     minSdkVersion 14
     targetSdkVersion 23
     versionCode 1
     versionName "1.0"
 }

三,檢查並request權限

我們需要在用到權限的地方,檢查是否已經擁有權限,比如讀寫外置SD卡的權限,我們在寫入之前檢查是否有權限,沒有則申請權限,for exsample:

private void requestContactPermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {
            //申請 WRITE_CONTACTS 權限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS},
                    REQUEST_CODE_WRITE_CONTACTS);
        }
    }

四,用戶許可與否的回調處理。

權限申請後,用戶選擇後,可能allow,可能deny。回調onRequestPermissionsResult方法, 該方法類似於onActivityResult。如果是fragment,最好是使用父fragment,但不是使用ActivityCompat。建議使用getParentFragment().requestPermissions方法。
兼容庫support-v4中的方法有:
ContextCompat.checkSelfPermission()
ActivityCompat.requestPermissions()
ActivityCompat.OnRequestPermissionsResultCallback
ActivityCompat.shouldShowRequestPermissionRationale()

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

五,根據requestCode和grantResults(授權結果)做相應的處理。

private void handleGrantResults(int requestCode, int[] grantResults) {
      if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {
          if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
              // Permission Granted 獲得權限後執行xxx
          } else {
              // Permission Denied 拒絕後xx的操作。
          }
      }
  }

六,用戶拒絕了怎麼處理?

如果用戶拒絕了一次,後面再申請,會出現不再提醒的選項,再次拒絕,你的app不作後續處理,就嗝屁了。功能肯定受限,沒法用了。 這時候怎麼辦呢?用戶的行為我們不清楚,得預防一下。
我們檢測下是否拒絕了兩次或以上,DIY給個提示。比如申請寫聯系人的權限。

private void handleContactPermission() {
        if (Integer.parseInt(Build.VERSION.SDK)>=23) {
            int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS);
            if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
                if (!shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) {
                    showMessageOKCancel("You need to allow access to Contacts",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    requestContactPermission();//確定後申請權限。
                                }
                            });
                    return;
                }
                requestContactPermission();//沒有權限的話,申請。
            }
        }

github已經有一些封裝好的permissionUtil,大家可以下載學習。不足之處,後續完善。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved