6.0之前开发者申请各种权限,只需要在清单列表(AndroidManifest.xml)中进行声明就可以了。对开发者来说是相当便利,但对用户来说是体验不好,6.0的权限换成了用户可以随时更改的操作,类似IOS的权限申请。
常规的权限
和以前一样,在清单中申请,这里不作累述
危险权限
google是以权限组进行分类的,一旦组内的某个权限被赋予了,那么这个组的其他权限也将自动被赋予
权限组 | 权限 |
---|---|
android.permission-group.CALENDAR(日历数据) |
|
android.permission-group.CAMERA(相机) |
|
android.permission-group.CONTACTS(联系人) |
|
android.permission-group.LOCATION(位置) |
|
android.permission-group.MICROPHONE(麦克风) |
|
android.permission-group.PHONE(电话) |
|
android.permission-group.SENSORS(传感器) |
|
android.permission-group.SMS(短信) |
|
android.permission-group.STORAGE(存储) |
|
权限申请详情:
//是否有权限 int hasWriteContactsPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS); //如果没有权限 if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) { //第一次申请/或是选择不再提醒 if (!ActivityCompat.shouldShowRequestPermissionRationale(PermissionActivity.this, Manifest.permission.WRITE_CONTACTS)) { showMessageOKCancel("You need to allow access to Contacts", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCompat.requestPermissions(PermissionActivity.this, new String[]{Manifest.permission.WRITE_CONTACTS}, REQUEST_CODE_ASK_PERMISSIONS); } }); return; } //系统弹出权限申请框,申请权限 ActivityCompat.requestPermissions(PermissionActivity.this, new String[]{Manifest.permission.WRITE_CONTACTS}, REQUEST_CODE_ASK_PERMISSIONS); return; } //已经有权限之后执行 addContacts();
//系统权限申请结果回调 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case REQUEST_CODE_ASK_PERMISSIONS: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Permission Granted 允许 addContacts(); } else { // Permission Denied 拒绝 Toast.makeText(this, "WRITE_CONTACTS Denied", Toast.LENGTH_SHORT) .show(); } break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } }说明: 请求权限时,如果用户拒绝了,再次请求时 shouldShowRequestPermissionRationale() 返回 true。
第三方库PermissionsDispatcher
PermissionsDispatcher通过注解的方式,动态生成类处理运行时权限。配合插件使用,可自动生成代码。
github地址:https://github.com/hotchemi/PermissionsDispatcher
使用方法如下:
1>将下面这段代码添加到project的build.gradle文件中。
repositories {
jcenter()
maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' }
}
2>将下面的代码添加到app module的build.gradle文件中,${latest.version}填写最新的版本号,目前为2.1.3。
dependencies {
compile("com.github.hotchemi:permissionsdispatcher:${latest.version}") {
// if you don't use android.app.Fragment you can exclude support for them
exclude module: "support-v13"
}
annotationProcessor "com.github.hotchemi:permissionsdispatcher-processor:${latest.version}"
}
之后使用permissionDispatcher Plugin 生成方法
在Android Studio中选择Code——Generate——Generate Runtime Permissions,如下图所示:
生成代码
@NeedsPermission
当申请的权限被用户允许后,调用此方法。
@OnShowRationale
当第一次申请权限时,用户选择拒绝,再次申请时调用此方法,在此方法中提示用户为什么需要这个权限。
@OnPermissionDenied
当申请的权限被用户拒绝后,调用此方法
@OnNeverAskAgain
当用户点击不再询问后,调用此方法。当下次再申请权限时直接调用此方法
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); DairyCreateActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults); }
DairyCreateActivityPermissionsDispatcher.getPictureWithPermissionCheck(DairyCreateActivity.this);DairyCreateActivityPermissionsDispatcher.getPictureWithPermissionCheck(DairyCreateActivity.this);调用要申请权限的方法, DairyCreateActivityPermissionsDispatcher 是自动生成的,类方法+PermissionDispatcher , 生成特别的慢,getPictureWithPermissionCheck中,getPicture+WithPermissionCheck主成,getPicture是NeedsPermission对应的方法。