AndPermission
这个开源库名叫AndPermission:https://github.com/yanzhenjie/AndPermission,经过我的实践是完全解决了上述问题,推荐大家使用,有兴趣的朋友可以去star下。
- AndroidStudio使用方法,gradle一句话远程依赖
compile 'com.yanzhenjie:permission:1.0.5'
Or Maven:
<dependency>
<groupId>com.yanzhenjie</groupId>
<artifactId>permission</artifactId>
<version>1.0.5</version>
<type>pom</type>
</dependency>
申请权限
一个权限
AndPermission.with(this)
.requestCode(100)
.permission(Manifest.permission.WRITE_CONTACTS)
.send();
多个权限
AndPermission.with(this)
.requestCode(100)
.permission(Manifest.permission.WRITE_CONTACTS, Manifest.permission.READ_SMS)
.send();
在使用到特殊权限时,只需要在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)) {
} else {
AndPermission.with(this)
.requestCode(100)
.permission(Manifest.permission.WRITE_CONTACTS, Manifest.permission.READ_SMS)
.send();
}
回调结果
方式一:利用Listener方式回调
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
AndPermission.onRequestPermissionsResult(requestCode, permissions, grantResults, listener);
}
private PermissionListener listener = new PermissionListener() {
@Override
public void onSucceed(int requestCode, List<String> grantedPermissions) {
if(requeust == 100) {
} else if(requestCode == 101) {
}
}
@Override
public void onFailed(int requestCode, 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
- 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) {
AndPermission.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
@PermissionYes(100)
private void getLocationYes(List<String> grantedPermissions) {
}
@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) ->
AndPermission.rationaleDialog(PermissionActivity.this, rationale).show()
)
.send()
方式二:自定义对话框
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>;
}
到这里就结束拉,感兴趣的同学可以去看看。
版权声明:转载必须注明本文转自严振杰的博客: http://blog.yanzhenjie.com