RxPermission申請權(quán)限

前言

之前有講到PermissionsDispatcher動態(tài)權(quán)限申請的使用贵试,大叫感興趣的話可參考
PermissionsDispatcher動態(tài)權(quán)限申請
PermissionsDispatcher動態(tài)權(quán)限申請kotlin版
不得不說PermissionsDispatcher庫還是很厲害的矛缨。然后又看了下其他的權(quán)限庫,發(fā)現(xiàn)RxPermission用得也比較多儒搭,為了方便使用,我將RxPermission做了下簡單的封裝PermissionHelper2择份,下面就來講講它的使用吧履植。

今天涉及內(nèi)容:

  1. 添加依賴
  2. PermissionHelper2簡單介紹
  3. PermissionHelper2在activity中使用
  4. 效果圖及項目結(jié)構(gòu)圖
  5. PermissionHelper2及相關(guān)源碼

一. 添加依賴

rxpermissions借助了rxandroidrxjava進行構(gòu)建,項目中也需要依賴rxandroidrxjava相關(guān)庫陪汽。
在項目app_nodule對應(yīng)的build.gradle中添加依賴:

dependencies {
    //rxandroid3.x
    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
     //rxjava3.x
    implementation 'io.reactivex.rxjava3:rxjava:3.1.5'
    //rxpermissions
    implementation 'com.github.tbruyelle:rxpermissions:0.12'

    //其他代碼此處忽略
    //......
}

二. PermissionHelper2簡單介紹

PermissionHelper2是一個單例類训唱,其初始化如下:

PermissionHelper2.getInstance()

此類涉及以下常用方法:

    /***
     * 申請單個權(quán)限
     *
     * 注: 同意后再申請此權(quán)限則不再彈出提示框
     *
     * @param permission:權(quán)限,如 Manifest.permission.READ_EXTERNAL_STORAGE
     * @param activityOrFragment:FragmentActivity或 Fragment實例
     * @return access: true:申請成功  fasle:申請失敗
     */
    public void request(String permission, ViewModelStoreOwner activityOrFragment, IPermissionResultListener listener) ;

    /***
     * 申請單個權(quán)限,獲得詳細信息
     *
     * @param permission 權(quán)限挚冤,如 Manifest.permission.READ_EXTERNAL_STORAGE
     * @param activityOrFragment FragmentActivity或 Fragment實例
     */
    public void requestInfo(String permission, ViewModelStoreOwner activityOrFragment, IPermissionResultInfoListener listener)

    /***
     * 申請多個權(quán)限(返回一個permission對象)
     *
     * 注: 只要有一個禁止况增,則返回false;全部同意训挡,則返回true
     *     某個權(quán)限同意后澳骤,之后再申請此權(quán)限則不再彈出提示框,其他的會繼續(xù)彈出
     *
     * @param permissions 權(quán)限數(shù)組
     * @param activityOrFragment  FragmentActivity或 Fragment實例
     * @return access: true:申請成功  fasle:申請失敗
     */
    public void requestEach(String permissions[], ViewModelStoreOwner activityOrFragment, IPermissionResultListener listener)

    /***
     * 申請多個權(quán)限,獲得詳細信息(返回多個permission對象)
     *
     * @param permissions 權(quán)限數(shù)組
     * @param activityOrFragment FragmentActivity或 Fragment實例
     */
    public void requestEachInfo(String permissions[], ViewModelStoreOwner activityOrFragment, IPermissionResultInfoListener listener)

    /***
     * 申請多個權(quán)限舍哄,獲取合并后的詳細信息
     *
     * @param permissions 權(quán)限數(shù)組
     * @param activityOrFragment FragmentActivity或 Fragment實例
     */
    public void requestEachCombinedInfo(String permissions[], ViewModelStoreOwner activityOrFragment, IPermissionResultInfoListener listener)

    /**
     * 檢查某個權(quán)限是否被申請
     *
     * @param permisson          權(quán)限數(shù)組
     * @param activityOrFragment FragmentActivity或 Fragment實例
     * @return true:有該權(quán)限  fasle:無該權(quán)限
     */
    public boolean checkPermission(String permisson, ViewModelStoreOwner activityOrFragment)

三. PermissionHelper2在activity中使用

在使用之前宴凉,需要在Manifast.xml中添加以下權(quán)限:

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

然后誊锭,為了兼容Android10權(quán)限申請表悬,需要在Manifast.xml文件的自定義application標簽中添加如下屬性:

    <application
        android:requestLegacyExternalStorage="true" //添加此屬性兼容Android10
        //其他代碼省略
       //......
         >
        <activity
           .../>
           ......
      </application>

下面以拍照和文件讀寫權(quán)限申請為例,再添加以上所述之外丧靡,Manifast.xml中需要追加以下三個權(quán)限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />

下面給出PermissionHelper2MainActivity中調(diào)用代碼:

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.tbruyelle.rxpermissions3.Permission;
import com.testdemo.util.Util;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView mTv;
    private Button mBtn;
    private Button mBtn2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initData();
        setListener();
    }

    private void initView() {
        mTv = findViewById(R.id.tv_text);
        mBtn = findViewById(R.id.btn_test);
        mBtn2 = findViewById(R.id.btn_test2);
    }

    private void initData() {

    }

    private void setListener() {
        mBtn.setOnClickListener(this);
        mBtn2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_test:
                //申請單個權(quán)限
                String permission = Manifest.permission.CAMERA;
                PermissionHelper2.getInstance().requestInfo(permission, MainActivity.this, new PermissionHelper2.IPermissionResultInfoListener() {
                    @Override
                    public void checkPermission(Permission permission) {
                        if (permission.granted) {//All權(quán)限同意后調(diào)用
                            Util.i("======權(quán)限都通過=======");
                            toast("====權(quán)限申請成功===");
                        } else if (permission.shouldShowRequestPermissionRationale) {
                            //只要有一個選擇:禁止蟆沫,但沒有選擇“以后不再詢問”籽暇,以后申請權(quán)限,會繼續(xù)彈出提示
                            Util.i(" 拒絕權(quán)限饭庞,并沒有勾選‘不再詢問’,下次點擊會繼續(xù)彈出提示=");
                            toast("====權(quán)限申請失敗===");
                        } else {
                            // but有個問題:去設(shè)置頁面手動開啟權(quán)限后回到app戒悠,回調(diào)不能自動執(zhí)行允許權(quán)限的代碼,
                            // 即沒辦法自動進入App,需要重啟App才正常舟山,是否可以在onResume()里處理绸狐?
                            Util.i("======彈框去設(shè)置界面=======");
                            showAlertDialog("權(quán)限申請",
                                    "需要獲取手機相關(guān)權(quán)限,是否去設(shè)置界面?",
                                    "確定", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            //去設(shè)置界面
                                            goToSetting(MainActivity.this);
                                        }
                                    },
                                    "取消", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            Util.i("========取消了權(quán)限======");
                                        }
                                    });
                        }
                    }
                });
                break;
            case R.id.btn_test2:
                //申請一組權(quán)限
                String permissons[] = {Manifest.permission.CAMERA,
                        Manifest.permission.READ_EXTERNAL_STORAGE,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE};
                PermissionHelper2.getInstance().requestEachCombinedInfo(permissons, MainActivity.this, new PermissionHelper2.IPermissionResultInfoListener() {
                    @Override
                    public void checkPermission(Permission permission) {
                        if (permission.granted) {//All權(quán)限同意后調(diào)用
                            Util.i("======所有權(quán)限申請成功=======");
                            toast("====所有權(quán)限申請成功===");
                        } else if (permission.shouldShowRequestPermissionRationale) {
                            //只要有一個選擇:禁止,但沒有選擇“以后不再詢問”累盗,以后申請權(quán)限寒矿,會繼續(xù)彈出提示
                            Util.i(" 拒絕權(quán)限,并沒有勾選‘不再詢問’,下次點擊會繼續(xù)彈出提示=");
                            toast("====部分權(quán)限申請失敗===");
                        } else {
                            // but有個問題:去設(shè)置頁面手動開啟權(quán)限后回到app若债,回調(diào)不能自動執(zhí)行允許權(quán)限的代碼符相,
                            // 即沒辦法自動進入App,需要重啟App才正常,是否可以在onResume()里處理蠢琳?
                            Util.i("======彈框去設(shè)置界面=======");
                            showAlertDialog("權(quán)限申請",
                                    "需要獲取手機相關(guān)權(quán)限,是否去設(shè)置界面?",
                                    "確定", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            //去設(shè)置界面
                                            goToSetting(MainActivity.this);
                                        }
                                    },
                                    "取消", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            Util.i("========取消了權(quán)限======");
                                        }
                                    });
                        }
                    }
                });
                break;
            default:
                break;
        }
    }


    /**
     * 含有標題啊终、內(nèi)容、兩個按鈕的對話框
     **/
    protected AlertDialog showAlertDialog(String title, String message, String positiveText,
                                          DialogInterface.OnClickListener onPositiveClickListener, String negativeText,
                                          DialogInterface.OnClickListener onNegativeClickListener) {
        AlertDialog alertDialog = new AlertDialog.Builder(this).setTitle(title).setMessage(message)
                .setPositiveButton(positiveText, onPositiveClickListener).setNegativeButton(negativeText, onNegativeClickListener).show();
        return alertDialog;
    }

    protected void toast(String message) {
        Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
    }

    /***
     * 去設(shè)置界面
     */
    public static void goToSetting(Context context) {
        //go to setting view
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", context.getPackageName(), null);
        intent.setData(uri);
        context.startActivity(intent);
    }

}

四. 效果圖及項目結(jié)構(gòu)圖

申請單個權(quán)限.gif
申請多個權(quán)限.gif
項目結(jié)構(gòu)圖.png

五. PermissionHelper2及相關(guān)源碼

PermissionHelper2使用前涉及到一個工具類的Util,下面給出Util類代碼:

還有 46% 的精彩內(nèi)容
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
支付 ¥4.00 繼續(xù)閱讀
  • 序言:七十年代末傲须,一起剝皮案震驚了整個濱河市蓝牲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泰讽,老刑警劉巖搞旭,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異菇绵,居然都是意外死亡肄渗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門咬最,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翎嫡,“玉大人,你說我怎么就攤上這事永乌』笊辏” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵翅雏,是天一觀的道長圈驼。 經(jīng)常有香客問我,道長望几,這世上最難降的妖魔是什么绩脆? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上靴迫,老公的妹妹穿的比我還像新娘惕味。我一直安慰自己,他們只是感情好玉锌,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布名挥。 她就那樣靜靜地躺著,像睡著了一般主守。 火紅的嫁衣襯著肌膚如雪禀倔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天参淫,我揣著相機與錄音蹋艺,去河邊找鬼。 笑死黄刚,一個胖子當(dāng)著我的面吹牛捎谨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播憔维,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼涛救,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了业扒?” 一聲冷哼從身側(cè)響起检吆,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎程储,沒想到半個月后蹭沛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡章鲤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年摊灭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片败徊。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡帚呼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出皱蹦,到底是詐尸還是另有隱情煤杀,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布沪哺,位于F島的核電站沈自,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辜妓。R本人自食惡果不足惜枯途,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一忌怎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柔袁,春花似錦、人聲如沸异逐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灰瞻。三九已至腥例,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酝润,已是汗流浹背燎竖。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留要销,地道東北人构回。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像疏咐,于是被迫代替她去往敵國和親纤掸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容