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

Android-版本6.0权限申请AndPermission第三方开源库

2017-09-26 09:57 447 查看


AndPermission

这个开源库名叫AndPermission:https://github.com/yanzhenjie/AndPermission,经过我的实践是完全解决了上述问题,推荐大家使用,有兴趣的朋友可以去star下。
AndroidStudio使用方法,gradle一句话远程依赖
compile 'com.yanzhenjie:permission:1.0.5'
1
1

Or Maven:
<dependency>
<groupId>com.yanzhenjie</groupId>
<artifactId>permission</artifactId>
<version>1.0.5</version>
<type>pom</type>
</dependency>
1
2
3
4
5
6
1
2
3
4
5
6
Eclipse 下载jar包,或者下载源码


申请权限

一个权限
AndPermission.with(this)
.requestCode(100)
.permission(Manifest.permission.WRITE_CONTACTS)
.send();
1
2
3
4
1
2
3
4

多个权限
AndPermission.with(this)
.requestCode(100)
.permission(Manifest.permission.WRITE_CONTACTS, Manifest.permission.READ_SMS)
.send();
1
2
3
4
1
2
3
4

在使用到特殊权限时,只需要在
Activity
Fragment
中直接调用,等到
AndPermission
回调时即可执行相应的代码。

注意 

1. 如果你的
Activity
继承的是
AppCompatActivity
FragmentActivity
或者它们的子类,那么你直接请求权限就可以。 

2. 如果你的
Fragment
继承的是
android.support.v4.app.Fragment
或者它的子类,那么你直接请求权限就可以。 

3. 如果你继承的是
android.app.Activity
android.app.Fragment
、在6.0以下的手机是没有
onRequestPermissionsResult()
方法的,所以需要在申请权限前判断:
// 先判断是否有权限。
if(AndPermission.hasPermission(this, Manifest.permission.READ_SMS)) {
// 有权限,直接do anything.
} else {
// 申请权限。
AndPermission.with(this) .requestCode(100) .permission(Manifest.permission.WRITE_CONTACTS, Manifest.permission.READ_SMS) .send();
}
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10


回调结果

方式一:利用Listener方式回调
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
// 只需要调用这一句,其它的交给AndPermission吧,最后一个参数是PermissionListener。
AndPermission.onRequestPermissionsResult(requestCode, permissions, grantResults, listener);
}

private PermissionListener listener = new PermissionListener() {
@Override
public void onSucceed(int requestCode, List<String> grantedPermissions) {
// 权限申请成功回调。
if(requeust == 100) {
// TODO 相应代码。
} else if(requestCode == 101) {
// TODO 相应代码。
}
}

@Override
public void onFailed(int requestCode, List<String> deniedPermissions) {
// 权限申请失败回调。

// 用户否勾选了不再提示并且拒绝了权限,那么提示用户到设置中授权。
if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) {
// 第一种:用默认的提示语。
AndPermission.defaultSettingDialog(this, REQUEST_CODE_SETTING).show();

// 第二种:用自定义的提示语。
// AndPermission.defaultSettingDialog(this, REQUEST_CODE_SETTING)
// .setTitle("权限申请失败")
// .setMessage("我们需要的一些权限被您拒绝或者系统发生错误申请失败,请您到设置页面手动授权,否则功能无法正常使用!")
// .setPositiveButton("好,去设置")
// .show();

// 第三种:自定义dialog样式。
// SettingService settingService =
//    AndPermission.defineSettingDialog(this, REQUEST_CODE_SETTING);
// 你的dialog点击了确定调用:
// settingService.execute();
// 你的dialog点击了取消调用:
// settingService.cancel();
}
}
};
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
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

方式二:利用注解回调 

只需要重写Activity/Fragment的一个方法,然后提供一个授权时回调的方法即可:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
// 只需要调用这一句,第一个参数是当前Acitivity/Fragment,回调方法写在当前Activity/Framgent。
AndPermission.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}

// 成功回调的方法,用注解即可,里面的数字是请求时的requestCode。
@PermissionYes(100)
private void getLocationYes(List<String> grantedPermissions) {
// TODO 申请权限成功。
}

// 失败回调的方法,用注解即可,里面的数字是请求时的requestCode。
@PermissionNo(100)
private void getLocationNo(List<String> deniedPermissions) {
// 用户否勾选了不再提示并且拒绝了权限,那么提示用户到设置中授权。
if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) {
// 第一种:用默认的提示语。
AndPermission.defaultSettingDialog(this, REQUEST_CODE_SETTING).show();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

如果你会用了,你就可以大刀阔斧的干了,博客中讲到的各种复杂逻辑,AndPermission自动完成。


Rationale拒绝一次后,再次提示用户权限作用

方式一:使用AndPermssion默认MD风格对话框
AndPermission.with(this)
.requestCode(REQUEST_CODE_PERMISSION_LOCATION)
.permission(Manifest.permission.ACCESS_FINE_LOCATION)
.rationale((requestCode, rationale) ->
// 此对话框可以自定义,调用rationale.resume()就可以继续申请。
AndPermission.rationaleDialog(PermissionActivity.this, rationale).show()
)
.send()
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8

方式二:自定义对话框
AndPermission.with(this)
.requestCode(REQUEST_CODE_PERMISSION_LOCATION)
.permission(Manifest.permission.ACCESS_FINE_LOCATION)
.rationale(rationaleListener)
.send()

/**
* Rationale支持,这里自定义对话框。
*/
private RationaleListener rationaleListener = (requestCode, rationale) -> {
AlertDialog.build(this)
.setTitle("友好提醒")
.setMessage("您已拒绝过定位权限,没有定位权限无法为您推荐附近妹子,请把定位权限赐给我吧!")
.setPositiveButton("好,给你", (dialog, which) -> {
rationale.resume();
})
.setNegativeButton("我拒绝", (dialog, which) -> {
rationale.cancel();
}).show();
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20


混淆

1. 如果使用Listener接受回调结果,不用任何配置。

2. 使用注解的方式回调结果,在proguard-rules.pro中添加如下配置
-keepclassmembers class ** {
@com.yanzhenjie.permission.PermissionYes <methods>;
}
-keepclassmembers class ** {
@com.yanzhenjie.permission.PermissionNo <methods>;
}
1
2
3
4
5
6
1
2
3
4
5
6

到这里就结束拉,感兴趣的同学可以去看看。

版权声明:转载必须注明本文转自严振杰的博客: http://blog.yanzhenjie.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: