1. 程式人生 > >推薦一個好用的許可權申請框架

推薦一個好用的許可權申請框架

1.概述

android6.0以上,google為了系統的安全性,當app用到設計到使用者隱私的許可權的時候需要進行許可權適配,所以我們僅僅在AndroidManifest中宣告許可權還是不夠的。需要手動的進行許可權適配。無意中發現了一個許可權適配的非常好的框架,推薦給大家使用。

使用方法:在build.gradle中宣告 compile 'com.yanzhenjie:permission:1.1.0'  當然我用的是Android studio,要是還用eclipse那隻能說你out了。包引入完之後就直接同步工程就可以了。

貼一下主要程式碼

/**
 * 相機許可權申請
 */
private void 
cameraApply() { AndPermission.with(this) .permission(Permission.CAMERA) .callback(permissionListener) .rationale(new RationaleListener() { @Override public void showRequestPermissionRationale(int requestCode, Rationale rationale) { // 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
AndPermission.rationaleDialog(MainActivity.this, rationale).show(); } }) .start(); }
只需要呼叫AndPermission類,這個類是鏈式呼叫的方式,可以新增一個或者多個Permission,設定callback對許可權申請的結果進行監聽。rationale方法是用來顯示許可權申請對話方塊的,對話方塊也可以自定義。最後呼叫start方法,開始進行許可權適配。怎麼樣是不是用起來比原生的好用的多的多。

2.程式碼

我把Android中所有需要許可權適配的許可權全部列舉出來了,以後方便查詢,demo中列舉了申請一個許可權,多個許可權的情況。下面看程式碼吧:

/**
 * 許可權申請activity
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_calendarApply;
    private Button btn_cameraApply;
    private Button btn_contactsApply;
    private Button btn_locationApply;
    private Button btn_microphoneApply;
    private Button btn_phoneApply;
    private Button btn_sensorsApply;
    private Button btn_smsApply;
    private Button btn_storageApply;
    private Button btn_moreApply;

    private static final int REQUEST_CODE_SETTING = 300;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_calendarApply = (Button) findViewById(R.id.btn_calendarApply);
        btn_cameraApply = (Button) findViewById(R.id.btn_cameraApply);
        btn_contactsApply = (Button) findViewById(R.id.btn_contactsApply);
        btn_locationApply = (Button) findViewById(R.id.btn_locationApply);
        btn_microphoneApply = (Button) findViewById(R.id.btn_microphoneApply);
        btn_phoneApply = (Button) findViewById(R.id.btn_phoneApply);
        btn_sensorsApply = (Button) findViewById(R.id.btn_sensorsApply);
        btn_smsApply = (Button) findViewById(R.id.btn_smsApply);
        btn_storageApply = (Button) findViewById(R.id.btn_storageApply);
        btn_moreApply = (Button) findViewById(R.id.btn_moreApply);

        btn_calendarApply.setOnClickListener(this);
        btn_cameraApply.setOnClickListener(this);
        btn_contactsApply.setOnClickListener(this);
        btn_locationApply.setOnClickListener(this);
        btn_microphoneApply.setOnClickListener(this);
        btn_phoneApply.setOnClickListener(this);
        btn_sensorsApply.setOnClickListener(this);
        btn_smsApply.setOnClickListener(this);
        btn_storageApply.setOnClickListener(this);
        btn_moreApply.setOnClickListener(this);
    }

    /**
     * 日曆許可權申請
     */
    private void calendarApply() {
        AndPermission.with(this)
                .permission(Permission.CALENDAR)
                .callback(permissionListener)
                .rationale(new RationaleListener() {
                    @Override
                    public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
                        // 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
                        AndPermission.rationaleDialog(MainActivity.this, rationale).show();
                    }
                })
                .start();
    }

    /**
     * 相機許可權申請
     */
    private void cameraApply() {
        AndPermission.with(this)
                .permission(Permission.CAMERA)
                .callback(permissionListener)
                .rationale(new RationaleListener() {
                    @Override
                    public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
                        // 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
                        AndPermission.rationaleDialog(MainActivity.this, rationale).show();
                    }
                })
                .start();
    }

    /**
     * 通訊錄許可權申請
     */
    private void cantactsApply() {
        AndPermission.with(this)
                .permission(Permission.CONTACTS)
                .callback(permissionListener)
                .rationale(new RationaleListener() {
                    @Override
                    public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
                        // 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
                        AndPermission.rationaleDialog(MainActivity.this, rationale).show();
                    }
                })
                .start();
    }

    /**
     * 位置許可權申請
     */
    private void locationApply() {
        AndPermission.with(this)
                .permission(Permission.LOCATION)
                .callback(permissionListener)
                .rationale(new RationaleListener() {
                    @Override
                    public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
                        // 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
                        AndPermission.rationaleDialog(MainActivity.this, rationale).show();
                    }
                })
                .start();
    }

    /**
     * 音訊錄製許可權申請
     */
    private void microphoneApply() {
        AndPermission.with(this)
                .permission(Permission.MICROPHONE)
                .callback(permissionListener)
                .rationale(new RationaleListener() {
                    @Override
                    public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
                        // 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
                        AndPermission.rationaleDialog(MainActivity.this, rationale).show();
                    }
                })
                .start();
    }

    /**
     * 電話許可權申請
     */
    private void phoneApply() {
        AndPermission.with(this)
                .permission(Permission.PHONE)
                .callback(permissionListener)
                .rationale(new RationaleListener() {
                    @Override
                    public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
                        // 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
                        AndPermission.rationaleDialog(MainActivity.this, rationale).show();
                    }
                })
                .start();
    }

    /**
     * 感測器許可權申請
     */
    private void sensorsApply() {
        AndPermission.with(this)
                .permission(Permission.SENSORS)
                .callback(permissionListener)
                .rationale(new RationaleListener() {
                    @Override
                    public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
                        // 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
                        AndPermission.rationaleDialog(MainActivity.this, rationale).show();
                    }
                })
                .start();
    }

    /**
     * 簡訊許可權申請
     */
    private void smsApply() {
        AndPermission.with(this)
                .permission(Permission.SMS)
                .callback(permissionListener)
                .rationale(new RationaleListener() {
                    @Override
                    public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
                        // 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
                        AndPermission.rationaleDialog(MainActivity.this, rationale).show();
                    }
                })
                .start();
    }

    /**
     * 外部儲存許可權申請
     */
    private void storageApply() {
        AndPermission.with(this)
                .permission(Permission.STORAGE)
                .callback(permissionListener)
                .rationale(new RationaleListener() {
                    @Override
                    public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
                        // 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
                        AndPermission.rationaleDialog(MainActivity.this, rationale).show();
                    }
                })
                .start();
    }

    /**
     * 多個許可權同時申請
     */
    private void moreApply() {
        AndPermission.with(this)
                .permission(Permission.CAMERA, Permission.STORAGE)
                .callback(permissionListener)
                .rationale(new RationaleListener() {
                    @Override
                    public void showRequestPermissionRationale(int requestCode, Rationale rationale) {
                        // 這裡的對話方塊可以自定義,只要呼叫rationale.resume()就可以繼續申請。
                        AndPermission.rationaleDialog(MainActivity.this, rationale).show();
                    }
                })
                .start();
    }

    /**
     * 回撥監聽。
     */
    private PermissionListener permissionListener = new PermissionListener() {
        @Override
        public void onSucceed(int requestCode, @NonNull List<String> grantPermissions) {
            Toast.makeText(MainActivity.this, "申請成功", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onFailed(int requestCode, @NonNull List<String> deniedPermissions) {
            // 使用者否勾選了不再提示並且拒絕了許可權,那麼提示使用者到設定中授權。
            if (AndPermission.hasAlwaysDeniedPermission(MainActivity.this, deniedPermissions)) {
                // 第一種:用預設的提示語。
                AndPermission.defaultSettingDialog(MainActivity.this, REQUEST_CODE_SETTING).show();
            }
        }
    };

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_calendarApply:
                calendarApply();
                break;
            case R.id.btn_cameraApply:
                cameraApply();
                break;
            case R.id.btn_contactsApply:
                cantactsApply();
                break;
            case R.id.btn_locationApply:
                locationApply();
                break;
            case R.id.btn_microphoneApply:
                microphoneApply();
                break;
            case R.id.btn_phoneApply:
                phoneApply();
                break;
            case R.id.btn_sensorsApply:
                sensorsApply();
                break;
            case R.id.btn_smsApply:
                smsApply();
                break;
            case R.id.btn_storageApply:
                storageApply();
                break;
            case R.id.btn_moreApply:
                moreApply();
                break;
        }
    }
}
怎麼樣,是不是用起來特別簡單,而且功能強大呢。有需要的朋友可以去下載原始碼