android 6.0权限申请封装
2016-08-31 11:19
337 查看
此篇文章目的在于封装android 6.0权限申请,让开发者能进行快速开发。开发者只需要在项目中添加一个工具类,在baseActivity中添加几个方法,在需要的activity中添加三个方法即可~
关于android 6.0权限问题,大家如果用api23+编译的话,应该都有遇到过crash的情况。google开发团队觉得有些隐私权限,希望得到用户许可,以弹出框的形式告诉用户,其权限流程如下:
但是系统弹框会有不再提示的问题,如果用户勾选了不再提示,就进不了app了,这样体验很差,基于此,新的权限流程如下:
如果你的activity中有用到如下权限,就需要申请权限哦~
此列表是在网上找的,关于SMS有歧义,我在项目中有用到发短信功能,但是缺不属于危险权限。
首先定义一个工具类,判断是否缺少权限:
2
3
4
5
6
7
8
9
10
11
12
13
14
然后,在你的baseActivity中作如下封装:
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中,重写以下几个方法:
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()中作初始化相关操作就好啦!
权限流程
关于android 6.0权限问题,大家如果用api23+编译的话,应该都有遇到过crash的情况。google开发团队觉得有些隐私权限,希望得到用户许可,以弹出框的形式告诉用户,其权限流程如下: 但是系统弹框会有不再提示的问题,如果用户勾选了不再提示,就进不了app了,这样体验很差,基于此,新的权限流程如下:
危险权限列表
如果你的activity中有用到如下权限,就需要申请权限哦~CALENDAR | READ_CALENDAR WRITE_CALENDAR |
---|---|
CAMERA | CAMERA |
CONTACTS | READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS |
LOCATION | ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION |
MICROPHONE | RECORD_AUDIO |
PHONE | READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS |
SENSORS | BODY_SENSORS |
SMS | SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS |
STORAGE | READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE |
封装
首先定义一个工具类,判断是否缺少权限://检查权限时,判断系统的权限集合 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()中作初始化相关操作就好啦!
相关文章推荐
- Android 6.0 权限的申请 与 封装
- Android之6.0 权限申请封装
- android 6.0以后的运行时权限申请及封装 相关记录
- Android 6.0 动态权限申请封装的处理方式
- Android实战之6.0权限申请详解及简单封装(Util方向)
- android 6.0权限申请封装
- android 6.0运行时权限的申请(微信在android 6.0上实现运行时请求权限的实现)
- android6.0 动态申请权限
- Android 6.0权限申请
- Android 6.0权限管理及其封装
- 【Android】6.0 运行时权限申请
- Android 6.0 申请权限
- Android 6.0 权限申请辅助 ----PermissionsHelper
- Android 6.0 向用户申请权限,运行时权限
- android 6.0 Permission权限兼容的封装
- Android 6.0 动态申请权限
- Android 开发技巧 - Android 6.0 以上权限大坑和权限检查基类封装
- 你必须了解的Android 6.0权限申请
- android 6.0权限动态申请
- Android 6.0 app的权限申请