前言:

上篇重點學習了Android 6.0的執行時許可權,今天還是圍繞著Android 6.0許可權適配來總結學習,這裡主要介紹一下我們公司解決Android 6.0許可權適配的方案:RxJava+RxPermission。這裡不再介紹Android 6.0執行時許可權了,直接看下如何使用RxPermission。

許可權管理相關部落格:

RxPermission:

用於適配Android 6.0新的許可權模型的開源框架。

github地址:https://github.com/tbruyelle/RxPermissions

如何使用?

1.)在app module的build.gradle中新增如下配置

使用該開源框架minSdkVersion 必須小於9

repositories {
jcenter() // If not already there
} dependencies {
compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.0@aar'
}

如果使用的RxJava2的話使用下面的配置

與RxJava不同的是包名變成了com.tbruyelle.rxpermissions2,不過說實話RxJava2我還沒使用過。

dependencies {
compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.8.2@aar'
}

2.)直接申請許可權使用

RxPermissions.getInstance(this)是以單例的形式使用的,這裡以申請拍照許可權為例

RxPermissions.getInstance(this)
.request(permissions)
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean granted) {
if (granted) { // 在android 6.0之前會預設返回true
// 已經獲取許可權
String jpgPath = getCacheDir() + "test.jpg";
takePhotoByPath(jpgPath, 2);
} else {
// 未獲取許可權
Toast.makeText(MainActivity.this, "您沒有授權該許可權,請在設定中開啟授權", Toast.LENGTH_SHORT).show();
}
}
});

這裡直接返回是否授權,我們可以根據這個值進行不同的處理。

3.)條件觸發獲取許可權(結合RxBinding使用)

關於RxBinding的可以檢視這個JakeWharton/RxBinding

RxView.clicks(findViewById(R.id.request_permission))
.compose(RxPermissions.getInstance(this).ensure(Manifest.permission.CAMERA))
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean granted) { if (granted) { // 在android 6.0之前會預設返回true
// 已經獲取許可權
String jpgPath = getCacheDir() + "test.jpg";
takePhotoByPath(jpgPath, 2);
} else {
// 未獲取許可權
Toast.makeText(MainActivity.this, "您沒有授權該許可權,請在設定中開啟授權", Toast.LENGTH_SHORT).show();
}
}
});

3.)同時請求多個許可權(合併結果)

比如同時申請拍照和錄音許可權

RxPermissions.getInstance(MainActivity.this).request(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean granted) {
if (granted) { // 在android 6.0之前會預設返回true
// 已經獲取許可權
String jpgPath = getCacheDir() + "test.jpg";
takePhotoByPath(jpgPath, 2);
} else {
// 未獲取許可權
Toast.makeText(MainActivity.this, "您沒有授權該許可權,請在設定中開啟授權", Toast.LENGTH_SHORT).show();
}
}
});

如果同時請求多個許可權,下面這種方式會合並請求結果,即所有許可權請求成功會返回true,若有一個許可權未成功則返回false

4.)同時請求多個許可權(分別獲取結果)

如果想要在同時請求多個許可權,又想分別獲取授權結果的話,可以呼叫requestEach方法或者ensureEach方法

RxPermissions.getInstance(MainActivity.this).requestEach(Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO)
.subscribe(new Action1<Permission>() {
@Override
public void call(Permission permission) {
if (permission.name.equals(Manifest.permission.CAMERA)) {
if (permission.granted) {
String jpgPath = getCacheDir() + "test.jpg";
takePhotoByPath(jpgPath, 2);
} else {
// 未獲取許可權
Toast.makeText(MainActivity.this, "您沒有授權該許可權,請在設定中開啟授權", Toast.LENGTH_SHORT).show();
} } else if (permission.name.equals(Manifest.permission.RECORD_AUDIO)) { }
}
});

總結:

目前我們就是採用RxPermission來進行Android 6.0的許可權適配。