由于国内ROM比较多,所以权限适配比较难做,我司的权限适配采用第三方库:permissionsdispatcher来做适配。当然如果你不想去做适配的话可以去设置targetSdkVersion小于23,但这样做的话google官方是不推荐的,同样个人觉得运行时权限可以给用户带来更好的体验和安全。
用法:
1、 引入:
在你的app/build下
compile("com.github.hotchemi:permissionsdispatcher:3.0.1") {
// if you don't use android.app.Fragment you can exclude support for them
exclude module: "support-v13"
}
annotationProcessor "com.github.hotchemi:permissionsdispatcher-processor:3.0.1"
当然权限申请提供了一个一键生成插件:
这样就可以像用butterKnife的插件一样了。
看怎么玩的:
1、alt+insert快捷键
2、 如图:
最上面是你要申请的权限,下面左侧是几个注解方法:
分别是:
需要的权限。
权限遭到拒绝后,再次申请
权限未授权的回调方法
用户拒绝权限且选择了不再提示
生成的代码大概就是这样子:
@RuntimePermissions
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MainActivityPermissionsDispatcher.needsPermissionWithPermissionCheck(this);
}
@NeedsPermission({Manifest.permission.CALL_PHONE, Manifest.permission.READ_EXTERNAL_STORAGE})
void needsPermission() {
Toast.makeText(this, "call 10086", Toast.LENGTH_SHORT).show();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
@OnShowRationale({Manifest.permission.CALL_PHONE, Manifest.permission.READ_EXTERNAL_STORAGE})
void showRationale(final PermissionRequest request) {
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("需要您授权存储、设备类型权限,否则将影响您的使用")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
request.cancel();
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.proceed();
}
})
.create()
.show();
}
@OnPermissionDenied({Manifest.permission.CALL_PHONE, Manifest.permission.READ_EXTERNAL_STORAGE})
void permissionDenied() {
Toast.makeText(this, "未授权", Toast.LENGTH_SHORT).show();
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("需要您授权存储、设备类型权限,否则将影响您的使用")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MainActivityPermissionsDispatcher.needsPermissionWithPermissionCheck(MainActivity.this);
}
})
.create()
.show();
}
@OnNeverAskAgain({Manifest.permission.CALL_PHONE, Manifest.permission.READ_EXTERNAL_STORAGE})
void neverAskAgain() {
Toast.makeText(this, "不再询问", Toast.LENGTH_SHORT).show();
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("您已经禁止权限,需要去授权中心手动设置")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent localIntent = new Intent();
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 9) {
localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
localIntent.setData(Uri.fromParts("package", getPackageName(), null));
}
startActivity(localIntent);
}
})
.create()
.show();
}
}
以上是一个测试demo
遇到问题:
1、
刚开始添加依赖的时候,MainActivityPermissionsDispatcher
这个类怎么都找不到,后来google一把说,要rebuild,但是试了一下没有效果,然后我说重启AS,同样没效果,其实重新build和重启AS都一样,都是为了rebuild project。后来我重启了下电脑,可以了。至今也没弄明白为什么刚开始找不到这个类。官网说这个类是rebuild后生成的。
2、
申请流程:
一、 正常授权:
二、 未授权:提示用户授权,并且说明为什么要授权,有时权限必须要有,可以提示“xxx权限需要授权,若不授权则会影响用户使用“,若用户仍然选择不授权,则finish()应用,因为有些权限不授权却是影响app运行,如:获取设备ID,由于网络传输需要获取设备ID。
三、 用户选择“不再提示“既不再询问,也需要提示,为什么需要权限,且要引导用户去设置中心去手动开启权限。
四、 适配机型:
华为、oppo、三星、vivo、小米、一加(以上品牌的部分机型)
不过vivo、一加手机出现了问题:
Vivo:
进来系统会直接拒绝授权,但会弹窗提示,设置允许后,并不会去执行操作,而是第二次再进来才会去操作。
选择拒绝后,再次进来并不会弹窗提示。
一加:
拒绝后再次进来会询问,但勾选“不再询问“,下次进来不会弹窗提示。
设置允许,不会执行操作
五、当然还有其他第三方库,如: easypermissions
这是google出的权限申请库,但是对于国内厂商的手机来说,兼容性超级差,vivo、oppo不会提示授权,直接pass,还有华为的拒绝后,再次进入弹窗有问题