前幾天看了郭大神的運作時權限的專講,深受啟發,由于現在基于目前項目中的運作時權限封裝的還不是那麼完美,趁着郭神建議的還是曆曆在目。于是把它完整的敲了下來。并在此基礎上添加上自己的一些見解,封裝成一個完整的demo,希望與大家進行交流與。

在這裡我進行了簡單的在activity中簡單進行擷取權限和工具類封:
某一個權限被禁止或者是所有的權限被禁止,這裡我做了去到烯烴界面去設定的處理:
如果要開啟多個權限的話,則可能不同的手機顯示的效果不同,有些手機在權限Dialog上顯示需要擷取權限的個數,但有些手機需要多少個權限顯示多少個。
最後一步處理:如果某個權限被禁止的話,則到設定界面去提示使用者去打開權限:
部分代碼:
public class CheckPermissionOnActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_checkpermission1);
ButterKnife.bind(this);
}
@OnClick({R.id.btn_runtimne_onClick, R.id.btn_runtimne_onClick_multify,R.id.btn_runtimne_onClick_seting})
public void onMyListener(View v){
switch (v.getId()){
case R.id.btn_runtimne_onClick:
requestToUserPersiom(1);
break;
case R.id.btn_runtimne_onClick_multify:
requestToUserPersiom(2);
break;
case R.id.btn_runtimne_onClick_seting:
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:"+ getPackageName()));
startActivity(intent);
break;
}
}
public void requestToUserPersiom(int permisionIndexCount){
switch (permisionIndexCount){
case 1:
ActivityCompat.requestPermissions(CheckPermissionOnActivity.this, new String[]{android.Manifest.permission.CALL_PHONE},100);//去請求權限
break;
case 2:
case 3:
case 4:
ActivityCompat.requestPermissions(CheckPermissionOnActivity.this, new String[]{android.Manifest.permission.CALL_PHONE,android.Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
break;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 100){
if(grantResults.length >0 ){
for (int i = 0; i < grantResults.length; i++) {
if( grantResults[i] == PackageManager.PERMISSION_DENIED){//拒絕啦
return ;
}
}
doosmething();
}
}
}
public void doosmething(){
GetToast.useString(CheckPermissionOnActivity.this,"開始做其他事情了");
}
}
封裝成BaseActivitgy工具類:
public class BasePermisitionActivity extends Activity {
private static final int REQUESTPERMISSION_CODE = 100;
private static QuestPermissionListener questPermissionListener;
private AlertDialog.Builder builder;
private AlertDialog alertDialog;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityManager.addPermissionActivty(this);
}
public static void requestRuntimePermission(String [] permissions,QuestPermissionListener questPermissionListener){
Activity actyivty = ActivityManager.permissionActivilyList.get(ActivityManager.permissionActivilyList.size() -1);
if(actyivty == null){
return;
}
List neetRequestPermisList = new ArrayList();
for (String permission : permissions) {
if(ActivityCompat.checkSelfPermission(actyivty,permission) == PackageManager.PERMISSION_DENIED){
neetRequestPermisList.add(permission);
}
}
BasePermisitionActivity.questPermissionListener = questPermissionListener;
if(!neetRequestPermisList.isEmpty()){
ActivityCompat.requestPermissions(actyivty,neetRequestPermisList.toArray(new String[neetRequestPermisList.size()]),REQUESTPERMISSION_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == REQUESTPERMISSION_CODE){
for (int i = 0; i < grantResults.length; i++) {
int granrRequest = grantResults[i];
if(granrRequest == PackageManager.PERMISSION_DENIED){//權限被拒絕啦
if(questPermissionListener != null){
questPermissionListener.denySomePermission();
}
return;
}
}
questPermissionListener.doAllPermissionGrant();
}
}
@Override
protected void onResume() {
super.onResume();
}
public void onResumeCheckPermission(String ...permission){
if(PermisionControl.lackMissPermission(this,permission)){
showMissPermissionDialog();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityManager.removePermissionActiivty(this);
}
public void showMissPermissionDialog() {
if (builder == null) {
builder = new AlertDialog.Builder(BasePermisitionActivity.this);
builder.setTitle("幫助");
String msg = "目前應用缺少必要權限。
\r請點選\"設定\"-\"權限\"-打開所需權限。
\r\r最後點選兩次後退按鈕,即可傳回。";
builder.setMessage(Html.fromHtml(msg));
//materialDialog.setMovementMethod(LinkMovementMethod.getInstance());
builder.setPositiveButton("設定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
alertDialog.dismiss();
}
});
builder.setNegativeButton("退出", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
alertDialog.dismiss();
startAppSettings();
}
});
alertDialog = builder.create();
alertDialog.show();
} else {
alertDialog.show();
}
}
// 啟動應用的設定
public void startAppSettings() {
try {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:"+ getPackageName()));
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
}
與其相關的工具類:
public class PermisionControl {
public static boolean lackMissPermission(Context cnt ,String... permission){
boolean relust = true ;
for (String per : permission) {
if(ActivityCompat.checkSelfPermission(cnt,per) == PackageManager.PERMISSION_DENIED){
relust = false ;
break;
}
}
return relust;
}
public void requestRuntimePermission(QuestPermissionListener questPermissionListener, String... permissions){
BasePermisitionActivity.requestRuntimePermission(permissions,questPermissionListener);
}
}
以及其他的一些封裝:
public class PermissionUsage {
public static String[] LOACATION_CAMERA = { Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CALL_PHONE,
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_EXTERNAL_STORAGE};
public static String[] READ_EXTRASORE = { Manifest.permission.READ_EXTERNAL_STORAGE};
public static String[] RCALL_PHONE = { Manifest.permission.READ_EXTERNAL_STORAGE};
}
以上這篇android6.0運作時權限完美封裝方法就是小編分享給大家的全部内容了,希望能給大家一個參考,也希望大家多多支援腳本之家。