android 6.0 权限

6.0之前开发者申请各种权限,只需要在清单列表(AndroidManifest.xml)中进行声明就可以了。对开发者来说是相当便利,但对用户来说是体验不好,6.0的权限换成了用户可以随时更改的操作,类似IOS的权限申请。

常规的权限

和以前一样,在清单中申请,这里不作累述


危险权限

google是以权限组进行分类的,一旦组内的某个权限被赋予了,那么这个组的其他权限也将自动被赋予

权限组 权限
android.permission-group.CALENDAR(日历数据)
  • android.permission.READ_CALENDAR
  • android.permission.WRITE_CALENDAR
android.permission-group.CAMERA(相机)
  • android.permission.CAMERA
android.permission-group.CONTACTS(联系人)
  • android.permission.READ_CONTACTS
  • android.permission.WRITE_CONTACTS
  • android.permission.GET_ACCOUNTS
android.permission-group.LOCATION(位置)
  • android.permission.ACCESS_FINE_LOCATION
  • android.permission.ACCESS_COARSE_LOCATION
android.permission-group.MICROPHONE(麦克风)
  • android.permission.RECORD_AUDIO
android.permission-group.PHONE(电话)
  • android.permission.READ_PHONE_STATE
  • android.permission.CALL_PHONE
  • android.permission.READ_CALL_LOG
  • android.permission.WRITE_CALL_LOG
  • com.android.voicemail.permission.ADD_VOICEMAIL
  • android.permission.USE_SIP
  • android.permission.PROCESS_OUTGOING_CALLS
android.permission-group.SENSORS(传感器)
  • android.permission.BODY_SENSORS
android.permission-group.SMS(短信)
  • android.permission.SEND_SMS
  • android.permission.RECEIVE_SMS
  • android.permission.READ_SMS
  • android.permission.RECEIVE_WAP_PUSH
  • android.permission.RECEIVE_MMS
  • android.permission.READ_CELL_BROADCASTS
android.permission-group.STORAGE(存储)
  • android.permission.READ_EXTERNAL_STORAGE
  • android.permission.WRITE_EXTERNAL_STORAGE
申请实现太麻烦,使用封装的库TedPermission

权限申请详情:

//是否有权限
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对应的方法。








猜你喜欢

转载自blog.csdn.net/xxzjwdnlwx/article/details/53668831