运行时权限处理(在Email中添加动态权限请求)

参考链接:https://blog.csdn.net/lmj623565791/article/details/50709663

在MainActivity中添加如下内容:

import android.Manifest;
import android.app.Activity;
import android.app.Fragment;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.widget.Toast;
import com.android.email.EmailApplication;
import java.util.HashSet;


private static final String PERMISSION_READ_ATTACHMENT="com.android.email.permission.READ_ATTACHMENT";
private static final int GRANT_PERMISSION_REQUEST_CODE=1;
private boolean mIsChecking=false;
public boolean mPermissionGranted;

@Override
public void onAttachFragment(Fragment frag){
mController.addToFragmentList(frag);
}

@Override
public void onCreate(Bundle savedState){
mViewMode=new ViewMode();
final boolean tableUi=Utils.useTableUI(this.getResources());
mController=createActivityController(this,mViewMode,tableUi);
super.onCreate(savedState);
Intent i=getIntent();
if(i!=null && i.getCategories()!=null &&
i.getCategories().contains(Intent.CATEGORY_LAUNCHER)){
AnalyticsTimer.getInstance().trackStart(AnalyticsTimer.GOLD_START_LAUNCHER);
}
resetSenderImageCache();


mIsChecking=((EmailApplication)getApplication()).getPermissionCheckingStateFlag();
//判断应用是否正在检测权限状态

if(!mIsChecking && hasRequiredPermission(this,PERMISSIONS_LIST,GRANT_PERMISSION_REQUEST_CODE)){
//没有正在检测权限并且存在没有授权的权限需要请求权限
mController.updatePermissionGrantState(true);//更新权限授予状态
mIsChecking=false;//没有在检测权限
((EmailApplication)getApplication()).setPermissionCheckingStateFlag(false);
}else{
//正在检测权限
mController.updatePermissionGrantState(false);
mIsChecking=true;
((EmailApplication)getApplication()).setPermissionCheckingStateFlag(true);
}
mController.onCreate(mIsChecking? null:savedState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
mIsChecking=((EmailApplication)getApplication()).getPermissionCheckingStateFlag();
if(!mIsChecking){
mController.onRestoreInstanceState(savedInstanceState);
}
}

@Override
public void onRequestPermissionsResult(int requestCode,
String[] permission,int[] grantResults){
if(requestCode==GRANT_PERMISSION_REQUEST_CODE){
boolean granted=grantResults.length>0? true:false;//没有授权结果说明授权失败
mIsChecking=false;
((EmailApplication)getApplication()).setPermissionCheckingStateFlag(false);

for(int result:grantResults){//grantResults中存放了每一个权限的授权结果
if(result!=PackageManager.PERMISSION_GRANTED){
granted=false;//结果中有一个没有授权的就说明授权失败
}
}
if(granted){
mController.updatePermissionGrantState(true);//如果全部授权成功,就更新授权状态
recreate();
}else{
Toast.makeText(this,"You have disabled some required permission.",
Toast.LENGTH_LONG).show();
finish();//授权失败,结束活动
}
}else{
super.onRequestPermissionsResult(requestCode,permission,grantResults);
}
}

public static final String[] PERMISSIONS_LIST={
Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS,
Manifest.permission.READ_CALENDAR,
Manifest.permission.WRITE_CALENDAR,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
PERMISSION_READ_ATTACHMENT,
};

public static boolean hasRequiredPermission(final Activity activity,
final String[] permissions,final int requestCode){
Hashset<String> absenceSet=new HashSet<String>();//没有授权的权限的存储容器
for(String permission:permissions){
if(ContextCompat.checkSelfPermission(activity,
permission)!=PackageManager.PERMISSION_GRANTED){//判断每一个权限是否已经被授权
absenceSet.add(permission);
}
}
if(!absenceSet.isEmpty()){//存在没有授权的权限
String[] requestArray=new String[absenceSet.size()];
absenceSet.toArray(requestArray);//将HashSet类型转换为数组类型

ActivityCompat.requestPermissions(activity,requestArray,
GRANT_PERMISSION_REQUEST_CODE);//请求权限操作
return false;
}
return true;
}

 

参考链接http://blog.csdn.net/fenggering/article/details/53432401

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值