如何優雅的申請sd卡權限

在上一篇文章安卓如何申請sd卡權限並寫入文件已經解決了向sd卡里面寫入文件的問題了,解決辦法需要startActivity,然後在onActivityResult方法裏面去監聽是否授權成功,這種方法對當前Activity的侵入性太強了,如何優化呢?
我的想法來自於rxpermission和glide,我們知道rxpermission申請權限非常簡單,只需要這麼幾句就搞定了:

RxPermissions.getInstance(this)
    .request(permissions)
    .subscribe(new Action1<Boolean>() {
        @Override
        public void call(Boolean granted) {
        if (granted) {
            // 已經獲取權限
        } else {
            // 未獲取權限
        }
        }
    });

那麼這是如何實現的呢?
通過查看RxPermission源碼發現,RxPermission是向當前activity植入一個fragment,由這個fragment來處理權限的監聽。glide中也使用了這一種植入fragment的方法,監聽當前界面的生命週期,從而確定是否需要加載圖片。

基於這樣一種方法,我們也來植入一個fragment,來處理權限問題。
項目代碼連接:https://github.com/whoami-I/SdcardPermission
使用:

PermissionManager.requestSdcardPermission(MainActivity.this, new PermissionFragment.OnPermissionResultListener() {
                    @Override
                    public void onGranted(Uri uri) {
	                    //寫入文件
                        DocumentFile documentFile = DocumentFile.fromTreeUri(MainActivity.this, uri);
                        DocumentFile file = documentFile.createFile("text/plain", "123.txt");
                        OutputStream outputStream = null;
                        try {
                            outputStream = getContentResolver().openOutputStream(file.getUri());
                            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
                            outputStreamWriter.write("hahahahahahaha");
                            outputStreamWriter.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onDenied() {
                        Toast.makeText(MainActivity.this, "reject sdcard access", Toast.LENGTH_SHORT).show();
                    }
                });

可以看出申請權限非常簡單,而且和當前Activity無任何耦合,我使用了listener來寫,大家也可以使用rxjava來實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章