6.0动态权限申请封装

PermissionUtils

6.0动态授权封装

使用

//AppCompatActivity 直接传this   fragment中授权 传getActivity
  PermissionUtils.requestPermission(MainActivity.this,
                        new String[]{Manifest.permission.CAMERA, Manifest.permission.CALL_PHONE,
                                Manifest.permission.SEND_SMS, Manifest.permission.WRITE_EXTERNAL_STORAGE}
                        , new PermissionUtils.PermissionListener() {

                            @Override
                            public void onResult(String[] permission, int[] grantResults, String[] info) {
                                for (int i = 0; i < permission.length; i++) {
                                    Log.i("DEBUG", "onResult: "+permission[i]+grantResults[i]+info[i]);
                                }
                            }
                        });

日志##

DEBUGa: onResult: android.permission.CALL_PHONE----false--设置界面未授权

内部利用fragment,省掉在activity重写回掉

你所不知道的Fragment的妙用

详细使用请看之前拙文,或者utils源码

本文github地址 PermissionUtils

实现思路

SDK<23 不申请权限,走原来路
SDK>=23 走6.0动态权限
已添加过直接回掉给用户 已经授权过
未申请权限 添加Fragment 根据fragment onPermissionResult判断 回掉给用户
拒绝过 弹Dialog 添加frgament 启动软件设置界面 根据fragment onActivityResult判断 回掉给用户

代码如下

 public static void requestPermission(final FragmentActivity activity, final String[] perssion, final PermissionListener listener) {
        if (Build.VERSION.SDK_INT < 23 || perssion == null)
            return;
        resetMapHolder();
        //第一次申请的权限
        List<String> firstPermission = new ArrayList(1);
        //拒绝过的的权限
        ArrayList<String> delayedPermission = new ArrayList(1);
        for (int i = 0; i < perssion.length; i++) {
            Log.i("PermissionUtils", "requestPermission: "+perssion[i]+ContextCompat.checkSelfPermission(activity, perssion[i])+"e"+ActivityCompat.shouldShowRequestPermissionRationale(activity, perssion[i]));
            if (ContextCompat.checkSelfPermission(activity, perssion[i]) != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(activity, perssion[i])) {

                    addState(perssion[i], PackageManager.PERMISSION_DENIED, MapHolder.infos[4]);
                    delayedPermission.add(perssion[i]);
                } else {
                    addState(perssion[i], PackageManager.PERMISSION_DENIED, MapHolder.infos[2]);
                    firstPermission.add(perssion[i]);
                }
            } else {
                addState(perssion[i], PackageManager.PERMISSION_GRANTED, MapHolder.infos[0]);
            }
        }

        Log.i("PermissionUtils", "requestPermission:grantResultsMap " + MapHolder.grantResultsMap.toString());
        Log.i("PermissionUtils", "requestPermission:infoMap " + MapHolder.infoMap.toString());

        addListener(activity, listener, perssion,firstPermission, delayedPermission);

    }

    private static void addState(String permission, int Granted, String info) {
        MapHolder.grantResultsMap.put(permission, Granted);
        MapHolder.infoMap.put(permission, info);
    }

    private static void addListener(FragmentActivity activity, PermissionListener listener,String[]all, List<String> firstPermission, ArrayList<String> delayedPermission) {

        //先第一次的权限申请,拒绝过的最后申请提示
        if (!firstPermission.isEmpty()) {
            String[] needPermission = new String[firstPermission.size()];
            for (int i = 0; i < firstPermission.size(); i++) {
                needPermission[i] = firstPermission.get(i);
            }
            PermissionFragment fragment = getListenerFragment(activity, listener,all, delayedPermission);

            fragment.requestPermissions(needPermission, PermissionFragment.REQUEST_PERMISSION);
        } else if (!delayedPermission.isEmpty()) {
            PermissionFragment fragment = getListenerFragment(activity, listener,all, delayedPermission);

            fragment.dealDealyPermission();
        }

    }

    //设置监听
    @NonNull
    private static PermissionFragment getListenerFragment(FragmentActivity activity, PermissionListener listener, String[]all,ArrayList<String> delayedPermission) {
        PermissionFragment fragment = getAddPermissionFragment(activity);
        fragment
                .setAllPermission(all)
                .setDelayRequestString(delayedPermission)
                .setListener(listener);
        return fragment;
    }

    //把fragment添加到activity
    @NonNull
    private static PermissionFragment getAddPermissionFragment(FragmentActivity activity) {
        PermissionFragment fragment = null;
        FragmentManager manager = activity.getSupportFragmentManager();
        Fragment request_permission = manager.findFragmentByTag("REQUEST_PERMISSION");
        if (request_permission == null) {
            fragment = new PermissionFragment();
            manager.beginTransaction().add(fragment, "REQUEST_PERMISSION").commitNow();
//            manager.executePendingTransactions();
        } else {
            fragment = (PermissionFragment) request_permission;
        }
        return fragment;
    }

    public interface PermissionListener  {
        void onResult(String[] permission, int[] grantResults, String[] info);
    }

    public static class PermissionFragment extends Fragment {
        private static int REQUEST_PERMISSION = 9;
        private PermissionUtils.PermissionListener listener;
        private ArrayList<String> delayPermission;
        private String[]perssions;
        SharedPreferences permission;




        public void setListener(PermissionUtils.PermissionListener listener) {
            this.listener = listener;
        }

        public PermissionFragment setDelayRequestString(ArrayList<String> delayPermission) {
            this.delayPermission = delayPermission;
            return this;
        }
         public PermissionFragment setAllPermission(String[]perssion) {
             perssions=perssion;
            return this;
        }

        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            permission = getContext().getSharedPreferences("permission", Context.MODE_PRIVATE);
        }

        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == PermissionFragment.REQUEST_PERMISSION) {
                if (perssions != null) {
                    int length = grantResults.length;
                    if (length > 0) {
                        for (int i = 0; i < length; i++) {
                            if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                                addState(permissions[i], PackageManager.PERMISSION_GRANTED, MapHolder.infos[1]);
                            } else {

                                //第一次拒绝
                                boolean aBoolean = permission.getBoolean(permissions[i], false);
                                if(aBoolean){
                                    delayPermission.add(permissions[i]);
                                }else{
                                    permission.edit().putBoolean(permissions[i],true).commit();
                                }
                                addState(permissions[i], PackageManager.PERMISSION_DENIED, MapHolder.infos[2]);
                            }
                        }
                    }
                    //申请延迟权限 就是已经拒绝过的,需要到设置界面申请
                    dealDealyPermission();
                }
            }
        }


        private void dealDealyPermission() {
            if (delayPermission != null && !delayPermission.isEmpty()) {
                final int size = delayPermission.size();
                StringBuilder delayBuilder = new StringBuilder(4);
                for (int i = 0; i < size; i++) {
                    try {
                        delayBuilder.append((i != 0 ? "、\n" : "") + delayPermission.get(i).split("android.permission.")[1]);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                Log.i("PermissionUtils", "dealDealyPermission: " + delayBuilder.toString());
                new AlertDialog.Builder(getActivity())
                        .setMessage("需要到设置以下权限:\n" + delayBuilder.toString())
                        .setTitle("权限被拒,某些功能可能受限")
                        .setCancelable(true)
                        .setPositiveButton("去授权", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                goSetting();
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                                for (int i1 = 0; i1 < size; i1++) {
                                    addState(delayPermission.get(i1), PackageManager.PERMISSION_DENIED, MapHolder.infos[4]);
                                }
                                SendResult();
                            }
                        })
                        .create().show();
            } else {
                SendResult();
            }
        }


        private void SendResult() {
            int size = MapHolder.grantResultsMap.size();
            int[] granted = new int[size];
            String[] infos = new String[size];

            Log.i("PermissionUtils", "SendResult: " + MapHolder.grantResultsMap);
            for (int i = 0; i <perssions.length; i++) {
                granted[i] = MapHolder.grantResultsMap.get(perssions[i]);
                infos[i] = MapHolder.infoMap.get(perssions[i]);
            }

            listener.onResult(perssions
                    , granted
                    , infos);
        }

        private void goSetting() {
            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            Uri uri = Uri.fromParts("package", getActivity().getApplicationContext().getPackageName(), null);
            intent.setData(uri);
            startActivityForResult(intent, PermissionFragment.REQUEST_PERMISSION);
        }



        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

            if (requestCode == PermissionFragment.REQUEST_PERMISSION&&perssions!=null) {
                    for (int i = 0; i <perssions.length; i++) {
                        if (ContextCompat.checkSelfPermission(getActivity(),perssions[i]) != PackageManager.PERMISSION_GRANTED) {
                            addState(perssions[i], PackageManager.PERMISSION_DENIED, MapHolder.infos[4]);
                        } else {
                            if(delayPermission.contains(perssions[i]))
                            addState(perssions[i], PackageManager.PERMISSION_GRANTED, MapHolder.infos[3]);
                        }
                    }
                    Log.i("PermissionUtils", "requestPermission:grantResultsMap onActivityResult" + MapHolder.grantResultsMap.toString());
                    Log.i("PermissionUtils", "requestPermission:infoMap onActivityResult" + MapHolder.infoMap.toString());
                    SendResult();
            }
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容