
在日常的開發(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ì)看到的這篇文章的小伙伴有所幫助。