Android權限(二)

Android權限(一)中,介紹了Android中的所有權限馁菜。隨著Android 6.0發(fā)布以及普及川尖,我們開發(fā)者所要應對的主要就是新版本SDK帶來的一些變化隧魄,首先關注的就是權限機制的變化筋岛。

Android6.0 權限變化

在Android 6.0版本之前娶视,只要用戶安裝完,AndroidManifest清單上申請的權限都會被系統(tǒng)默認授權睁宰,并且授權后也撤銷不了肪获。弊端就是,即使權限用戶不需要柒傻,但是也去不掉孝赫。一些惡意程序,會利用這個權限默認授權红符,進行惡意獲取用戶數(shù)據(jù)和攻擊青柄。Android6.0采用新的權限模型劫映,只有在需要權限的時候,才告知用戶是否授權刹前,是在runtime時候授權,而不是在原來安裝的時候 雌桑,同時默認情況下每次在運行時打開頁面時候喇喉,需要先檢查是否有所需要的權限申請。這樣的用戶的自主性提高很多校坑,比如用戶可以給APP賦予攝像的權限拣技,但是可以拒絕記錄設備位置的權限,就是怕位置信息上傳等等耍目。

Android6.0 權限分類

權限分為了正常權限和危險權限膏斤。
正常權限涵蓋應用需要訪問其沙盒外部數(shù)據(jù)或資源,但對用戶隱私或其他應用操作風險很小的區(qū)域邪驮。例如莫辨,設置時區(qū)的權限就是正常權限。如果應用聲明其需要正常權限毅访,系統(tǒng)會自動向應用授予該權限沮榜。如需當前正常權限的完整列表,請參閱正常權限喻粹。
危險權限涵蓋應用需要涉及用戶隱私信息的數(shù)據(jù)或資源蟆融,或者可能對用戶存儲的數(shù)據(jù)或其他應用的操作產(chǎn)生影響的區(qū)域。**例如守呜,能夠讀取用戶的聯(lián)系人屬于危險權限型酥。如果應用聲明其需要危險權限,則用戶必須明確向應用授予該權限查乒。正常權限有很多個弥喉,現(xiàn)在著重介紹一下危險權限。

危險權限和權限組

所有危險的 Android 系統(tǒng)權限都屬于權限組侣颂。如果設備運行的是 Android 6.0(API 級別 23)档桃,并且應用的 targetSdkVersion
是 23 或更高版本,則當用戶請求危險權限時系統(tǒng)會發(fā)生以下行為:
如果應用請求其清單中列出的危險權限憔晒,而應用目前在權限組中沒有任何權限藻肄,則系統(tǒng)會向用戶顯示一個對話框,描述應用要訪問的權限組拒担。對話框不描述該組內(nèi)的具體權限嘹屯。例如,如果應用請求 READ_CONTACTS
權限从撼,系統(tǒng)對話框只說明該應用需要訪問設備的聯(lián)系信息州弟。如果用戶批準钧栖,系統(tǒng)將向應用授予其請求的權限。
如果應用請求其清單中列出的危險權限婆翔,而應用在同一權限組中已有另一項危險權限拯杠,則系統(tǒng)會立即授予該權限,而無需與用戶進行任何交互啃奴。例如潭陪,如果某應用已經(jīng)請求并且被授予了 READ_CONTACTS
權限,然后它又請求 WRITE_CONTACTS
最蕾,系統(tǒng)將立即授予該權限依溯。

任何權限都可屬于一個權限組,包括正常權限和應用定義的權限瘟则。但權限組僅當權限危險時才影響用戶體驗黎炉。可以忽略正常權限的權限組醋拧。
如果設備運行的是 Android 5.1(API 級別 22)或更低版本慷嗜,并且應用的 targetSdkVersion
是 22 或更低版本,則系統(tǒng)會在安裝時要求用戶授予權限丹壕。再次強調(diào)洪添,系統(tǒng)只告訴用戶應用需要的權限,而不告知具體權限雀费。

危險權限和權限組,如下圖:


危險權限和權限組.png

定義和實施權限

要實施您自己的權限干奢,必須先使用一個或多個 <permission>
元素在 AndroidManifest.xml
中聲明它們。
基于6.0系統(tǒng)的開發(fā)的程序盏袄, 在打開頁面的時候忿峻,必須要考慮這個頁面是否用到需要授權的權限,頁面檢測是否已經(jīng)授權過了沒
實現(xiàn)方式:
第一步:檢測權限

// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);

第二步:請求權限

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

請求要使用的權限:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
     ActivityCompat.requestPermissions(this, 
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
                     Manifest.permission.WRITE_EXTERNAL_STORAGE, 
                    Manifest.permission.READ_PHONE_STATE},2); 
}else {
    startActivity(new Intent(this,MainActivity.class));
     finish();
 }

第三步:處理權限請求結(jié)果

/**
  *動態(tài)權限申請后系統(tǒng)的回調(diào)方法
  */
@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

第四步:要注意這個方法辕羽,用戶允許或拒絕返回值的類型

/** 
 * 用戶第一次拒絕后逛尚,下一次,返回true刁愿,應該提示用戶為什么需要這個權限绰寞,添加說明 
 * 用戶第二次請求權限時,用戶拒絕了铣口,并選擇了不再提醒滤钱,返回false 
 * 設備的策略禁止當前應用獲取這個權限的授權,返回false  
 * 注意:第二次請求權限時候才有選項“不再提醒”脑题,如果用戶一直拒絕件缸,但沒有選擇不再提醒,下次請求權限時候叔遂,
 * 會繼續(xù)有不再提醒的權限  
*/
 @Override 
public boolean shouldShowRequestPermissionRationale(String permission) {
     return super.shouldShowRequestPermissionRationale(permission); 
}

以上就是Google官方的權限申請方法他炊,有錯請輕噴

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末争剿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子痊末,更是在濱河造成了極大的恐慌蚕苇,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凿叠,死亡現(xiàn)場離奇詭異捆蜀,居然都是意外死亡,警方通過查閱死者的電腦和手機幔嫂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誊薄,“玉大人履恩,你說我怎么就攤上這事∧啬瑁” “怎么了切心?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長片吊。 經(jīng)常有香客問我绽昏,道長,這世上最難降的妖魔是什么俏脊? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任全谤,我火速辦了婚禮,結(jié)果婚禮上爷贫,老公的妹妹穿的比我還像新娘认然。我一直安慰自己,他們只是感情好漫萄,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布卷员。 她就那樣靜靜地躺著,像睡著了一般腾务。 火紅的嫁衣襯著肌膚如雪毕骡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天岩瘦,我揣著相機與錄音未巫,去河邊找鬼。 笑死启昧,一個胖子當著我的面吹牛橱赠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播箫津,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼狭姨,長吁一口氣:“原來是場噩夢啊……” “哼宰啦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饼拍,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤赡模,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后师抄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漓柑,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年叨吮,在試婚紗的時候發(fā)現(xiàn)自己被綠了辆布。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡茶鉴,死狀恐怖锋玲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涵叮,我是刑警寧澤惭蹂,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站割粮,受9級特大地震影響盾碗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舀瓢,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一廷雅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧京髓,春花似錦榜轿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诚些,卻和暖如春飞傀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诬烹。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工砸烦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绞吁。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓幢痘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親家破。 傳聞我的和親對象是個殘疾皇子颜说,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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