Android權(quán)限(普通權(quán)限+危險(xiǎn)權(quán)限)

注意:本篇文章是本人閱讀相關(guān)文章所寫(xiě)下的總結(jié)睦尽,方便以后查閱荆隘,所有內(nèi)容非原創(chuàng),侵權(quán)刪捺宗。

本篇文章內(nèi)容來(lái)自于
1.Android第一行代碼 郭霖

目錄

1.權(quán)限分類(lèi)(普通權(quán)限+危險(xiǎn)權(quán)限)
2.申請(qǐng)單個(gè)權(quán)限 第一行代碼248
3.申請(qǐng)多個(gè)權(quán)限 第一行代碼388

1.權(quán)限分類(lèi)

1??低于6.0系統(tǒng)的設(shè)備<use-permission> 安裝時(shí)給權(quán)限申請(qǐng)?zhí)嵝押崤梗铱梢栽谠O(shè)置中進(jìn)行管理尚粘。如果不同意某項(xiàng)則這個(gè)軟件不能使用。
2??6.0系統(tǒng)加入運(yùn)行時(shí)權(quán)限 用戶(hù)不需要在安裝時(shí)一次性申請(qǐng)所有權(quán)限蝇庭,可以在軟件使用過(guò)程中對(duì)某一項(xiàng)申請(qǐng)進(jìn)行授權(quán) 拒絕后只是不能用這個(gè)功能醉鳖,其他功能依舊可以使用

但并不是所有權(quán)限都需要運(yùn)行時(shí)申請(qǐng),對(duì)于用戶(hù)來(lái)說(shuō)哮内,不停授權(quán)也很麻煩盗棵。
Android將所有權(quán)限分為:
普通權(quán)限 系統(tǒng)自動(dòng)授權(quán)(只需要在清單文件中<use-permission> )
危險(xiǎn)權(quán)限 必須用戶(hù)手動(dòng)授權(quán) 威脅安全(需要?jiǎng)討B(tài)申請(qǐng))

Android中有上百種權(quán)限,如何區(qū)分哪些是普通哪些是危險(xiǎn)北发。危險(xiǎn)權(quán)限一共有9組24個(gè)纹因,其他的都是普通權(quán)限。
所有權(quán)限列表查看Android權(quán)限列表(轉(zhuǎn))

Android危險(xiǎn)權(quán)限:

編號(hào) 權(quán)限組 權(quán)限
0 CALENDAR READ_CALENDAR WRITE_CALENDAR
1 CAMERA CAMERA
2 CONTACTS READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS
3 LOCATION ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION
4 MICROPHONE RECORD_AUDIO
5 PHONE READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS
6 SENSORS BODY_SENSORS
7 SMS SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS
8 STORAGE READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE

注意:表格中的每個(gè)危險(xiǎn)權(quán)限都屬于一個(gè)權(quán)限組琳拨,我們?cè)谶M(jìn)行運(yùn)行時(shí)權(quán)限處理時(shí)使用的是權(quán)限名瞭恰,但是用戶(hù)一旦同意授權(quán)了,那么該權(quán)限所對(duì)應(yīng)的權(quán)限組中的其他權(quán)限也會(huì)同時(shí)被授權(quán)狱庇。

2.申請(qǐng)單個(gè)權(quán)限

例子:點(diǎn)擊按鈕進(jìn)行撥號(hào)惊畏,需要危險(xiǎn)權(quán)限中的CALL_PHONE權(quán)限
第一步:在清單文件中聲明權(quán)限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.apple.encryptiondemo">
    <uses-permission android:name="android.permission.CALL_PHONE" />
    ...

第二步:在代碼中進(jìn)行動(dòng)態(tài)申請(qǐng)權(quán)限

public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn_call = findViewById(R.id.btn_call);
        btn_call.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //==第一步:判斷用戶(hù)是否已經(jīng)授權(quán)
                //ContextCompat.checkSelfPermission() 參數(shù)一:context 參數(shù)二:具體的權(quán)限名
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    //沒(méi)有授權(quán)恶耽,則申請(qǐng)授權(quán)
                    //ActivityCompat.requestPermissions() 參數(shù)一:context 參數(shù)二:申請(qǐng)的權(quán)限名數(shù)組 參數(shù)三:請(qǐng)求碼,要求唯一值
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
                } else {
                    call();
                }
            }
        });
    }

    @SuppressLint("MissingPermission")
    private void call() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:10086"));
        startActivity(intent);
    }

    //==第二步:調(diào)用requestPermissions申請(qǐng)權(quán)限颜启,不管是否同意都會(huì)回調(diào)onRequestPermissionsResult
    @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) {
                    call();
                } else {
                    Toast.makeText(MainActivity.this, "you denied", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
}

3.申請(qǐng)多個(gè)權(quán)限

第一步:在清單文件中聲明權(quán)限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.apple.encryptiondemo">

    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

第二步:在代碼中進(jìn)行動(dòng)態(tài)申請(qǐng)權(quán)限

public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn_call = findViewById(R.id.btn_call);
        btn_call.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //第一步:看權(quán)限是否已經(jīng)被申請(qǐng)偷俭,沒(méi)有則申請(qǐng)權(quán)限
                List<String> permissionList = new ArrayList<>();
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    permissionList.add(Manifest.permission.CALL_PHONE);
                }
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                    permissionList.add(Manifest.permission.READ_PHONE_STATE);
                }
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                }
                if (!permissionList.isEmpty()) {
                    String[] permissions = permissionList.toArray(new String[permissionList.size()]);
                    ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
                } else {
                    call();
                }
            }
        });
    }

    @SuppressLint("MissingPermission")
    private void call() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:10086"));
        startActivity(intent);
    }

    //第二步:調(diào)用requestPermissions申請(qǐng)權(quán)限,不管是否同意都會(huì)回調(diào)onRequestPermissionsResult
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0) {
                    for (int result : grantResults) {
                        if (result != PackageManager.PERMISSION_GRANTED) {
                            Toast.makeText(MainActivity.this, "you denied some", Toast.LENGTH_SHORT).show();
                            finish();
                            return;
                        }
                    }
                    call();
                }else{
                    Toast.makeText(MainActivity.this, "發(fā)生未知錯(cuò)誤", Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缰盏,一起剝皮案震驚了整個(gè)濱河市涌萤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌口猜,老刑警劉巖负溪,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異暮的,居然都是意外死亡笙以,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)冻辩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)猖腕,“玉大人,你說(shuō)我怎么就攤上這事恨闪√雀校” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵咙咽,是天一觀(guān)的道長(zhǎng)老玛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)钧敞,這世上最難降的妖魔是什么蜡豹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮溉苛,結(jié)果婚禮上镜廉,老公的妹妹穿的比我還像新娘。我一直安慰自己愚战,他們只是感情好娇唯,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著寂玲,像睡著了一般塔插。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拓哟,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天想许,我揣著相機(jī)與錄音,去河邊找鬼。 笑死伸刃,一個(gè)胖子當(dāng)著我的面吹牛谎砾,可吹牛的內(nèi)容都是我干的逢倍。 我是一名探鬼主播捧颅,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼较雕!你這毒婦竟也來(lái)了碉哑?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤亮蒋,失蹤者是張志新(化名)和其女友劉穎扣典,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體慎玖,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贮尖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趁怔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湿硝。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖润努,靈堂內(nèi)的尸體忽然破棺而出关斜,到底是詐尸還是另有隱情,我是刑警寧澤铺浇,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布痢畜,位于F島的核電站,受9級(jí)特大地震影響鳍侣,放射性物質(zhì)發(fā)生泄漏丁稀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一倚聚、第九天 我趴在偏房一處隱蔽的房頂上張望线衫。 院中可真熱鬧,春花似錦秉沼、人聲如沸桶雀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)矗积。三九已至,卻和暖如春敞咧,著一層夾襖步出監(jiān)牢的瞬間棘捣,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工休建, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乍恐,地道東北人评疗。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像茵烈,于是被迫代替她去往敵國(guó)和親百匆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361