Android 6.0动态申请权限

来源:互联网 发布:c语言不等于号怎么打 编辑:程序博客网 时间:2024/06/06 01:39

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 = 0; 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 = 100;        /**         * SD卡读写权限         * @param context         * @return         */    public static boolean checkWriteSDPermission(Activity context){        if (Build.VERSION.SDK_INT >= 23) {            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() != 0) {                    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 >= 23) {            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() != 0) {                    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 >= 23) {            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() != 0) {                    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 >= 23) {            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() != 0) {                    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 >= 23) {            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() != 0) {                    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 >= 23) {            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() != 0) {                    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 >= 23) {            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() != 0) {                    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 >= 23) {            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() != 0) {                    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) ;方法来提示用户。