android6.0的權(quán)限管理

Declaring Permissions(權(quán)限說明)

每一個(gè)安卓app都在一個(gè)有限制規(guī)則的環(huán)境下運(yùn)行曲秉。如果一個(gè)app需要獲得超出限制規(guī)則的資源或者信息差油。那么這個(gè)app就必須申請(qǐng)權(quán)限。作為開發(fā)者溉潭,我們可以在app manifest中列出app需要用到的權(quán)限环凿。
根據(jù)權(quán)限的敏感程度讥电,系統(tǒng)可以回自動(dòng)的授權(quán)或者彈出權(quán)限申請(qǐng)?jiān)儐枴@绮履辍H绻愕腶pp需要打開設(shè)備的閃光燈抡锈,那么系統(tǒng)會(huì)自動(dòng)授權(quán)疾忍。但是如果你的app需要用到用戶的通訊錄,系統(tǒng)就會(huì)對(duì)用戶申請(qǐng)權(quán)限床三。對(duì)于不同的安卓系統(tǒng)版本的權(quán)限管理一罩,在android 5.1或者更低的版本,用戶需要在安卓app的時(shí)候進(jìn)行授權(quán)撇簿,在android 6.0或者更高的版本后聂渊,用戶則是在app運(yùn)行時(shí)進(jìn)行授權(quán)。

Determine What Permissions Your App Needs(確定app需要的權(quán)限)

作為一個(gè)開發(fā)者补疑,當(dāng)你的app用到權(quán)限時(shí)歧沪,就應(yīng)該倍加小心。尤其是當(dāng)你的app需要用到涉及用戶的信息或者資源的權(quán)限和app的行為會(huì)影響到用戶的手機(jī)等設(shè)備(包括其他app)時(shí)莲组。例如诊胞,一個(gè)app需要在聯(lián)網(wǎng)時(shí)用相機(jī),或者打開锹杈、關(guān)閉wifi撵孤,那么這個(gè)app需要對(duì)用戶解釋這些權(quán)限。那么應(yīng)該先列出這些權(quán)限竭望,分別出哪些是nomal 權(quán)限邪码,哪些是dangerous權(quán)限。(normal和dangerous權(quán)限見網(wǎng)址:
當(dāng)app執(zhí)行需要某些需要用到權(quán)限的操作時(shí)咬清,才會(huì)用到權(quán)限闭专,因此最好在此時(shí)詢問權(quán)限。
如果另一個(gè)app操作你的app進(jìn)行某些需要權(quán)限的操作旧烧,你的app是不需要申請(qǐng)權(quán)限的影钉。
例如,如果你的app需要讀取用戶的通訊錄掘剪,就需要read_contacts權(quán)限平委,但是如果你的app打開另一個(gè) app,讓那個(gè)app去讀取用戶通訊錄夺谁,那么你的app就不需要任何權(quán)限廉赔,當(dāng)然,那個(gè)app就必須申請(qǐng)權(quán)限匾鸥。詳細(xì)情況見網(wǎng)址:https://developer.android.com/intl/zh-cn/training/permissions/best-practices.html#perms-vs-intents

Add Permissions to the Manifest(在manifest中添加權(quán)限)
為了說明你的app需要一個(gè)權(quán)限蜡塌,在manifest中用<uses-permission>去添加權(quán)限。例如扫腺,一個(gè)app需要用到發(fā)送短信的權(quán)限岗照,那么在manifest中就需要如下聲明:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.snazzyapp">
<uses-permission android:name="android.permission.SEND_SMS"/>
<application ...>
...
</application>
</manifest>
系統(tǒng)會(huì)根據(jù)權(quán)限的敏感程度做出不用的行為。如果這個(gè)權(quán)限不涉及用戶的任何隱私,系統(tǒng)會(huì)自動(dòng)授權(quán)攒至。如果這個(gè)權(quán)限涉及到用戶的敏感信息厚者,系統(tǒng)會(huì)申請(qǐng)獲取權(quán)限。詳情見網(wǎng)址:https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous

Requesting Permissions at Run Time(運(yùn)行時(shí)獲取權(quán)限)

從Android6.0(api23)開始迫吐,在app運(yùn)行時(shí)库菲,用戶給予其權(quán)限而不是之前的在安裝的時(shí)候進(jìn)行授權(quán)。由于用戶在安裝或者更新app時(shí)不需要進(jìn)行授權(quán)志膀,這將簡化app的安裝過程熙宇。同時(shí)這也給予用戶更多的權(quán)限管理,例如溉浙,用戶可以給一款拍照app授權(quán)camera權(quán)限烫止,并拒絕location權(quán)限。用戶隨時(shí)在app的設(shè)置界面關(guān)閉權(quán)限戳稽。
系統(tǒng)的權(quán)限主要?jiǎng)澐譃?類馆蠕,normal和dangerous權(quán)限。
1.normal權(quán)限不直接涉及到用戶的隱私惊奇。如果app在manifest中添加了權(quán)限互躬,那么系統(tǒng)會(huì)自動(dòng)的授權(quán)。
2.dangerous權(quán)限會(huì)使用戶可以獲取用戶的隱私數(shù)據(jù)颂郎,如果app在manifest列出了normal權(quán)限吼渡,系統(tǒng)會(huì)自動(dòng)授權(quán)。如果在manifest列出了dangerous權(quán)限乓序,用戶需要對(duì)權(quán)限做出批準(zhǔn)或解決寺酪。
(獲取更多關(guān)系normal和dangerous 權(quán)限,可見:https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous)

不管是哪個(gè)版本的安卓系統(tǒng)替劈,我們都需要在manifest中進(jìn)行權(quán)限的申明(不管是normal或者dangerous權(quán)限)房维。但是,申明完了之后系統(tǒng)會(huì)根據(jù)不同的sdk和android系統(tǒng)版本做出不同的處理抬纸。
1.如果設(shè)備運(yùn)行在android5.1或以下系統(tǒng)或者你的app的target sdk在22或者以下。那么當(dāng)你列出了一系列的dangerous權(quán)限的話耿戚,用戶則在安裝app的時(shí)候進(jìn)行授權(quán)湿故,如果用戶不同意授權(quán),那么app根本就不安裝了膜蛔。
2.如果手機(jī)時(shí)6.0或以上坛猪,并且你的app的target sdk大于等于23 。App必須在manifest中列出權(quán)限皂股,并且對(duì)dangerous權(quán)限進(jìn)行逐一的詢問授權(quán)墅茉,用戶可以接受或者拒絕任意一個(gè)dangerous權(quán)限,app可以在用戶拒絕權(quán)限后運(yùn)行。

注意:用android6.0(api23)開始就斤,即使app的target sdk小于23悍募,用戶也可以在任何時(shí)候去除權(quán)限,所以作為開發(fā)者洋机,你需要測試一下你的app在沒有某些情況下是否能正常運(yùn)行(無論你的target sdk是多少)坠宴。

這里將告訴你如何使用support library去檢測,申請(qǐng)權(quán)限绷旗。在android 的framework層提供了一些方法為android6.0服務(wù)喜鼓。為了使support library更簡化使用,開發(fā)者不需要在調(diào)用相關(guān)的方法前去檢測android的版本

在android 6.0中衔肢,權(quán)限分為各個(gè)權(quán)限組庄岖。如下圖,每個(gè)權(quán)限組中只要有1個(gè)權(quán)限被允許了角骤,其他權(quán)限也默認(rèn)允許了隅忿。也就是說如果在代碼中需要添加一個(gè)聯(lián)系人write_contacts權(quán)限的話,由于write_contacts和read_contacts都屬于android.permission-group.CONTACTS權(quán)限組启搂,read_contactst也就自動(dòng)授權(quán)了硼控。

per.png

在6.0中進(jìn)行權(quán)限開發(fā)

第一步 檢測權(quán)限

private boolean checkPermission(){    
    int result = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS);  
    if (result == PackageManager.PERMISSION_GRANTED){
        return true;  
    } else {       
       return false;    
    }
}

第二步 如果沒有權(quán)限申請(qǐng)權(quán)限

  private void requestPermission(){   
 if(ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.READ_CONTACTS)){ 
   //解釋一下為什么需要申請(qǐng)這個(gè)權(quán)限   第二次或以后彈出權(quán)限詢問框時(shí)走此分支。并彈出的詢問框時(shí)帶有never ask again的勾選框 
   Snackbar.make(view, "為確保功能正常使用,我們需要您的授權(quán)胳赌。",       Snackbar.LENGTH_INDEFINITE).setAction("ok", new View.OnClickListener() {   
             @Override                    
              public void onClick(View view) {      
                  ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.READ_CONTACTS},PERMISSION_REQUEST_CODE); 
               }               
 }).show();    
} else {       
     ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.READ_CONTACTS},PERMISSION_REQUEST_CODE);   
   }
}

第一次點(diǎn)擊獲取權(quán)限的時(shí)候會(huì)走else分支牢撼,這時(shí)候彈出的詢問框是不會(huì)有never ask again的勾選框的。
當(dāng)用戶第一次點(diǎn)擊拒絕的時(shí)候疑苫,以后如果用戶再次點(diǎn)擊按鈕需要用到權(quán)限的時(shí)候
仍會(huì)彈出詢問框熏版,不過這時(shí)候彈出的詢問框是帶有never ask again的
第二次點(diǎn)擊按鈕的時(shí)候則會(huì)走if分支,這時(shí)候彈出的權(quán)限詢問是帶有never ask again的勾選框
第三次(如果第二次仍然拒絕)則和第二次一樣捍掺。除非勾選了never ask again撼短,當(dāng)勾選了checkbox后, allow會(huì)隱藏起來 挺勿。
因?yàn)槿绻坏c(diǎn)擊了allow 就授權(quán)了曲横,以后也不需要再詢問。那么如果app關(guān)閉了后,再次點(diǎn)擊按鈕需要權(quán)限的時(shí)候,就不會(huì)彈出詢問框了涩拙。

監(jiān)聽權(quán)限回調(diào)

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {   
 switch (requestCode) {       
   case PERMISSION_REQUEST_CODE:           
     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {         
   Snackbar.make(view,"Permission Granted, Now you can access contacts data.",Snackbar.LENGTH_LONG).show();               
   Intent intent = new Intent(Intent.ACTION_PICK,                              ContactsContract.Contacts.CONTENT_URI);               
   try {                    
        startActivity(intent);              
        } catch (Exception e) {                  
        // TODO: handle exception                    
        Toast.makeText(this, "無法訪問通信錄,請(qǐng)?jiān)O(shè)置通信錄訪問權(quán)限", Toast.LENGTH_SHORT).show();                
        }            
      } else {                
            Snackbar.make(view,"Permission Denied, You cannot access contacts data.",Snackbar.LENGTH_LONG).show();          
      }           
   break;          
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熙参,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子麦备,更是在濱河造成了極大的恐慌孽椰,老刑警劉巖昭娩,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異黍匾,居然都是意外死亡栏渺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門膀捷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迈嘹,“玉大人,你說我怎么就攤上這事全庸⌒阒伲” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵壶笼,是天一觀的道長神僵。 經(jīng)常有香客問我,道長覆劈,這世上最難降的妖魔是什么保礼? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮责语,結(jié)果婚禮上炮障,老公的妹妹穿的比我還像新娘。我一直安慰自己坤候,他們只是感情好胁赢,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著白筹,像睡著了一般智末。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徒河,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天系馆,我揣著相機(jī)與錄音,去河邊找鬼顽照。 笑死由蘑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的代兵。 我是一名探鬼主播纵穿,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奢人!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淆院,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤何乎,失蹤者是張志新(化名)和其女友劉穎句惯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體支救,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抢野,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了各墨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片指孤。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖贬堵,靈堂內(nèi)的尸體忽然破棺而出恃轩,到底是詐尸還是另有隱情,我是刑警寧澤黎做,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布叉跛,位于F島的核電站,受9級(jí)特大地震影響蒸殿,放射性物質(zhì)發(fā)生泄漏筷厘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一宏所、第九天 我趴在偏房一處隱蔽的房頂上張望酥艳。 院中可真熱鬧,春花似錦爬骤、人聲如沸充石。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赫冬。三九已至,卻和暖如春溃列,著一層夾襖步出監(jiān)牢的瞬間劲厌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國打工听隐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留补鼻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓雅任,卻偏偏與公主長得像风范,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沪么,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容