android6.0的权限对开发人员来说,确实不太友好,不像只需安装时申请一次权限则终身都有,6.0的有限有关安全的权限必须在app运行过程中再次申请,原生的步骤比较麻烦,还好找到了一个不错的框架,用法大概如下
参考github: https://github.com/hotchemi/PermissionsDispatcher(大牛写的,我只是代码的搬运工)
1,导包:
app module中
dependecies{
compile 'com.github.hotchemi:permissionsdispatcher:2.+'
apt 'com.github.hotchemi:permissionsdispatcher-processor:2.+'
}
project build.gradle:
buildscript{
dependencis{
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
2,注解:
在类上注解上运行时权限:
@RuntimePermissions在相应方法上注解:
public class ThirdActivity extends AppCompatActivity {
比如该方法需要写入SD卡权限:
@NeedsPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)运行时申请权限有三种结果,结果通过下面这个方法返回,对结果进行处理,
void initFromSDcard() {
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// NOTE: delegate the permission handling to generated method
ThirdActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
1,允许,这个不多说;
2,禁止;
3,禁止并且不在提醒;
如果用户选择禁止,写一个回调方法,用于提醒用户设置权限,
由于只是禁止一次,再打开该页面时回调申请权限方法,可以再次申请:
@OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void showDenied() {
Toast.makeText(this, R.string.permission_denied, Toast.LENGTH_SHORT).show();
}
如果用户不但禁止,还设置了不在提醒,这个拒绝的就很彻底了,也写一个回调方法用于提醒用户://再次申请权限
@OnShowRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void showRationaleForCamera(final PermissionRequest request) {
new AlertDialog.Builder(this)
.setMessage(R.string.permission_rationale)
.setPositiveButton(R.string.button_allow, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.proceed();//获得权限
}
})
.setNegativeButton(R.string.button_deny, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.cancel();
}
})
.show();
}
@OnNeverAskAgain(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void showNeverAsk() {
Toast.makeText(this, R.string.permission_neverask, Toast.LENGTH_SHORT).show();
}
3,绑定注解器与类
千万别忘了,这一步,不然都是白费
注解以后会有一个【当前类名+PermissionDispcher】自动生成的类,
然后调用的方法就是你注解NeedPermission的方法后生成的withCheckk方法,
ThirdActivityPermissionsDispatcher.initFromSDcardWithCheck(this);