運行時權限處理(在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章