您的位置:首页 > 移动开发 > Android开发

Android 6.0动态申请权限

2017-10-23 19:47 369 查看

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) ;方法来提示用户。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: