Android 6.0運行時權限第三方庫的使用-----RxPermissions

運行時權限的講解在前一篇博客已經算是說的比較清楚了,這裏就不說了,如果對6.0這個新特性不是很瞭解的朋友建議先看看(地址:http://blog.csdn.net/qq_33923079/article/details/53428756),那麼本篇就直接說怎麼使用第三方開源庫了,本人通過實踐比較覺得PxPermissions這個開源庫好用,這裏就是他的使用說明書了。當然你可以去Github上搜索PxPermissions去查看源碼學習,或者查看作者自己的使用說明。
當然這裏也給出地址:
https://github.com/tbruyelle/RxPermissions

下面開始正題:


首先是RxPermission庫的引入,通過添加依賴即可:
在app的buildgradle文件中添加依賴:

dependencies {
    ...
    //RxPermissions
    compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'
    //RxJava2
    compile "io.reactivex.rxjava2:rxjava:2.0.0"
}

也可以在Project Strcuture裏搜索這個依賴庫,直接添加。

由於Rxjava的巨大優勢和RxPremissions的優秀封裝使用起來非常方便

RxPermissions rxPermissions = new RxPermissions(MainActivity.this);
rxPermissions.request(Manifest.permission.CALL_PHONE)
        .subscribe(new Observer<Boolean>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(Boolean value) {
                if(value){
                    Toast.makeText(MainActivity.this, "同意權限", Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(MainActivity.this, "拒絕權限", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });

如果需要同時生氣多個權限並且要分別判斷權限是否授予,可以使用如下寫法:

RxPermissions rxPermission = new RxPermissions(getActivity());
        rxPermission
                .requestEach(Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.READ_CALENDAR,
                        Manifest.permission.READ_CALL_LOG,
                        Manifest.permission.READ_CONTACTS,
                        Manifest.permission.READ_PHONE_STATE,
                        Manifest.permission.READ_SMS,
                        Manifest.permission.RECORD_AUDIO,
                        Manifest.permission.CAMERA,
                        Manifest.permission.CALL_PHONE,
                        Manifest.permission.SEND_SMS)
                .subscribe(new Consumer<Permission>() {
                    @Override
                    public void accept(Permission permission) throws Exception {
                        if (permission.granted) {
                            // 用戶已經同意該權限
                            Log.d(TAG, permission.name + " is granted.");
                        } else if (permission.shouldShowRequestPermissionRationale) {
                            // 用戶拒絕了該權限,沒有選中『不再詢問』(Never ask again),那麼下次再次啓動時,還會提示請求權限的對話框
                            Log.d(TAG, permission.name + " is denied. More info should be provided.");
                        } else {
                            // 用戶拒絕了該權限,並且選中『不再詢問』
                            Log.d(TAG, permission.name + " is denied.");
                        }
                    }
                });

我還能說什麼,真的是已經很簡潔了,相比其他AndPremission和PremissionGen的有些缺陷和相對複雜的邏輯判斷,我要說:這是我見過最簡潔的運行時權限的寫法了。當然如果你使用lambda表達式的會更簡潔:

RxPermissions rxPermissions = new RxPermissions(MainActivity.this);
rxPermissions
        .request(Manifest.permission.CALL_PHONE)
        .subscribe(granted -> {
            if (granted) {
                Toast.makeText(MainActivity.this, "同意權限", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "拒絕權限", Toast.LENGTH_SHORT).show();
            }
        });

我只想說,Premission遇到RxJava那就是Android界的一大福音啊,簡直就是十月革命一聲槍響,給我們送來馬克思主義啊。

綜合這兩篇博客,我們可以看到運行時權限無非就是:權限判斷,權限申請,授權監聽,有權邏輯,無權提示這五步。代碼量是比以前增加不少,還好危險權限相對不多,也可以集中申請,用時判斷;再考慮到Android的每一次進步,都對我們開發者雖然眼前吃點苦,但長期來看也是有很大好處的,也就可以很愉快地接受了這個現實。

關於複雜業務場景權限判斷的思考

以上實例是在處理單個或單一權限組的權限申請,也對應着一個權限邏輯,這並不意味每次危險權限都要單獨執行上面的幾步;其實可以只申請一次,然後針對不同權限執行不同的操作。如果是一次權限申請對應不同的權限邏輯,用戶可能未授予全部權限,導致部分權限操作可以執行,部分不行,這裏AndPermission也留了很好的擴展空間,在涉及到權限的方法裏都有String[] permissions或者List grantedPermissions這樣的權限數組和集合,從而實現針對對單個權限執行特殊操作。

結束語

有了RxPermissions,就可以直接秒殺6.0的這個新特性了。另外關於PermissionGen的失敗回調,以及AndPermission的Fragment部分機型無法接收回調的事情,我只想說,希望國內的大牛再接在勵,我們這些小輩也是要動勁了。
ok,運行時權限通過就說到這裏吧。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章