一、6.0權(quán)限介紹
Android6.0提交對(duì)權(quán)限進(jìn)行了較大的優(yōu)化,權(quán)限根據(jù)用戶隱私區(qū)分兩類:一般權(quán)限和運(yùn)行時(shí)權(quán)限。
targetSdkVersion小于23的應(yīng)用默認(rèn)授予了所申請(qǐng)的所有權(quán)限,當(dāng)targetSdkVersion大于23時(shí),使用未授權(quán)的運(yùn)行時(shí)權(quán)限,就會(huì)導(dǎo)致應(yīng)用崩潰。將APP的targetSdkVersion設(shè)置低于23,在運(yùn)行時(shí)不會(huì)崩潰,但只是一個(gè)應(yīng)急處理,不是長(zhǎng)久之計(jì)。
二、運(yùn)行時(shí)權(quán)限介紹
用戶可對(duì)運(yùn)行時(shí)權(quán)限進(jìn)行開(kāi)關(guān),當(dāng)應(yīng)用使用未授權(quán)運(yùn)行時(shí)權(quán)限時(shí),就需要?jiǎng)討B(tài)進(jìn)行權(quán)限申請(qǐng)。
運(yùn)行時(shí)權(quán)限分為9個(gè)權(quán)限組,權(quán)限組打開(kāi)后,該組下所有權(quán)限都能正常使用。

- 權(quán)限查詢、申請(qǐng)
//檢查權(quán)限
if (ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
//申請(qǐng)?zhí)崾? if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
/提示操作
} else {
//申請(qǐng)權(quán)限
ActivityCompat.requestPermissions(thisActivity,new String[]{Manifest.permission.READ_CONTACTS},REQUEST_CODE);
}
}
- 處理回調(diào)
@Override
public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE:
if (grantResults.length > 0&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//成功
} else {
//失敗
}
break;
}
}
- 注意:
Fragment中申請(qǐng)權(quán)限,不要使用ActivityCompat.requestPermissions, 直接使用Fragment的requestPermissions方法,否則會(huì)回調(diào)到Activity的onRequestPermissionsResult
如果在Fragment中嵌套Fragment,在子Fragment中使用requestPermissions方法,onRequestPermissionsResult不會(huì)回調(diào)回來(lái),建議使用getParentFragment().requestPermissions方法,
這個(gè)方法會(huì)回調(diào)到父Fragment中的onRequestPermissionsResult
三、運(yùn)行時(shí)權(quán)限框架使用
在開(kāi)發(fā)過(guò)程中,使用如上代碼來(lái)進(jìn)行權(quán)限申請(qǐng),重復(fù)代碼量過(guò)多,所以下面介紹下開(kāi)源框架
基于RxJava的運(yùn)行時(shí)權(quán)限檢測(cè)框架(個(gè)人傾向)
RxPermissions
RxPermissions rxPermissions = new RxPermissions(this); // where this is an Activity instance
Example : request the CAMERA permission (with Retrolambda for brevity, but not required)
// Must be done during an initialization phase like onCreate
rxPermissions
.request(Manifest.permission.CAMERA)
.subscribe(granted -> {
if (granted) { // Always true pre-M
// I can control the camera now
} else {
// Oups permission denied
}
});
Google官方的例子
android-RuntimePermissions
參考文獻(xiàn):感謝
Android 6.0 運(yùn)行時(shí)權(quán)限處理