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

android 6.0权限申请封装

2016-08-31 11:19 337 查看
此篇文章目的在于封装android 6.0权限申请,让开发者能进行快速开发。开发者只需要在项目中添加一个工具类,在baseActivity中添加几个方法,在需要的activity中添加三个方法即可~


权限流程

关于android 6.0权限问题,大家如果用api23+编译的话,应该都有遇到过crash的情况。google开发团队觉得有些隐私权限,希望得到用户许可,以弹出框的形式告诉用户,其权限流程如下: 



但是系统弹框会有不再提示的问题,如果用户勾选了不再提示,就进不了app了,这样体验很差,基于此,新的权限流程如下: 




危险权限列表

如果你的activity中有用到如下权限,就需要申请权限哦~
CALENDARREAD_CALENDAR 

WRITE_CALENDAR
CAMERACAMERA
CONTACTSREAD_CONTACTS 

WRITE_CONTACTS 

GET_ACCOUNTS
LOCATIONACCESS_FINE_LOCATION 

ACCESS_COARSE_LOCATION
MICROPHONERECORD_AUDIO
PHONEREAD_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS
SENSORSBODY_SENSORS
SMSSEND_SMS RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS
STORAGEREAD_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE
此列表是在网上找的,关于SMS有歧义,我在项目中有用到发短信功能,但是缺不属于危险权限。


封装

首先定义一个工具类,判断是否缺少权限:
//检查权限时,判断系统的权限集合
public boolean permissionSet(String... permissions) {
for (String permission : permissions) {
if (isLackPermission(permission)) {//是否添加完全部权限集合
return true;
}
}
return false;
}

//检查系统权限是,判断当前是否缺少权限(PERMISSION_DENIED:权限是否足够)
private boolean isLackPermission(String permission) {
return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

然后,在你的baseActivity中作如下封装:
//首先声明权限授权
public static final int PERMISSION_DENIEG = 1;//权限不足,权限被拒绝的时候
public static final int PERMISSION_REQUEST_CODE = 0;//系统授权管理页面时的结果参数
public static final String PACKAGE_URL_SCHEME = "package:";//权限方案
public CheckPermission checkPermission;//检测权限类的权限检测器
private boolean isrequestCheck = true;//判断是否需要系统权限检测。防止和系统提示框重叠

public abstract int initContentID();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

initContentID();
process(savedInstanceState);
}

//显示对话框提示用户缺少权限
public void showMissingPermissionDialog() {

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.help);//提示帮助
builder.setMessage(R.string.string_help_text);

//如果是拒绝授权,则退出应用
//退出
builder.setNegativeButton(R.string.quit, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

finish();
}
});
//打开设置,让用户选择打开权限
builder.setPositiveButton(R.string.settings, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startAppSettings();//打开设置
}
});
builder.setCancelable(false);
builder.show();
}

//获取全部权限
public boolean hasAllPermissionGranted(int[] grantResults) {
for (int grantResult : grantResults) {
if (grantResult == PackageManager.PERMISSION_DENIED) {
return false;
}
}
return true;
}

//打开系统应用设置(ACTION_APPLICATION_DETAILS_SETTINGS:系统设置权限)
public void startAppSettings() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));
startActivity(intent);
}

//请求权限去兼容版本
public void requestPermissions(String... permission) {
ActivityCompat.requestPermissions(this, permission, PERMISSION_REQUEST_CODE);

}

/**
* 用于权限管理
* 如果全部授权的话,则直接通过进入
* 如果权限拒绝,缺失权限时,则使用dialog提示
*
* @param requestCode  请求代码
* @param permissions  权限参数
* @param grantResults 结果
*/
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (PERMISSION_REQUEST_CODE == requestCode && hasAllPermissionGranted(grantResults)) //判断请求码与请求结果是否一致
{
isrequestCheck = true;//需要检测权限,直接进入,否则提示对话框进行设置
getAllGrantedPermission();
} else {
//提示对话框设置
isrequestCheck = false;
showMissingPermissionDialog();//dialog
}
}

/*
* 当获取到所需权限后,进行相关业务操作
*/
public void getAllGrantedPermission() {

}

protected void process(Bundle savedInstanceState) {
if (getPermissions() != null) {

checkPermission = new CheckPermission(this);
if (checkPermission.permissionSet(getPermissions())) {
requestPermissions(getPermissions());     //去请求权限
} else {
getAllGrantedPermission();
}
}
}

@Override
protected void onResume() {
super.onResume();

//根据activity生命周期,onRestart()->onResume()
//此处表示从系统设置页面返回后,检查用户是否将所需的权限打开
if (!isrequestCheck) {
if (getPermissions() != null) {
if (checkPermission.permissionSet(getPermissions())) {

showMissingPermissionDialog();//dialog
} else {
//获取全部权限,走正常业务
getAllGrantedPermission();
}
}
} else {
isrequestCheck = true;
}
}

public String[] getPermissions() {
return null;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134

最后,在你的activity中,重写以下几个方法:
static final String[] PERMISSION = new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,// 写入权限
Manifest.permission.READ_EXTERNAL_STORAGE,  //读取权限
Manifest.permission.READ_PHONE_STATE,        //读取设备信息
Manifest.permission.ACCESS_COARSE_LOCATION, //百度定位
Manifest.permission.ACCESS_FINE_LOCATION,
};

//布局id上送到BaseActivity
@Override
public int initContentID() {
return R.layout.activity_main;
}

@Override
protected void process(Bundle savedInstanceState) {
super.process(savedInstanceState);

//如果有什么需要初始化的,在这里写就好~

}

@Override
public void getAllGrantedPermission() {
//当获取到所需权限后,进行相关业务操作

super.getAllGrantedPermission();
}

@Override
public String[] getPermissions() {
return PERMISSION;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

当然了,如果你的activity中不包含危险权限,也就不用重写方法getPermissions()和getAllGrantedPermission(),你只需要在方法process()中作初始化相关操作就好啦!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: