欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android6.0动态权限,以及如何同时授予多个权限,当用户禁用的后续处理方法

程序员文章站 2022-11-21 19:04:55
android6.0动态权限,以及如何同时授予多个权限,当用户禁用的后续处理方法 什么情况下需要动态获取权限:满足两个条件:①6.0以上②编译版本(compilesdkversion)api23以上...

android6.0动态权限,以及如何同时授予多个权限,当用户禁用的后续处理方法

什么情况下需要动态获取权限:满足两个条件:①6.0以上②编译版本(compilesdkversion)api23以上

android6.0运行时权限,相关的方法主要有四个:1、检查是否授予权限contextcompat.checkselfpermission(mcontext,permissions[i])返回的结果为packagemanager.permission_granted(0)表示授予权限2、请求权限activitycompat.requestpermissions(welcomeactivity.this,permissions,1);注:permissions为数组,单个的权限,传new string[]{permission}参数, 1为requestcode,在权限回调中需要使用。3、请求权限后的回调publicvoidonrequestpermissionsresult(intrequestcode,@nonnullstring[]permissions,@nonnullint[]grantresults){4、判断用户拒绝权限是是否勾选don't ask again选项,若勾选需要客户手动打开权限activitycompat.shouldshowrequestpermissionrationale(welcomeactivity.this,permissions[i])注:activitycompat.shouldshowrequestpermissionrationale(activity,permission) 这个方法是在用户拒绝权限后返回true。也就是说:用户第一次点击一个需要权限的地方,该方法返回false(因为用户没拒绝~),当用户拒绝掉该权限,下次点击此权限处,该方法会返回true。为true的时候,显示对话框对该权限说明,并让用户选择是否再次申请权限。当用户拒绝权限并勾选don't ask again选项后,会一直返回false,并且 activitycompat.requestpermissions 不会弹出对话框,系统直接deny,并执行 onrequestpermissionsresult 方法:

在实际项目中,为了开发的方便,在欢迎界面,将常用的权限申请一次性申请,一般申请写存储卡、定位等权限。在某个具体操作的时候(如:打电话)再单独进行权限判断。1、欢迎界面权限申请流程:①、检查需要申请的权限状态,将未授权的单独保存到集合中;②、集合为空,进入首页(已全都授予权限),不为空,请求权限;③、当用户拒绝时,判断是否勾选don't ask again,未勾选,重新申请权限,已勾选,跳过欢迎界面,进入主界面。2、具体操作权限申请流程:①、请求权限; ②、在请求回调中,当用户拒绝时,需判断是否勾选don't ask again,未勾选,重新申请权限,已勾选,跳转到设置界面。

欢迎界面,权限申请流程:1、首先声明一个数组permissions,将需要的权限都放在里面string[]permissions=newstring[]{manifest.permission.call_phone,manifest.permission.write_external_storage};

listmpermissionlist=newarraylist<>();2、创建一个mpermissionlist,逐个判断哪些权限未授予,未授予的权限存储到mperrrmissionlist中/**

*判断哪些权限未授予

*/

mpermissionlist.clear();

for(inti=0;i if(contextcompat.checkselfpermission(mcontext,permissions[i])!=packagemanager.permission_granted){

mpermissionlist.add(permissions[i]);

}

}3、判断permissionlist是否为空,不为空的,调用activitycompat.requestpermissions()授予权限。如果permissionlist为空,表示权限都授予了,执行对应的方法/**

*判断是否为空

*/

if(mpermissionlist.isempty()){//未授予的权限为空,表示都授予了

delayentrypage();

}else{//请求权限方法

string[]permissions=mpermissionlist.toarray(newstring[mpermissionlist.size()]);//将list转为数组

activitycompat.requestpermissions(welcomeactivity.this,permissions,1);

}4、在权限回调中,判断用户是否授权,当用户拒绝授权的,需判断用户是否勾选don't ask again选项。分下面两种情况:①.拒绝权限,但未勾选don't ask again选项,重新申请权限②.拒绝权限,并且勾选don't ask again选项,跳过欢迎界面,在用户需要的时候再申请。booleanmshowrequestpermission=true;//用户是否禁止权限

@override

publicvoidonrequestpermissionsresult(intrequestcode,@nonnullstring[]permissions,@nonnullint[]grantresults){

super.onrequestpermissionsresult(requestcode,permissions,grantresults);

switch(requestcode){

case1:

for(inti=0;i if(grantresults[i]!=packagemanager.permission_granted){

//判断是否勾选禁止后不再询问

booleanshowrequestpermission=activitycompat.shouldshowrequestpermissionrationale(welcomeactivity.this,permissions[i]);

if(showrequestpermission){//

judgepermission();//重新申请权限

return;

}else{

mshowrequestpermission=false;//已经禁止

}

}

}

delayentrypage();

break;

default:

break;

}

}

进入app,用户具体操作的时候(如:打电话)申请权限流程,基本上同上面一样,唯一不同的是,当用户拒绝权限的时候跳转到系统应用设置界面。跳转到应用设置界面的代码:uripackageuri=uri.parse("package:"+apputils.getapppackagename());

intentintent=newintent(settings.action_application_details_settings,packageuri);

startactivity(intent);注:为了增强用户体验,在需要跳转到应用设置界面的时候,展示一个对话框,进行文字说明,当用户点击确定的时候再跳转到设置界面。

alertdialogmpermissiondialog;

/**

*不再提示权限时的展示对话框

*/

privatevoidshowpermissiondialog(){

if(mpermissiondialog==null){

mpermissiondialog=newalertdialog.builder(mcontext)

.setmessage("已禁用权限,请手动授予")

.setpositivebutton("设置",newdialoginterface.onclicklistener(){

@override

publicvoidonclick(dialoginterfacedialog,intwhich){

cancelpermissiondialog();

uripackageuri=uri.parse("package:"+apputils.getapppackagename());

intentintent=newintent(settings.action_application_details_settings,packageuri);

startactivity(intent);

}

})

.setnegativebutton("取消",newdialoginterface.onclicklistener(){

@override

publicvoidonclick(dialoginterfacedialog,intwhich){

cancelpermissiondialog();

}

})

.create();

}

mpermissiondialog.show();

}

哪些权限需要动态授权:9组24个

android6.0动态权限,以及如何同时授予多个权限,当用户禁用的后续处理方法