Android碎片化太严重不同手机进行适配难度非常大,可想而知搞android是件多难的事情,然而在不同手机产商中在动态申请权限的时候有些就出问题了,会一直返回true,从而没有进行申请权限导致无法执行业务代码,在Github搜了一下看到AndPermission就顺便试了一下,没想到这个权限框架不仅封装的简单采用链式调用,并且最大程度适配国内各大产商的ROM。
具体使用
首先添加依赖
Gradle
implementation 'com.yanzhenjie:permission:2.0.0-rc4'
Maven
<dependency>
<groupId>com.yanzhenjie</groupId>
<artifactId>permission</artifactId>
<version>2.0.0-rc4</version>
</dependency>
//混淆
-dontwarn com.yanzhenjie.permission.**
请求单个权限
//注意,这里申请的权限是使用Permission这个类下的,而不是系统的Manifest.permission.xxx
AndPermission.with(this)
.permission(Permission.WRITE_EXTERNAL_STORAGE)
.onGranted(new Action() {
@Override
public void onAction(List<String> permissions) {
//申请成功.
}
}).onDenied(new Action() {
@Override
public void onAction(List<String> permissions) {
//申请失败
}
})
.start();
请求多个权限
//这里使用Permission.Group.你申请的权限组名称
AndPermission.with(this)
.permission(Permission.Group.SMS)
.onGranted(new Action() {
@Override
public void onAction(List<String> permissions) {
//申请成功.
}
}).onDenied(new Action() {
@Override
public void onAction(List<String> permissions) {
//申请失败
}
}).start();
请求单个权限组
//这里使用Permission.Group.你申请的权限组名称
AndPermission.with(this)
.permission(Permission.Group.SMS)
.onGranted(new Action() {
@Override
public void onAction(List<String> permissions) {
//申请成功.
}
}).onDenied(new Action() {
@Override
public void onAction(List<String> permissions) {
//申请失败
}
}).start();
请求多个权限组
AndPermission.with(this)
.permission( Permission.Group.STORAGE,
Permission.Group.CAMERA)
.onGranted(new Action() {
@Override
public void onAction(List<String> permissions) {
//申请成功.
}
}).onDenied(new Action() {
@Override
public void onAction(List<String> permissions) {
//申请失败
}
}).start();
当用户点击拒绝时弹框让用户选择
AndPermission.with(this)
.permission(Permission.ACCESS_FINE_LOCATION)
.rationale(mRationale) //变动的是这边
.onGranted(new Action() {
@Override
public void onAction(List<String> permissions) {
//申请成功.
}
}).onDenied(new Action() {
@Override
public void onAction(List<String> permissions) {
//申请失败.
}
}).start();
private Rationale mRationale = new Rationale() {
@Override
public void showRationale(Context context, List<String> permissions,
final RequestExecutor executor) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("请求权限")
.setMessage((CharSequence) Permission.transformText(context, permissions))
.setPositiveButton("同意", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
executor.execute();
}
})
.setNegativeButton("决绝", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
executor.cancel();
}
}).show();
}
};
当用户点击拒绝并不再提醒时还是继续弹框让用户选择
AndPermission.with(this)
.permission(Permission.CAMERA)
.onGranted(new Action() {
@Override
public void onAction(List<String> permissions) {
//申请成功.
}
}).onDenied(new Action() {
@Override
public void onAction(List<String> permissions) {
//申请失败
if (AndPermission.hasAlwaysDeniedPermission(MainActivity.this, permissions)) {
// 这些权限被用户总是拒绝。
final SettingService settingService = AndPermission.permissionSetting(MainActivity.this);
//创建对话框让用户同意使用该权限
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("请求权限")
.setMessage((CharSequence) Permission.transformText(MainActivity.this, permissions))
.setPositiveButton("同意", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
settingService.execute();
}
})
.setNegativeButton("决绝", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
settingService.cancel();
}
}).show();
}
}
}).start();
我的手机是360 n5,在运行demo的时候只要点击拒绝会再次弹出系统框让我选择,从而就没有回调 mRationale中的showRationale方法。这就是每个系统的区别。
注意一下几点
1.请求单个权限或者权限组的时候使用的是Permission这个类下的
如:Permission.WRITE_EXTERNAL_STORAGE
2.AndPermission可以在任何地方使用
如:AndPermission.with(activity/fragment/context)
3.当用户拒绝时想要再次申请调用Rationale方法,在该方法中去申请
4.AndPermission.hasAlwaysDeniedPermission只能在onDenied()的回调中调用,不能在其它地方使用
网友评论