在上一篇文章安卓如何申請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來實現。