Android 6.0 權限

在Android6.0之前担忧,應用安裝時系統(tǒng)會列出AndroidManifest清單上申請的所有權限犹菱,用戶必須全部接受才能繼續(xù)安裝截歉,并且這些權限授權之后無法撤銷。這對于開發(fā)者來說是比較方便的无午,需要什么權限只需要在AndroidManifest申請即可,不需要考慮權限被拒絕等各種場景祝谚。但是對于用戶來說卻沒有辦法自主選擇屏蔽他不想授予的權限宪迟,也容易給惡意程序利用。

Android6.0之后交惯,權限的申請由安裝時變成了運行時次泽。開發(fā)者仍然需要在AndroidManifest里面列出所需要的所有權限,但用戶安裝時不需要對這些權限進行授權席爽,而是在運行時需要用到某個權限時才詢問用戶是否授權箕憾,用戶可以選擇接受或者拒絕。另外即使用戶接受了拳昌,也可以在權限管理中進行撤銷袭异。如果直接使用用戶沒有授權的權限會導致crash,因此炬藤,開發(fā)時需要考慮這些場景冈止,并作出處理蛹找。

對于一些老的應用來說缺脉,也不用太擔心肚医,如果app的targetSdkVersion低于23,將繼續(xù)使用舊有規(guī)則羹膳∷ィ看到這有人可能覺得干脆將所有的targetSdkVersion設置為23以下不就好了,也不用那么麻煩考慮權限的問題陵像。但是要注意就珠,在6.0的系統(tǒng)上,即使安裝時取得了所有的權限醒颖,用戶仍然可以之后在權限管理中撤銷授權妻怎。因此,我們還是需要與時俱進泞歉,將targetSdkVersion升級到23并好好處理權限問題逼侦。

Android的權限總的來說分為三種,分別是normal類型腰耙、dangerous類型和special類型:

1榛丢、normal類型的權限不會威脅到用戶的隱私,可以直接在AndroidManifest里面注冊挺庞,在安裝時就被授權晰赞,不需要每次使用時都檢查權限,并且用戶不能取消。主要包括:

android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT

2宾肺、dangerous類型的權限可以直接訪問用戶的敏感數(shù)據溯饵,不僅需要在AndroidManifest里面注冊侵俗,還需要在使用時請求授權锨用。主要包括:



可以看到dangerous類型的權限進行了分組,同一組的任何一個權限被授權了隘谣,其他權限也自動被授權增拥。例如,一旦WRITE_CONTACTS被授權了寻歧,app也有READ_CONTACTS和GET_ACCOUNTS權限了掌栅。

dangerous類型的權限申請主要調用這幾個方法:

Context.checkSelfPermission(String permission) 檢查是否被授予了某個權限
Activity.requestPermissions(String[] permissions, int requestCode) 申請一組權限
Activity.onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 權限申請結果回調

由于這些方法都是在api23引入的,所以需要在使用時先進行版本判斷码泛。下面以相機為例說明怎樣申請權限:

public void checkCameraPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        // 23及以后的版本需要檢測權限
        int hasCameraPermission = checkSelfPermission(Manifest.permission.CAMERA);
        if (hasCameraPermission != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE_CAMERA);
        } else {
            cameraPermissionGranted(true);
        }
    } else {
        // 23之前的版本權限在安裝時已經獲取
        cameraPermissionGranted(true);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == PERMISSION_REQUEST_CODE_CAMERA) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            cameraPermissionGranted(true);
        } else {
            cameraPermissionGranted(false);
        }
    }
}

另外猾封,v4包中也提供了兼容方法ContextCompat.checkSelfPermission()和ActivityCompat.requestPermissions()可以避免版本判斷,唯一的區(qū)別就是需要帶上額外的參數(shù)Context或Activity噪珊,其他都一樣:

private void checkCameraPermission(Activity activity) {
    int hasCameraPermission = ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA);
    if (hasCameraPermission != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE_CAMERA);
    } else {
        cameraPermissionGranted(true);
    }
}

權限的判斷和申請其實比較簡單晌缘,對于開發(fā)者來說更重要的其實是權限被接受或拒絕后的不同處理,也就是上面的cameraPermissionGranted(boolea granted)方法痢站。比如如果你的應用必須使用相機磷箕,那么在相機權限申請拒絕后可以彈框提示用戶,直到用戶授權后才能進入使用界面阵难。又或者應用并非必須使用相機岳枷,也可以從相冊加載圖片,那么當用戶拒絕授權時呜叫,只需要禁掉相機部分的功能即可空繁。

3、special類型的權限包括WRITE_SETTINGS和SYSTEM_ALERT_WINDOW朱庆,Android單獨制作了一個activity作為這兩個權限的用戶授權界面家厌,必須通過指定intent,然后通過startActivity(intent)的方式來申請椎工。
special類型的權限申請主要用到以下幾個方法:

Settings.System.canWrite(Context context) 檢查是否被授予了WRITE_SETTINGS權限
Settings.canDrawOverlays(Context context) 檢查是否被授予了SYSTEM_ALERT_WINDOW權限
startActivityForResult(Intent intent, in requestCode) 打開用戶授權界面
onActivityResult(int requestCode, int resultCode, Intent data) 權限申請結果回調

申請WRITE_SETTINGS權限的代碼如下:

public void checkWriteSettingsPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!Settings.System.canWrite(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, PERMISSION_REQUEST_CODE_WRITE_SETTINGS);
        } else {
            writeSettingsPermissionGranted(true);
        }
    } else {
        writeSettingsPermissionGranted(true);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PERMISSION_REQUEST_CODE_WRITE_SETTINGS) {
        // 判斷是否有WRITE_SETTINGS權限
        if (Settings.System.canWrite(this)) {
            writeSettingsPermissionGranted(true);
        }else {
            writeSettingsPermissionGranted(false);
        }
    }
}

申請SYSTEM_ALERT_WINDOW的代碼如下:

public void checkSystemAlertWindowPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!Settings.canDrawOverlays(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, PERMISSION_REQUEST_CODE_SYSTEM_ALERT_WINDOW);
        } else {
            systemAlertWindowPermissionGranted(true);
        }
    } else {
        systemAlertWindowPermissionGranted(true);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PERMISSION_REQUEST_CODE_SYSTEM_ALERT_WINDOW) {
        if (Settings.canDrawOverlays(this)) {
            systemAlertWindowPermissionGranted(true);
        } else {
            systemAlertWindowPermissionGranted(false);
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末饭于,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子维蒙,更是在濱河造成了極大的恐慌掰吕,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颅痊,死亡現(xiàn)場離奇詭異殖熟,居然都是意外死亡,警方通過查閱死者的電腦和手機斑响,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門菱属,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钳榨,“玉大人,你說我怎么就攤上這事纽门⊙Τ埽” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵赏陵,是天一觀的道長饼齿。 經常有香客問我,道長蝙搔,這世上最難降的妖魔是什么缕溉? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮吃型,結果婚禮上证鸥,老公的妹妹穿的比我還像新娘。我一直安慰自己勤晚,他們只是感情好枉层,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著运翼,像睡著了一般返干。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上血淌,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天矩欠,我揣著相機與錄音,去河邊找鬼悠夯。 笑死癌淮,一個胖子當著我的面吹牛,可吹牛的內容都是我干的沦补。 我是一名探鬼主播乳蓄,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼夕膀!你這毒婦竟也來了虚倒?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤产舞,失蹤者是張志新(化名)和其女友劉穎魂奥,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體易猫,經...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡耻煤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哈蝇。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡棺妓,死狀恐怖,靈堂內的尸體忽然破棺而出炮赦,到底是詐尸還是另有隱情怜跑,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布眼五,位于F島的核電站妆艘,受9級特大地震影響彤灶,放射性物質發(fā)生泄漏看幼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一幌陕、第九天 我趴在偏房一處隱蔽的房頂上張望诵姜。 院中可真熱鬧,春花似錦搏熄、人聲如沸棚唆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宵凌。三九已至,卻和暖如春止后,著一層夾襖步出監(jiān)牢的瞬間瞎惫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工译株, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瓜喇,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓歉糜,卻偏偏與公主長得像乘寒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子匪补,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容

  • 一伞辛、引言 隨著Android6.0發(fā)布,系統(tǒng)增加了一些新的特性和功能夯缺。這次的發(fā)布介紹了一種新的權限機制蚤氏。用戶可以在...
    宇是我閱讀 7,394評論 7 41
  • 一、Android6.0 權限變化 在Android M中權限系統(tǒng)被重新設計喳逛,發(fā)生了很大的變化瞧捌。 1. 6.0以后...
    夢_之_旅閱讀 1,258評論 3 14
  • Android 6.0 權限處理 1.問題描述 使用PandaAndroidLibs庫時,在MainApplica...
    OlivineVip閱讀 846評論 1 6
  • 最喜歡的一句話是:不斷學習是為了看清自己有多無知。 #記事本圓夢計劃#(1)書中提到的記事本由哪三部分組成姐呐?它們的...
    楊亞榮呀閱讀 305評論 0 0
  • 詩圖原創(chuàng) 冷霜幕曉秋韻寒殿怜,蜀山晴雪彩云間,銀杏嬌媚丹楓傲曙砂,風吹葉蕩紫云丹头谜,角楓尖,霜露寒鸠澈,紅叢低處清泉潺柱告,憑闌醉賞...
    雪落重陽閱讀 266評論 34 40