天天看點

Android 6.0動态申請權限Android 6.0動态申請權限

Android 6.0動态申請權限

在android 6.0以下,開發者隻需要在配置清單中說明,使用者安裝APP同意APP所申請的所有權限才能進行安裝,而在android 6.0以上,開發者不僅要在配置清單中說明,對于一些危險權限還需要代碼動态申請。這些危險權限在使用者授權後才可以使用,比如調用攝像頭、讀取通訊錄、定位等。

1. 需要動态申請的權限

以下為需要動态申請的權限,共有9組,每一組隻有任何一個權限申請成功了,就預設整組的權限都可以使用。

group:android.permission-group.CONTACTS //通訊錄

permission:android.permission.WRITE_CONTACTS //寫入通訊錄

permission:android.permission.GET_ACCOUNTS //通路GMail賬戶清單

permission:android.permission.READ_CONTACTS //讀取通訊錄

group:android.permission-group.PHONE //手機

permission:android.permission.READ_CALL_LOG //讀取通話記錄

permission:android.permission.READ_PHONE_STATE //讀取電話狀态

permission:android.permission.CALL_PHONE //撥打電話

permission:android.permission.WRITE_CALL_LOG //寫入通話記錄

permission:android.permission.USE_SIP //允許程式使用SIP視訊服務

permission:android.permission.PROCESS_OUTGOING_CALLS //允許程式監視,修改或放棄播出電話

permission:com.android.voicemail.permission.ADD_VOICEMAIL//允許應用程式添加系統中的語音郵件。

group:android.permission-group.CALENDAR //系統月曆

permission:android.permission.READ_CALENDAR //讀取使用者的日程資訊

permission:android.permission.WRITE_CALENDAR //寫入使用者的日程資訊

group:android.permission-group.CAMERA //攝像頭

permission:android.permission.CAMERA //允許調用攝像頭

group:android.permission-group.SENSORS //手機傳感器

permission:android.permission.BODY_SENSORS//允許擷取傳感器資料

group:android.permission-group.LOCATION //定位權限

permission:android.permission.ACCESS_FINE_LOCATION //擷取精準定位,通過GPS晶片

permission:android.permission.ACCESS_COARSE_LOCATION//通過wifi或基站擷取粗略定位

group:android.permission-group.STORAGE //存儲權限

permission:android.permission.READ_EXTERNAL_STORAGE //允許讀取外部存儲

permission:android.permission.WRITE_EXTERNAL_STORAGE //允許寫入外部存儲

group:android.permission-group.MICROPHONE //錄音權限

permission:android.permission.RECORD_AUDIO //允許通過麥克風來錄音

group:android.permission-group.SMS //短信權限

permission:android.permission.READ_SMS //允許讀取短信

permission:android.permission.RECEIVE_WAP_PUSH//允許接收WAP PUSH資訊

permission:android.permission.RECEIVE_MMS //允許接收彩信

permission:android.permission.RECEIVE_SMS //允許接收短信

permission:android.permission.SEND_SMS//允許發送短信

permission:android.permission.READ_CELL_BROADCASTS //擷取小區廣播

2. 危險權限申請步驟

2.1 在配置清單中添加所需要申請的權限

如 在配置清單中添加:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
           

2.2 申請權限步驟

2.2.1 檢查權限

if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
    //沒有授權
  }else{
  //已經授權過了
}
           

或者通過以下方式檢查是否授權了

if (PackageManager.PERMISSION_GRANTED!=ContextCompat.checkSelfPermission(activity,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
   //沒有授權  
}else{
    //已經授權過了
}
           

2.2.2 請求權限申請

通過ActivityCompat.requestPermissions(final @NonNull Activity activity, final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode) 方法申請權限,通過第二個參數可以看出一次可以申請多個權限。

2.2.3 申請權限回調

在Activity中重寫如下函數

/**
     * 
     * @param requestCode  請求碼
     * @param permissions 請求的權限數組
     * @param grantResults 請求每個權限的狀态:允許還是拒絕。對應于每個權限
     */
 @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == WRITE_PERMISSION_REQ_CODE){
            for (int i = ; i < grantResults.length; i++) {
                if (grantResults[i] != PackageManager.PERMISSION_GRANTED){
                  //如果拒絕了 
                  //改方法主要用于給使用者一個申請權限的解釋,該方法隻有在使用者在上一次已經拒絕過
                  //你的權限申請。
 boolean isTip =ActivityCompat.shouldShowRequestPermissionRationale(this,permissions[i]);
                    if (isTip){
                      //表明使用者沒有徹底禁止彈出請求權限
                    }else {
                      //表面使用者徹底禁止了彈出請求權限,可以提示使用者然後跳到設定中打開權限
                    }

                }else{
                 //允許了
                }

            }
        }
    }
           

2.3 權限申請的封裝

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.PermissionChecker;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @Description:權限檢測
 * @author: liuxin
 * @date: 2017/10/26
 */
public class PermissionUtils {
    public static final String TAG = PermissionUtils.class.getSimpleName();
    public static final int WRITE_PERMISSION_REQ_CODE = ;


        /**
         * SD卡讀寫權限
         * @param context
         * @return
         */
    public static boolean checkWriteSDPermission(Activity context){
        if (Build.VERSION.SDK_INT >= ) {
            try {
                List<String> permissions = new ArrayList<>();
                if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                }
                if (permissions.size() != ) {
                    ActivityCompat.requestPermissions(context,
                            (String[]) permissions.toArray(new String[permissions.size()]),
                            WRITE_PERMISSION_REQ_CODE);
                    return false;
                }
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
        return true;
    }

    /**
     * 視訊錄制權限申請
     * @param context
     * @return
     */
    public static boolean checkVideoRecordPermission(Activity context){
        if (Build.VERSION.SDK_INT >= ) {
            try {
                List<String> permissions = new ArrayList<>();
                if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                }
                if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.CAMERA)) {
                    permissions.add(Manifest.permission.CAMERA);
                }
                if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.RECORD_AUDIO)) {
                    permissions.add(Manifest.permission.RECORD_AUDIO);
                }

                if (permissions.size() != ) {
                    ActivityCompat.requestPermissions(context,
                            (String[]) permissions.toArray(new String[permissions.size()]),
                            WRITE_PERMISSION_REQ_CODE);
                    return false;
                }
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
        return true;
    }


    /**
     * 視訊相機權限申請
     * @param context
     * @return
     */
    public static boolean checkCameraPermission(Activity context){
        if (Build.VERSION.SDK_INT >= ) {
            try {
                List<String> permissions = new ArrayList<>();
                if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                }
                if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.CAMERA)) {
                    permissions.add(Manifest.permission.CAMERA);
                }
                if (permissions.size() != ) {
                    ActivityCompat.requestPermissions(context,
                            (String[]) permissions.toArray(new String[permissions.size()]),
                            WRITE_PERMISSION_REQ_CODE);
                    return false;
                }
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
        return true;
    }



    /**
     * 音頻錄制權限申請
     * @param context
     * @return
     */
    public static boolean checkVoiceRecordPermission(Activity context){
        if (Build.VERSION.SDK_INT >= ) {
            try {
                List<String> permissions = new ArrayList<>();
                if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                }
                if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.RECORD_AUDIO)) {
                    permissions.add(Manifest.permission.RECORD_AUDIO);
                }
                if (permissions.size() != ) {
                    ActivityCompat.requestPermissions(context,
                            (String[]) permissions.toArray(new String[permissions.size()]),
                            WRITE_PERMISSION_REQ_CODE);
                    return false;
                }
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
        return true;
    }

    /**
     * 定位權限擷取
     * @param context
     * @return
     */
    public static boolean checkLocationPermission(Activity context){
        if (Build.VERSION.SDK_INT >= ) {
            try {
                List<String> permissions = new ArrayList<>();
                if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)) {
                    permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
                }

                if (permissions.size() != ) {
                    ActivityCompat.requestPermissions(context,
                            (String[]) permissions.toArray(new String[permissions.size()]),
                            WRITE_PERMISSION_REQ_CODE);
                    return false;
                }
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
        return true;
    }

    /**
     * 手機狀态相關
     * @param context
     * @return
     */
    public static boolean checkPhoneStatePermission(Activity context){
        if (Build.VERSION.SDK_INT >= ) {
            try {
                List<String> permissions = new ArrayList<>();
                if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.READ_PHONE_STATE)) {
                    permissions.add(Manifest.permission.READ_PHONE_STATE);
                }
                if (permissions.size() != ) {
                    ActivityCompat.requestPermissions(context,
                            (String[]) permissions.toArray(new String[permissions.size()]),
                            WRITE_PERMISSION_REQ_CODE);
                    return false;
                }
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
        return true;
    }
       /**
     * 擷取手機短信
     *
     * @param context
     * @return
     */
    public static boolean checkPhoneMessagePermission(Activity context) {
        if (Build.VERSION.SDK_INT >= ) {
            try {
                List<String> permissions = new ArrayList<>();
                if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.READ_SMS)) {
                    permissions.add(Manifest.permission.READ_SMS);
                }
                if (permissions.size() != ) {
                    ActivityCompat.requestPermissions(context,
                            (String[]) permissions.toArray(new String[permissions.size()]),
                            WRITE_PERMISSION_REQ_CODE);
                    return false;
                }
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
        return true;
    }

    /**
     * 擷取手機通訊錄
     *
     * @param context
     * @return
     */
    public static boolean checkPhoneContactsPermission(Activity context) {
        if (Build.VERSION.SDK_INT >= ) {
            try {
                List<String> permissions = new ArrayList<>();
                if (PackageManager.PERMISSION_GRANTED != PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.READ_CONTACTS)) {
                    permissions.add(Manifest.permission.READ_CONTACTS);
                }
                if (permissions.size() != ) {
                    ActivityCompat.requestPermissions(context,
                            (String[]) permissions.toArray(new String[permissions.size()]),
                            WRITE_PERMISSION_REQ_CODE);
                    return false;
                }
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
        return true;
    }
}
           

通過在Activity中調用該類的某個靜态方法來請求檢測權限。如有需要可以重寫 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) ;方法來提示使用者。