52.自己動手封裝Android6.0運行時權限相關代碼

轉載請註明出處 http://blog.csdn.net/qq_31715429/article/details/52786614
本文出自:猴菇先生的博客

在app中用到動態判斷運行時權限的地方還是蠻多的,比如讀寫SD卡、獲取電話信息、拍照、定位啥的,每次的重複代碼也蠻多的。看了郭霖大神CSDN公開課直播Android6.0運行時權限,講了如何封裝,下面是改過之後的代碼:

1、在BaseActivity中:

//6.0以上系統判斷權限  --> start
    private static final int RUNTIME_PERMISSION_REQUEST_CODE = 1;
    private RuntimePermissionListener mRuntimePermissionListener;

    /**
     * 檢查運行時權限
     *
     * @param permissions               所檢查的權限數組
     * @param runtimePermissionListener 運行時權限監聽器
     */
    public void checkRuntimePermission(String[] permissions, RuntimePermissionListener runtimePermissionListener) {
        mRuntimePermissionListener = runtimePermissionListener;
        List<String> deniedPermissionList = new ArrayList<>();
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {//判斷權限是否允許
                deniedPermissionList.add(permission);
            }
        }
        if (deniedPermissionList.isEmpty()) {
            //權限全部允許
            mRuntimePermissionListener.onRuntimePermissionGranted();
        } else {
            String[] deniedPermissionArray = deniedPermissionList.toArray(new String[deniedPermissionList.size()]);
            //請求未允許的權限
            ActivityCompat.requestPermissions(this, deniedPermissionArray, RUNTIME_PERMISSION_REQUEST_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case RUNTIME_PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0) {
                    List<String> deniedPermissionList = new ArrayList<>();
                    for (int i = 0; i < grantResults.length; i++) {
                        if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                            deniedPermissionList.add(permissions[i]);
                        }
                    }
                    if (deniedPermissionList.isEmpty()) { //權限全部允許
                        mRuntimePermissionListener.onRuntimePermissionGranted();
                    } else {//有拒絕的權限
                        mRuntimePermissionListener.onRuntimePermissionDenied();
                    }
                }
        }
    }

    /**
     * 運行時權限監聽器
     */
    public interface RuntimePermissionListener {
        /**
         * 允許所請求的全部權限
         */
        void onRuntimePermissionGranted();

        /**
         * 拒絕所請求的部分或全部權限
         */
        void onRuntimePermissionDenied();
    }
//6.0以上系統判斷權限  --> end

2、在需要檢查權限的activity中使用:

    /**
     * 請求權限
     */
    private void checkRuntimePermission() {
        String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE
                , Manifest.permission.CALL_PHONE
                , Manifest.permission.ACCESS_COARSE_LOCATION};
        checkRuntimePermission(permissions, new RuntimePermissionListener() {
            @Override
            public void onRuntimePermissionGranted() {
                //do something
            }

            @Override
            public void onRuntimePermissionDenied() {
                ToastUtil.show(MAinActivity.this, "拒絕該權限將無法使用部分功能");
            }
        });
    }

3、如果在fragment中怎麼用呢,那就在BaseFragment中:

/**
     * 檢查運行時權限
     *
     * @param permissions               所檢查的權限數組
     * @param runtimePermissionListener 運行時權限監聽器
     */
    public void checkRuntimePermission(String[] permissions, RuntimePermissionListener runtimePermissionListener) {
        Activity activity = getActivity();
        if (activity instanceof BaseActivity) {
            ((BaseActivity) activity).checkRuntimePermission(permissions, runtimePermissionListener);
        }
    }

使用方法和在activity中一樣~

附上郭神視頻錄播地址:http://edu.csdn.net/course/detail/3539

發佈了84 篇原創文章 · 獲贊 100 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章