Android權限管理之RxPermission解決Android 6.0 適配問題


前言:

    上篇重點學習了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的權限適配。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM