PermissionsUtil權(quán)限工具類

第一步:先在成員中聲明需要用到權(quán)限

//權(quán)限1:定義權(quán)限數(shù)組
String[] permissions = new String[]{
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.READ_EXTERNAL_STORAGE};

第二步:創(chuàng)建監(jiān)聽權(quán)限的接口對(duì)象

//權(quán)限2 創(chuàng)建監(jiān)聽權(quán)限的接口對(duì)象
PermissionsUtil.IPermissionsResult permissionsResult = new PermissionsUtil.IPermissionsResult() {
    @Override
    public void passPermissons() {
      //Toast.makeText(RegisterActivity.this, "權(quán)限通過,可以做其他事情!", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void forbitPermissons() {
        //finish();
        showshortToast(MainActivity.this, "權(quán)限未通過!");
    }
};

第三步:在Activity重寫onRequestPermissionsResult方法

//權(quán)限3 在Activity重寫onRequestPermissionsResult方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    //就多一個(gè)參數(shù)this
    PermissionsUtil.getInstance().onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}

第四步:在onCreate中調(diào)用checkPermissions方法

 //權(quán)限4 調(diào)用checkPermissions方法
 PermissionsUtil.getInstance().chekPermissions(this, permissions, permissionsResult);

最后,這是工具類的完整代碼

import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;

import java.util.ArrayList;
import java.util.List;
/**
 * Created by songsong on 2019/4/27 0027
 */
public class PermissionsUtil {

    //權(quán)限請(qǐng)求碼
    private final int mRequestCode = 100;
    public static boolean showSystemSetting = true;
    private static PermissionsUtil permissionsUtil;
    private IPermissionsResult mPermissionsResult;
    AlertDialog mPermissionDialog;
    private PermissionsUtil() {
    }
    public static PermissionsUtil getInstance() {
        if (permissionsUtil == null) {
            permissionsUtil = new PermissionsUtil();
        }
        return permissionsUtil;
    }
    public void chekPermissions(Activity context, String[] permissions, @NonNull IPermissionsResult permissionsResult) {
        mPermissionsResult = permissionsResult;
        if (Build.VERSION.SDK_INT < 23) {//6.0才用動(dòng)態(tài)權(quán)限
            permissionsResult.passPermissons();
            return;
        }
        //創(chuàng)建一個(gè)mPermissionList,逐個(gè)判斷哪些權(quán)限未授予,未授予的權(quán)限存儲(chǔ)到mPerrrmissionList中
        List<String> mPermissionList = new ArrayList<>();
        //逐個(gè)判斷你要的權(quán)限是否已經(jīng)通過
        for (int i = 0; i < permissions.length; i++) {
            if (ContextCompat.checkSelfPermission(context, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
                mPermissionList.add(permissions[i]);//添加還未授予的權(quán)限
            }
        }
        //申請(qǐng)權(quán)限
        if (mPermissionList.size() > 0) {//有權(quán)限沒有通過,需要申請(qǐng)
            ActivityCompat.requestPermissions(context, permissions, mRequestCode);
        } else {
            //說明權(quán)限都已經(jīng)通過,可以做你想做的事情去
            permissionsResult.passPermissons();
            return;
        }
    }
    /**
     * 請(qǐng)求權(quán)限后回調(diào)的方法
     *
     * @param context
     * @param requestCode  是我們自己定義的權(quán)限請(qǐng)求碼
     * @param permissions  是我們請(qǐng)求的權(quán)限名稱數(shù)組
     * @param grantResults 是我們?cè)趶棾鲰撁婧笫欠裨试S權(quán)限的標(biāo)識(shí)數(shù)組,數(shù)組的長度對(duì)應(yīng)的是權(quán)限名稱數(shù)組的長度,數(shù)組的數(shù)據(jù)0表示允許權(quán)限,-1表示我們點(diǎn)擊了禁止權(quán)限
     */
    public void onRequestPermissionsResult(Activity context, int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        boolean hasPermissionDismiss = false;//有權(quán)限沒有通過
        if (mRequestCode == requestCode) {
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] == -1) {
                    hasPermissionDismiss = true;
                }
            }
            //如果有權(quán)限沒有被允許
            if (hasPermissionDismiss) {
                if (showSystemSetting) {
                    showSystemPermissionsSettingDialog(context);//跳轉(zhuǎn)到系統(tǒng)設(shè)置權(quán)限頁面,或者直接關(guān)閉頁面,不讓他繼續(xù)訪問
                } else {
                    mPermissionsResult.forbitPermissons();
                }
            } else {
                //全部權(quán)限通過,可以進(jìn)行下一步操作。。。
                mPermissionsResult.passPermissons();
            }
        }
    }
    /**
     * 不再提示權(quán)限時(shí)的展示對(duì)話框
     */
    private void showSystemPermissionsSettingDialog(final Activity context) {
        final String mPackName = context.getPackageName();
        if (mPermissionDialog == null) {
            mPermissionDialog = new AlertDialog.Builder(context)
                    .setMessage("已禁用權(quán)限,請(qǐng)手動(dòng)授予")
                    .setPositiveButton("設(shè)置", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            cancelPermissionDialog();

                            Uri packageURI = Uri.parse("package:" + mPackName);
                            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
                            context.startActivity(intent);
                            context.finish();
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //關(guān)閉頁面或者做其他操作
                            cancelPermissionDialog();
                            //mContext.finish();
                            mPermissionsResult.forbitPermissons();
                        }
                    })
                    .create();
        }
        mPermissionDialog.show();
    }
    //關(guān)閉對(duì)話框
    private void cancelPermissionDialog() {
        if (mPermissionDialog != null) {
            mPermissionDialog.cancel();
            mPermissionDialog = null;
        }
    }
    public interface IPermissionsResult {
        void passPermissons();
        void forbitPermissons();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • View的尺寸通常是和iphone的屏幕分辨率接近 比如可以是800x1400這樣的一張視圖 在View上顯示圖片...
    cx7閱讀 3,519評(píng)論 0 2
  • 玲瓏寶劍握在手,只身一人江湖走, 玉女冷面霸氣漏,俠肝義膽威名留。 (好友贈(zèng)圖,一時(shí)興起,隨筆題詩)
    芃悠閱讀 836評(píng)論 5 2
  • 在開發(fā)中,用到動(dòng)態(tài)查詢的地方,所有的查詢條件包括分頁參數(shù),都會(huì)被封裝成一個(gè)查詢類XxxQuery 比如說上一篇中的...
    龍歷旗閱讀 2,860評(píng)論 1 1
  • 忙到顧不上日更,忙到?jīng)]了詩和遠(yuǎn)方,暫且落地成塵,記流水吧。 很多話想說,很多事想做,只是時(shí)間快得如翻書,等不及你把...
    佳人佳語閱讀 362評(píng)論 0 8

友情鏈接更多精彩內(nèi)容