android權(quán)限請(qǐng)求一行代馬

查看rxpermission源碼可知,核心代碼是創(chuàng)建一個(gè)無(wú)ui的fragment,fragment是可感知activity生命周期的,這個(gè)時(shí)候,解決方案可不是躍然紙上了嗎,不熟rxjava怎么辦,在下封裝了個(gè)簡(jiǎn)易代碼,僅供參考~
public class PermissionCompat {
    public static final int CODE = 200;
    /**
     * 拒絕,不在詢問(wèn),死了這條心吧~
     */
    public static final int DEATH_REFUSAL = 250;
    /**
     * 一般拒絕,還有機(jī)會(huì)
     */
    public static final int NORMAL_REFUSAL = 251;
    /**
     * 通過(guò)
     */
    public static final int PASS = 201;

    public interface PermissionCompatCallback {
        /**
         * @param cmds PASS 通過(guò)|NORMAL_REFUSAL 拒絕 |DEATH_REFUSAL 拒絕(
         */
        void ok(int cmds);

        void refuse(int cmds);

        void goSettings(int cmds);
    }

    public static abstract class PerCompatCallbackAdpt implements PermissionCompatCallback {

        @Override
        public abstract void ok(int cmds);

        @Override
        public void refuse(int cmds) {

        }

        @Override
        public void goSettings(int cmds) {

        }
    }

    public static final String TAG = "fragment";

    /**
     */
    public static void tryReqs(FragmentActivity act, PerCompatCallbackAdpt mPermissionCompatCallback, String... cmds) {

        if (cmds != null && cmds.length > 0) {
            List<String> mCmdLists = new ArrayList<>();
            for (String cmdStr : cmds) {
                mCmdLists.add(cmdStr);
            }
            for (String cmd : mCmdLists) {
                if (ContextCompat.checkSelfPermission(act, cmd) != PackageManager.PERMISSION_GRANTED) {
                    String[] mPermissions = mCmdLists.toArray(new String[mCmdLists.size()]);
                    FragmentManager fm = act.getSupportFragmentManager();
                    ShadowFragment mShadowFragment = (ShadowFragment) fm.findFragmentByTag(TAG);
                    if (mShadowFragment == null) {
                        mShadowFragment = new ShadowFragment();
                        fm.beginTransaction().add(mShadowFragment, TAG).commitAllowingStateLoss();
                    }
                    fm.executePendingTransactions();
                    if (mShadowFragment != null) {
                        mShadowFragment.mPermissionCompatCallback = mPermissionCompatCallback;
                        mShadowFragment.requestPermissions(mPermissions, CODE);
                    }
                    return;
                }
            }
            if (mPermissionCompatCallback != null) {
                mPermissionCompatCallback.ok(PASS);
            }
        } else {
            if (mPermissionCompatCallback != null) {
                mPermissionCompatCallback.ok(PASS);
            }
        }
    }

    public static boolean hasAllPermissionsGranted(int[] grantResults) {
        for (int grantResult : grantResults) {
            if (grantResult == PackageManager.PERMISSION_DENIED) {
                return false;
            }
        }
        return true;
    }
}


public class ShadowFragment extends Fragment {
    public PermissionCompat.PermissionCompatCallback mPermissionCompatCallback;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 禁止橫豎屏切換時(shí)的Fragment的重建
        setRetainInstance(true);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        System.out.println("###########權(quán)限回調(diào)執(zhí)行啦#############");
        System.out.println("###########權(quán)限回調(diào)執(zhí)行啦###########################");
        System.out.println("###########權(quán)限回調(diào)執(zhí)行啦#############");
        if (mPermissionCompatCallback != null) {
            if (PermissionCompat.hasAllPermissionsGranted(grantResults)) {
                mPermissionCompatCallback.ok(PermissionCompat.PASS);
            } else {
                for (String permission : permissions) { //拒絕,并且不在詢問(wèn)
                    if (!ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), permission)) {
                        mPermissionCompatCallback.goSettings(PermissionCompat.DEATH_REFUSAL);
                        return;
                    }
                }
                mPermissionCompatCallback.refuse(PermissionCompat.NORMAL_REFUSAL);
            }
        }
    }
}

activity中,一行代馬

      PermissionCompat.tryReqs(this, new PermissionCompat.PerCompatCallbackAdpt() {
            @Override
            public void ok(int cmds) {
                System.out.println("==============權(quán)限通過(guò)了==============");
            }
            @Override
            public void refuse(int cmds) {
                System.out.println("==============權(quán)限被拒絕了==============");
            }

            // 還未添加功能
            @Override
            public void goSettings(int cmds) {
                System.out.println("==============請(qǐng)去setting界面==============");
            }
        }, Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_PHONE_STATE,Manifest.permission.CAMERA);

fragment中,一行代馬

PermissionCompat.tryReqs(getActivity(), new PermissionCompat.PermissionCompatCallbackImplAdpt() {

            @Override
            public void ok(int cmds) {
                System.out.println("==============權(quán)限通過(guò)了老哥==============");
            }
        }, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE);

僅供參考,還可以封裝的,可視我不會(huì)啦~

看看回掉函數(shù)名字起的,哎吆我去,,,,,真是又臭又長(zhǎng)~

類庫(kù)地址覺(jué)得有用,賞個(gè)star,多謝~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,020評(píng)論 25 708
  • 八點(diǎn)左右,老公說(shuō)要去理發(fā),看到他換衣服準(zhǔn)備出門,我也說(shuō)要陪他去。我們換好衣服,一起走進(jìn)電梯,下樓。下門口臺(tái)階時(shí)老公...
    馮小燕_9250閱讀 208評(píng)論 0 0
  • 01 唐沅慢慢合上手里的日記本,一臉沉思的樣子。 日記本是那深沉的藍(lán)色,如同大海一般深邃。 門卡嚓一聲響,進(jìn)來(lái)一個(gè)...
    夏至微雪閱讀 1,015評(píng)論 15 15
  • 愛(ài)德華,貝娜。終于有了永遠(yuǎn)的結(jié)果,永恒的愛(ài)情。這種愛(ài)情本身就是虛幻的吧,就像里面的吸血鬼,狼人,只是存在于夢(mèng)幻世界...
    a25b56a3e1c8閱讀 390評(píng)論 0 0