Android 動(dòng)態(tài)權(quán)限
從 Android 6.0 (API 23)開始使用動(dòng)態(tài)的權(quán)限及(targetSdkVersion >=23 就需要?jiǎng)討B(tài)的申請(qǐng)權(quán)限)志膀,使得系統(tǒng)更加安全逗载,用戶的信息也得到了更好的保護(hù)响谓。
在android 6.0 中權(quán)限被分為兩種:
- Normal Permissions (正常權(quán)限)
- Dangerous Permissions(危險(xiǎn)權(quán)限)
其中危險(xiǎn)權(quán)限又進(jìn)行了分類,把所有的危險(xiǎn)權(quán)限分為了九組。正常的權(quán)限是不需要?jiǎng)討B(tài)的申請(qǐng)的注整,只有危險(xiǎn)權(quán)限才需要?jiǎng)討B(tài)的申請(qǐng)厚柳。
所有的危險(xiǎn)權(quán)限:
權(quán)限組 | 權(quán)限 |
---|---|
CALENDAR | 日歷 |
CAMERA | 相機(jī) |
CONTACTS | 聯(lián)系人 |
LOCATION | 定位 |
MICROPHONE | 麥克,錄音 |
PHONE | 手機(jī)狀態(tài) |
SENSORS | 傳感器 |
SMS | 短信 |
STORAGE | 存儲(chǔ)權(quán)限 |
Anroid 6.0 中權(quán)限問題中需要注意的兩點(diǎn)
- 由于權(quán)限API問題项滑,我們的 Activity 最好是 AppCompatActivity 類型的,也就是說在你的 BaseActivity 需要繼承 AppCompatActivity陪踩。
- 權(quán)限是分組的杖们,同一組的權(quán)限申請(qǐng)其中一個(gè),同組的權(quán)限就全部都申請(qǐng)了肩狂。當(dāng)然摘完,不論是正常權(quán)限還是危險(xiǎn)權(quán)限都必須在應(yīng)用的 Manifest.xml 中聲明。
使用開源的 EasyPermissions 進(jìn)行動(dòng)態(tài)的申請(qǐng)
GitHub 地址: EasyPermissions 這個(gè)項(xiàng)目是GoogleSamples
-
配置
在 app 層的 build.gradle 中dependencies { compile 'pub.devrel:easypermissions:0.4.2' }
-
使用
舉栗子
在Activity(Fragment)中都可以使用private void checkPermissions() { //每一次在需要使用到權(quán)限的時(shí)候都要進(jìn)行檢查權(quán)限是否開啟傻谁,雖然之前是開啟的孝治,但是用戶有可能關(guān)閉權(quán)限 //這里是需要申請(qǐng)的權(quán)限 String[] perms = {Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE}; if(EasyPermissions.hasPermissions(this,perms)){ //權(quán)限已經(jīng)申請(qǐng)完成,執(zhí)行任務(wù) choosePhoto(); }else{ EasyPermissions.requestPermissions(this,"需要訪問你的相冊(cè)",RC_WRITE_READ_EXTERNAL_STORAGE,perms); //RC_WRITE_READ_EXTERNAL_STORAGE 是requestCode } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // Forward results to EasyPermissions EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } @Override public void onPermissionsDenied(int requestCode, List<String> perms) { if (EasyPermissions.somePermissionPermanentlyDenied(this,perms)){ new AppSettingsDialog.Builder(this).build().show(); } } //如果選擇了,取消權(quán)限,再次檢查時(shí)會(huì)進(jìn)入onActivityResult @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode){ case AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE: Toast.makeText(this,"您需要開啟訪問相冊(cè)的權(quán)限才能選擇圖片觅够,請(qǐng)進(jìn)入設(shè)置中開啟訪問權(quán)限",Toast.LENGTH_SHORT).show(); break; } }