美文网首页Android
适配Android6.0动态权限管理

适配Android6.0动态权限管理

作者: 瑟闻风倾 | 来源:发表于2018-10-11 14:37 被阅读4次

1、应用本来在android5.0的基础上开发,换了android 7.0的系统运行该应用程序时报错:

异常信息

2、问题分析:

2.1、在Android6.0(M)之前权限在AndroidMainfest.xml文件中直接申明即可。

2.2、而在Android6.0(M)及之后权限授权机制发生了很大的变化:

(1) 普通权限:不涉及用户隐私的权限普通权限(如 手机震动、网络访问、蓝牙、NFC等)仍在AndroidMainfest.xml文件中直接申明即可;

(2)危险权限:涉及用户隐私或影响到其他应用的运行危险权限(如SD卡读写,短信、联系人、相机、电话、位置、语音等),当应用需要调用某些权限的时候,会给予用户一个通知与说明这些权限是干什么的,可以让用户有更加清醒的权限分配意识,也在一定程度上更加人性化的保护了用户的隐私。

(3) 特殊权限:比如系统级别对话框:SYSTEM_ALERT_WINDOW和修改系统设置:WRITE_SETTINGS这2个特殊权限,我们需要在startActivityForResult里调用即可,这2个权限一般不会用到,会用到的地方要么是黑科技或者是反用户体验的场景,这里就不再做过多描述。

备注:另外有一个权限READ_PHONE_STATE,我们可以通过这个权限来获取机器的唯一标识码,很多第三方统计是基于这个标识码来完成统计的,但是在我们应用一开始运行的时候,这个运行权限我们是没有的,在Application里我们也不能对权限进行获取,所以这点也需要我们去注意。

说明:对于一些比较特别的权限,比如文件的读写权限,一般在我们第一次开启APP的时候就要去获取了,就是在你引导APP启动的时候,就引导用户去获取权限,当用户拒绝的时候,应该给出弹出框并跳转对应的应用权限管理界面(需要对不同机型进行设置)。

2.3、由于Android6.0(M)及之后运行权限机制的出现,虽然对用户更友好了,但对开发者来说:我们需要对新开发的应用去做适配,在用这些权限的时候去动态重新请求系统权限并得到用户的允许授权;而之前开发的老应用运行到6.0系统上可能会发生各种崩溃需要我们去适配Android6.0动态权限管理,谷歌做了良好的适配。

3、适配Android6.0动态权限管理

(1)方法一:只要把targetSdkVersion的版本设置为低于23就可以了。

当你的应用targetSdkVersion小于23的时候,就算你运行在Android6.0系统上,它也会默认采用以前的权限管理机制。

当你的targetSdkVersion大于等于23的时候且在Andorid6.0(M)系统上,它才会采用新的这套权限管理机制。

备注:不过不建议采用这种方案,因为随着国产手机ROM的更新,比如小米,华为等也开始有部分机型进行了系统升级,所以这是种趋势。。

(2)方法二:只需要记住下面几个API方法就可以:(API23之后提供)

int checkSelfPermission(String permission) 用来检测应用是否已经具有权限

void requestPermissions(String[] permissions, int requestCode) 进行请求单个或多个权限

void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 请求权限结果回调

如调用:

//动态权限

public static final int REQUEST_PERMISSION_EXTERNAL_STORAGE_CODE = 73;//SD卡读写权限

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

//当前系统大于等于6.0

if (ContextCompat.checkSelfPermission(FySystemSettingActivity.this,Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {

//具有SD卡读写权限,具体调用代码

} else {

//不具有SD卡读写权限,需要进行权限申请

ActivityCompat.requestPermissions(FySystemSettingActivity.this,new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_EXTERNAL_STORAGE_CODE);

}

} else {

//当前系统小于6.0,直接调用代码

}

回调:

@Override

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

switch (requestCode) {

case REQUEST_PERMISSION_EXTERNAL_STORAGE_CODE:

if (grantResults.length >= 1) {

int cameraResult = grantResults[0];

boolean cameraGranted = cameraResult == PackageManager.PERMISSION_GRANTED;

if (cameraGranted) {

//具有SD卡读写权限

} else {

//不具有相关权限,给予用户提醒,比如Toast或者对话框,让用户去系统设置-应用管理里把相关权限开启

Toast.makeText(settingActivity,"不具有相关权限,请到系统设置-应用管理里把相关权限开启",Toast.LENGTH_SHORT).show();

}

}

break;

}

}

4、备注说明:

Android

相关文章

网友评论

    本文标题:适配Android6.0动态权限管理

    本文链接:https://www.haomeiwen.com/subject/mldvuftx.html