一、RxPermissions是什麼
RxPermissions是基於RxJava的Android權限請求庫。它的請求權限與原生的請求方式相比更為簡單易用,而且在用戶拒絕授權後給予了極佳的處理方式。使用RxPermissions我們可以避免接連彈出多個權限請求彈窗的問題。
1、添加RxPermissions
我們首先需要添加RxPermissions庫的依賴。
<dependency>
<groupId>com.tbruyelle.rxpermissions2</groupId>
<artifactId>rxpermissions</artifactId>
<version>0.10.2</version>
</dependency>
2、聲明RxPermissions
在Activity中聲明一個RxPermissions對象:
RxPermissions rxPermissions = new RxPermissions(this);二、RxPermissions的使用方法
1、請求單個權限
請求單個權限非常簡單,我們只需要調用RxPermissions的request()方法並傳入需要請求的權限即可。
if (rxPermissions.isGranted(android.Manifest.permission.CAMERA)) {
// 已經授權
} else {
// 未授權,請求相機權限
rxPermissions.request(android.Manifest.permission.CAMERA)
.subscribe(granted -> {
if (granted) {
// 授權成功
} else {
// 授權失敗
}
});
}2、請求多個權限
請求多個權限時我們只需要在request()方法中傳入需要請求的多個權限即可。
rxPermissions.request(
android.Manifest.permission.CAMERA,
android.Manifest.permission.READ_PHONE_STATE,
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(granted -> {
if (granted) {
// 授權成功
} else {
// 授權失敗
}
});3、請求帶拒絕提示的權限
在用戶拒絕授權時,我們可以使用RxPermissions的requestEachCombined()方法來請求權限。這個方法會在用戶拒絕多個權限時給予一個統一的拒絕提示。
rxPermissions.requestEachCombined(
android.Manifest.permission.CAMERA,
android.Manifest.permission.READ_PHONE_STATE,
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(permission -> {
if (permission.granted) {
// 授權成功
} else if (permission.shouldShowRequestPermissionRationale) {
// 用戶拒絕授權,但未勾選“不再詢問”
} else {
// 用戶拒絕授權,且勾選了“不再詢問”
}
});4、請求某個權限的狀態
我們可以使用RxPermissions的isGranted()方法來查詢某個權限是否已經授權。代碼如下:
if (rxPermissions.isGranted(android.Manifest.permission.CAMERA)) {
// 已經授權
} else {
// 未授權
}5、請求多個權限的狀態
我們可以使用RxPermissions的requestEach()方法來查詢並且請求多個權限的狀態。這個方法將會返回多個權限的狀態,我們可以根據狀態判斷權限是否已經被授權。代碼如下:
rxPermissions.requestEach(
android.Manifest.permission.CAMERA,
android.Manifest.permission.READ_PHONE_STATE,
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(permission -> {
if (permission.granted) {
// 權限已經授權
} else if (permission.shouldShowRequestPermissionRationale) {
// 用戶拒絕授權,但未勾選“不再詢問”
} else {
// 用戶拒絕授權,且勾選了“不再詢問”
}
});三、RxPermissions的錯誤處理
在使用RxPermissions時,我們需要關注請求權限時可能會出現的錯誤。下面我們將介紹常見的兩種錯誤。
1、權限被拒絕,但未勾選“不再詢問”
在請求某個權限時,用戶拒絕授權,但沒有勾選“不再詢問”,此時可以通過shouldShowRequestPermissionRationale屬性來判斷。shouldShowRequestPermissionRationale屬性值為true時表示用戶拒絕授權,但未勾選“不再詢問”。
2、權限被拒絕,且勾選了“不再詢問”
在請求某個權限時,用戶拒絕授權,且勾選了“不再詢問”,此時我們可以通過requestPermissions()方法給出提示,引導用戶前往設置頁面開啟權限。
if (permission.granted) {
// 權限已經授權
} else if (permission.shouldShowRequestPermissionRationale) {
// 用戶拒絕授權,但未勾選“不再詢問”
} else {
// 用戶拒絕授權,且勾選了“不再詢問”
Toast.makeText(MainActivity.this, "請前往應用設置中打開相應權限", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_SETTING); // REQUEST_SETTING是一個請求碼
}四、RxPermissions的優點
1、簡單易用
RxPermissions請求權限提供的方法比系統提供的更加容易理解。
2、多權限請求
我們可以一次性請求多個權限。
3、錯誤處理
RxPermissions提供了更好的錯誤處理方式,通過判斷shouldShowRequestPermissionRationale屬性值,我們可以充分避免在用戶多次拒絕授權後,系統會自動隱藏權限請求彈窗的問題。
4、兼容性好
RxPermissions支持Android 6.0以上的系統版本,並支持AndroidX。
5、可觀察狀態
RxPermissions提供了可觀察的請求狀態,這意味着我們可以使用RxJava的操作符對權限請求做更多的處理。
五、總結
通過以上介紹,我們可以看到,使用RxPermissions可以有效地避免代碼複雜度的增加,而且在用戶拒絕授權的情況下,提供了較好的錯誤處理方式。RxPermissions的使用方式也非常方便,我們只需要調用request()方法即可請求權限。使用RxPermissions能夠讓你的代碼更加簡潔,清晰明了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/159651.html
微信掃一掃
支付寶掃一掃