Android-XXPermissions權(quán)限請(qǐng)求框架

圖片來(lái)自網(wǎng)絡(luò)

在日常的開發(fā)當(dāng)中,肯定需要使用到一些Google官方定義的危險(xiǎn)權(quán)限,這個(gè)時(shí)候就需要用到權(quán)限請(qǐng)求框架了,網(wǎng)上有很多開源的權(quán)限請(qǐng)求框架,我們可以避免重復(fù)造輪子,又可以節(jié)省我們的開發(fā)時(shí)間。分享一下我常用的XXPermissions權(quán)限請(qǐng)求框架。

導(dǎo)入依賴

implementation 'com.github.getActivity:XXPermissions:13.2'

13.2是我寫博客時(shí)的最新版本。還需要在項(xiàng)目的build.gradle中加入下面語(yǔ)句:

buildscript {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}

這樣就是第一步導(dǎo)入依賴。

針對(duì)Android分區(qū)特性處理

我們就需要在AndroidManifest.xml中,加入下面的代碼:

<manifest>
    <application>
        <!-- 表示當(dāng)前項(xiàng)目已經(jīng)適配了分區(qū)存儲(chǔ)特性 -->
        <meta-data
            android:name="ScopedStorage"
            android:value="true" />
    </application>
</manifest>

鏈?zhǔn)秸?qǐng)求權(quán)限代碼

簡(jiǎn)單做一個(gè)權(quán)限請(qǐng)求的示例:

XXPermissions.with(this)
        // 申請(qǐng)單個(gè)權(quán)限
        .permission(Permission.RECORD_AUDIO)
        // 申請(qǐng)多個(gè)權(quán)限
        //.permission(Permission.Group.CALENDAR)
        // 申請(qǐng)安裝包權(quán)限
        //.permission(Permission.REQUEST_INSTALL_PACKAGES)
        // 申請(qǐng)懸浮窗權(quán)限
        //.permission(Permission.SYSTEM_ALERT_WINDOW)
        // 申請(qǐng)通知欄權(quán)限
        //.permission(Permission.NOTIFICATION_SERVICE)
        // 申請(qǐng)系統(tǒng)設(shè)置權(quán)限
        //.permission(Permission.WRITE_SETTINGS)
        // 設(shè)置權(quán)限請(qǐng)求攔截器
        //.interceptor(new PermissionInterceptor())
        // 設(shè)置不觸發(fā)錯(cuò)誤檢測(cè)機(jī)制
        //.unchecked()
        .request(new OnPermissionCallback() {

            @Override
            public void onGranted(List<String> permissions, boolean all) {
                if (all) {
                    toast("獲取錄音和日歷權(quán)限成功");
                } else {
                    toast("獲取部分權(quán)限成功,但部分權(quán)限未正常授予");
                }
            }

            @Override
            public void onDenied(List<String> permissions, boolean never) {
                if (never) {
                    toast("被永久拒絕授權(quán),請(qǐng)手動(dòng)授予錄音和日歷權(quán)限");
                    // 如果是被永久拒絕就跳轉(zhuǎn)到應(yīng)用權(quán)限系統(tǒng)設(shè)置頁(yè)面
                    XXPermissions.startPermissionActivity(MainActivity.this, permissions);
                } else {
                    toast("獲取錄音和日歷權(quán)限失敗");
                }
            }
        });

這樣動(dòng)態(tài)申請(qǐng)高危的權(quán)限是不是很簡(jiǎn)單呢?我就喜歡這樣去申請(qǐng)權(quán)限,方便快捷。

跳轉(zhuǎn)到系統(tǒng)權(quán)限頁(yè)面返回處理

可能前面的用戶就是不肯給權(quán)限的情況,框架支持跳轉(zhuǎn)到系統(tǒng)權(quán)限界面,從系統(tǒng)權(quán)限界面返回,我們可以這樣處理:

public class XxxActivity extends AppCompatActivity {

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == XXPermissions.REQUEST_CODE) {
            if (XXPermissions.isGranted(this, Permission.RECORD_AUDIO) &&
                    XXPermissions.isGranted(this, Permission.Group.CALENDAR)) {
                toast("用戶已經(jīng)在權(quán)限設(shè)置頁(yè)授予了錄音和日歷權(quán)限");
            } else {
                toast("用戶沒有在權(quán)限設(shè)置頁(yè)授予權(quán)限");
            }
        }
    }
}

框架其他的API

上面說(shuō)的是簡(jiǎn)單的事情,開源博主還提供了另外的API,也可以了解一下。
1.判斷一個(gè)或多個(gè)權(quán)限是否全部授予了:

XXPermissions.isGranted(Context context, String... permissions);

2.獲取沒有授予的權(quán)限:

XXPermissions.getDenied(Context context, String... permissions);

3.判斷某個(gè)權(quán)限是否為特殊權(quán)限:

XXPermissions.isSpecial(String permission);

4.判斷一個(gè)或多個(gè)權(quán)限是否被永久拒絕了:

XXPermissions.isPermanentDenied(Activity activity, String... permissions);

5.跳轉(zhuǎn)到應(yīng)用權(quán)限設(shè)置頁(yè),可以傳入三種不同的上下文:

XXPermissions.startPermissionActivity(Context context, String... permissions);
XXPermissions.startPermissionActivity(Activity activity, String... permissions);
XXPermissions.startPermissionActivity(Fragment fragment, String... permissions);

6.設(shè)置不觸發(fā)錯(cuò)誤檢測(cè)機(jī)制(全局設(shè)置):

XXPermissions.setCheckMode(false);

7.設(shè)置權(quán)限申請(qǐng)攔截器(全局設(shè)置):

XXPermissions.setInterceptor(new IPermissionInterceptor() {});

本人使用這個(gè)開發(fā)框架的開發(fā)體驗(yàn)是非常的棒的,希望對(duì)看到的這篇文章的小伙伴有所幫助。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容