Android的權(quán)限機(jī)制從第一個(gè)版本就有了,一些軟件,不管用不用的到這些權(quán)限芒珠,都先申請(qǐng)了再說牺堰。比如某企鵝拄轻,安裝軟件時(shí)可以看到它要了讀取和發(fā)送信息的權(quán)限,嘿嘿嘿伟葫,話說要這權(quán)限干嘛恨搓,。筏养。斧抱。。
然后Android針對(duì)這些問題渐溶,在Android 6.0(API23)時(shí)安卓加入了運(yùn)行時(shí)權(quán)限辉浦,從而更好的保護(hù)了用戶的隱私安全。
就是用戶不需要再安裝軟件的的時(shí)候一次性授權(quán)所有的權(quán)限茎辐,而是在軟件使用過程中針對(duì)某一些權(quán)限進(jìn)行申請(qǐng)宪郊,當(dāng)然眉睹,一般情況下,拒絕權(quán)限不會(huì)退出程序(萬惡的某博废膘,不給手機(jī)通訊錄打電話權(quán)限就退出)竹海,而是可以用別的功能。
并不是所有的權(quán)限都要在運(yùn)行時(shí)申請(qǐng)丐黄,這樣得多麻煩斋配。Android將權(quán)限分為了兩類,1 普通權(quán)限灌闺,2 危險(xiǎn)權(quán)限
普通權(quán)限就是說不會(huì)直接威脅到用戶的安全和隱私艰争。這些權(quán)限系統(tǒng)會(huì)自動(dòng)授權(quán),只要你聲明了桂对。
危險(xiǎn)權(quán)限就是涉及用戶隱私的甩卓。這些就要運(yùn)行時(shí)動(dòng)態(tài)申請(qǐng)了
普通權(quán)限和危險(xiǎn)權(quán)限
- Android系統(tǒng)有上百種權(quán)限,危險(xiǎn)權(quán)限如下表蕉斜,其他的就是普通權(quán)限了
需要注意的是
表格中每個(gè)權(quán)限都屬于一個(gè)權(quán)限組逾柿,要是申請(qǐng)了權(quán)限組的一個(gè)權(quán)限,那么該權(quán)限組的所有權(quán)限都會(huì)同時(shí)被授權(quán)宅此。比如机错,申請(qǐng)了WRITE_EXTERNAL_STORAGE這個(gè)權(quán)限,那么和它在同一權(quán)限組的READ_EXTERNAL_STORAGE也會(huì)同時(shí)被授權(quán)父腕!
不在這張表的權(quán)限可以直接在manifest文件里聲明就行了(API23以上)弱匪,不過平時(shí)為了兼容低版本,任何權(quán)限都要聲明在manifest文件里璧亮,然后在Activity中針對(duì)API23以上申請(qǐng)運(yùn)行時(shí)權(quán)限
動(dòng)態(tài)申請(qǐng)運(yùn)行時(shí)權(quán)限
一般情況下萧诫,比如,申請(qǐng)讀寫內(nèi)存卡權(quán)限
Manifest.permission.WRITE_EXTERNAL_STORAGE
在Activity的onCreate里
//判斷權(quán)限夠不夠枝嘶,不夠就給
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, 1);
} else {
//權(quán)限夠了這里處理邏輯
Log.d(TAG, "權(quán)限夠了");
}
Activity里加上回調(diào)帘饶,控制權(quán)限申請(qǐng)窗口彈出來的的邏輯
//獲取到權(quán)限回調(diào)方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[]permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//權(quán)限夠了處理邏輯
Log.d(TAG, "權(quán)限夠了,邏輯");
} else {
Toast.makeText(this, "權(quán)限不夠,程序?qū)⑼顺?, Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
break;
}
}
聲明權(quán)限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
然后運(yùn)行躬络,點(diǎn)擊拒絕就直接finish()了
Gradle集成
推薦的開源庫:
PermissionsDispatcher
中文版本: PermissionsDispatcher使用詳解
使用:
使用PermissionsDispatcher輕松解決Android權(quán)限問題
另一種思路:
Android 6.0運(yùn)行時(shí)權(quán)限簡(jiǎn)析及最佳實(shí)踐
參考