上篇重點學習了Android 6.0的運行時權限,今天仍是圍繞着Android 6.0權限適配來總結學習,這裏主要介紹一下咱們公司解決Android 6.0權限適配的方案:RxJava+RxPermission。這裏再也不介紹Android 6.0運行時權限了,直接看下如何使用RxPermission。html
權限管理相關博客:android
用於適配Android 6.0新的權限模型的開源框架。git
github地址:https://github.com/tbruyelle/RxPermissionsgithub
使用該開源框架minSdkVersion
必須小於9app
repositories {
jcenter() // If not already there
}
dependencies {
compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.0@aar'
}
若是使用的RxJava2的話使用下面的配置框架
與RxJava不一樣的是包名變成了com.tbruyelle.rxpermissions2,不過說實話RxJava2我還沒使用過。ide
dependencies {
compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.8.2@aar'
}
RxPermissions.getInstance(this)是以單例的形式使用的,這裏以申請拍照權限爲例post
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(); } } });
這裏直接返回是否受權,咱們能夠根據這個值進行不一樣的處理。學習
關於RxBinding的能夠查看這個JakeWharton/RxBinding gradle
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(); } } });
好比同時申請拍照和錄音權限
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
。
若是想要在同時請求多個權限,又想分別獲取受權結果的話,能夠調用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的權限適配。