權(quán)限的目的是保護(hù)Android用戶的隱私。
Android應(yīng)用必須請求訪問敏感用戶數(shù)據(jù)(如聯(lián)系人和短信)以及某些系統(tǒng)功能(如相機(jī)和互聯(lián)網(wǎng))的權(quán)限尊浓。根據(jù)功能过吻,系統(tǒng)可能會自動授予權(quán)限电抚,或者可能會提示用戶批準(zhǔn)請求惕稻。
Android安全體系結(jié)構(gòu)的核心設(shè)計點(diǎn)是,默認(rèn)情況下蝙叛,任何應(yīng)用程序都無權(quán)執(zhí)行任何會對其他應(yīng)用程序俺祠,操作系統(tǒng)或用戶產(chǎn)生負(fù)面影響的操作。這包括讀取或?qū)懭胗脩舻乃饺藬?shù)據(jù)(如聯(lián)系人或電子郵件)借帘,讀取或?qū)懭肫渌麘?yīng)用程序的文件蜘渣,執(zhí)行網(wǎng)絡(luò)訪問,保持設(shè)備喚醒等等肺然。
此頁面概述了Android權(quán)限的工作方式蔫缸,包括:如何向用戶顯示權(quán)限,安裝時和運(yùn)行時權(quán)限請求之間的區(qū)別际起,權(quán)限的實施方式以及權(quán)限及其組的類型拾碌。如果您只想獲得使用應(yīng)用程序權(quán)限的操作指南,請參閱請求應(yīng)用程序權(quán)限街望。
權(quán)限批準(zhǔn)
應(yīng)用必須通過在應(yīng)用清單中包含<uses-permission>標(biāo)記來宣傳其所需的權(quán)限校翔。 例如,需要發(fā)送SMS消息的應(yīng)用程序?qū)⒃谇鍐沃邪韵滦校?/p>
<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>
如果您的應(yīng)用在其清單中列出了正常權(quán)限(即灾前,不會對用戶的隱私或設(shè)備操作造成太大風(fēng)險的權(quán)限)防症,系統(tǒng)會自動將這些權(quán)限授予您的應(yīng)用。
如果您的應(yīng)用在其清單中列出了危險權(quán)限(即可能影響用戶隱私或設(shè)備正常運(yùn)行的權(quán)限)哎甲,例如上面的SEND_SMS權(quán)限告希,則用戶必須明確同意授予這些權(quán)限。
有關(guān)正常和危險權(quán)限的詳細(xì)信息烧给,請參閱保護(hù)級別。
請求提示危險權(quán)限
只有危險權(quán)限才需要用戶同意喝噪。 Android要求用戶授予危險權(quán)限的方式取決于用戶設(shè)備上運(yùn)行的Android版本以及應(yīng)用所針對的系統(tǒng)版本础嫡。
運(yùn)行時請求(Android 6.0或者更高)
如果設(shè)備運(yùn)行的是Android 6.0(API級別23)或更高版本,且應(yīng)用程序的targetSdkVersion為23或更高酝惧,則在安裝時不會通知用戶任何應(yīng)用程序權(quán)限榴鼎。 您的應(yīng)用必須要求用戶在運(yùn)行時授予危險權(quán)限。 當(dāng)您的應(yīng)用請求權(quán)限時晚唇,用戶會看到系統(tǒng)對話框(如圖1左側(cè)所示)巫财,告訴用戶您的應(yīng)用嘗試訪問哪個權(quán)限組。 該對話框包括拒絕和允許按鈕哩陕。
如果用戶拒絕權(quán)限請求平项,則下次應(yīng)用請求權(quán)限時赫舒,該對話框包含一個復(fù)選框,選中該復(fù)選框后闽瓢,表示不希望再次提示用戶獲得權(quán)限(參見圖1接癌,右)。
圖1.初始權(quán)限對話框(左)和次要權(quán)限請求以及關(guān)閉進(jìn)一步請求的選項(右)
如果用戶選中“永不再詢問”框并點(diǎn)擊“拒絕”扣讼,則系統(tǒng)不再提示用戶以后是否嘗試請求相同的權(quán)限缺猛。
即使用戶授予您的應(yīng)用程序所請求的權(quán)限,您也不能總是依賴它椭符。 用戶還可以選擇在系統(tǒng)設(shè)置中逐個啟用和禁用權(quán)限荔燎。 您應(yīng)該始終在運(yùn)行時檢查并請求權(quán)限以防止運(yùn)行時錯誤(SecurityException)。
有關(guān)如何處理運(yùn)行時權(quán)限請求的詳細(xì)信息销钝,請參閱請求應(yīng)用程序權(quán)限有咨。
安裝時請求(Android 5.1.1或者更低)
如果設(shè)備運(yùn)行Android 5.1.1(API級別22)或更低版本,或者應(yīng)用程序的targetSdkVersion在任何版本的Android上運(yùn)行時為22或更低曙搬,系統(tǒng)會自動要求用戶在安裝時為您的應(yīng)用授予所有危險權(quán)限 - 時間(見圖2)摔吏。
圖2.安裝時權(quán)限對話框
如果用戶單擊“接受”,則會授予應(yīng)用程序請求的所有權(quán)限纵装。 如果用戶拒絕權(quán)限請求征讲,系統(tǒng)將取消應(yīng)用程序的安裝。
如果應(yīng)用更新包含對其他權(quán)限的需求橡娄,則會在更新應(yīng)用之前提示用戶接受這些新權(quán)限诗箍。
有關(guān)用于請求權(quán)限的建議用戶體驗?zāi)J降母攀觯垍㈤啈?yīng)用程序權(quán)限最佳實踐挽唉。
要了解如何檢查和請求用戶的權(quán)限滤祖,請參閱請求應(yīng)用程序權(quán)限。
可選硬件功能的權(quán)限
訪問某些硬件功能(如藍(lán)牙或相機(jī))需要應(yīng)用程序權(quán)限瓶籽。 但是匠童,并非所有Android設(shè)備都具有這些硬件功能。 因此塑顺,如果您的應(yīng)用請求CAMERA權(quán)限汤求,那么您還需要在清單中包含<uses-feature>標(biāo)記來聲明是否確實需要此功能。 例如:
<uses-feature android:name="android.hardware.camera" android:required="false" />
如果您為該功能聲明了android:required =“false”严拒,那么Google Play允許您的應(yīng)用安裝在沒有此功能的設(shè)備上扬绪。 然后,您必須通過調(diào)用PackageManager.hasSystemFeature()檢查當(dāng)前設(shè)備是否在運(yùn)行時具有該功能裤唠,并在該功能不可用時正常禁用該功能挤牛。
如果您未提供<uses-feature>標(biāo)記,那么當(dāng)Google Play看到您的應(yīng)用請求相應(yīng)的權(quán)限時种蘸,它會認(rèn)為您的應(yīng)用需要此功能墓赴。 因此竞膳,它會從沒有該功能的設(shè)備中過濾您的應(yīng)用,就像您在<uses-feature>標(biāo)記中聲明了android:required =“true”一樣竣蹦。
有關(guān)詳細(xì)信息顶猜,請參閱Google Play和基于功能的過濾
權(quán)限執(zhí)行
權(quán)限不僅適用于請求系統(tǒng)功能。 應(yīng)用程序提供的服務(wù)可以強(qiáng)制執(zhí)行自定義權(quán)限痘括,以限制誰可以使用它們长窄。 有關(guān)聲明自定義權(quán)限的詳細(xì)信息,請參閱定義自定義應(yīng)用程序權(quán)限纲菌。
活動權(quán)限執(zhí)行
使用android:permission屬性對清單中的<activity>標(biāo)記應(yīng)用的權(quán)限限制了誰可以啟動該Activity挠日。 在Context.startActivity()和Activity.startActivityForResult()期間檢查權(quán)限。 如果調(diào)用者沒有所需的權(quán)限翰舌,則從調(diào)用中拋出SecurityException嚣潜。
服務(wù)權(quán)限執(zhí)行
使用android:permission屬性對清單中的<service>標(biāo)記應(yīng)用的權(quán)限限制誰可以啟動或綁定到關(guān)聯(lián)的服務(wù)。 在Context.startService()椅贱,Context.stopService()和Context.bindService()期間檢查權(quán)限懂算。 如果調(diào)用者沒有所需的權(quán)限,則從調(diào)用中拋出SecurityException庇麦。
廣播權(quán)限執(zhí)行
使用android:permission屬性應(yīng)用于<receiver>標(biāo)簽的權(quán)限限制了誰可以向關(guān)聯(lián)的BroadcastReceiver發(fā)送廣播计技。 在Context.sendBroadcast()返回后檢查權(quán)限,因為系統(tǒng)嘗試將提交的廣播傳遞給給定的接收者山橄。 因此垮媒,權(quán)限失敗不會導(dǎo)致異常被拋回調(diào)用者; 它只是沒有提供意圖。
以同樣的方式航棱,可以向Context.registerReceiver()提供權(quán)限睡雇,以控制誰可以向編程注冊的接收者廣播。 另一方面饮醇,在調(diào)用Context.sendBroadcast()時可以提供權(quán)限以限制允許哪些廣播接收器接收廣播它抱。
請注意,接收方和廣播公司都需要許可朴艰。 發(fā)生這種情況時观蓄,必須通過兩個權(quán)限檢查才能將意圖傳遞給關(guān)聯(lián)目標(biāo)。 有關(guān)更多信息呵晚,請參閱限制具有權(quán)限的廣播。
Content Provider權(quán)限執(zhí)行
使用android:permission屬性對<provider>標(biāo)簽應(yīng)用的權(quán)限限制了誰可以訪問ContentProvider中的數(shù)據(jù)沫屡。 (內(nèi)容提供商有一個重要的額外安全設(shè)施饵隙,稱為URI權(quán)限,下面將對此進(jìn)行描述沮脖。)與其他組件不同金矛,您可以設(shè)置兩個單獨(dú)的權(quán)限屬性:android:readPermission限制誰可以從提供程序讀取芯急,以及android: writePermission限制誰可以寫入它。請注意驶俊,如果提供程序受讀取和寫入權(quán)限保護(hù)娶耍,則僅保留寫入權(quán)限并不意味著您可以從提供程序讀取。
首次檢索提供程序時將檢查權(quán)限(如果您沒有任何權(quán)限饼酿,則拋出SecurityException)榕酒,以及在提供程序上執(zhí)行操作時。使用ContentResolver.query()需要保持讀取權(quán)限;使用ContentResolver.insert()故俐,ContentResolver.update()想鹰,ContentResolver.delete()需要寫入權(quán)限。在所有這些情況下药版,未保留所需的權(quán)限會導(dǎo)致從調(diào)用中拋出SecurityException辑舷。
URI權(quán)限
當(dāng)與內(nèi)容提供商一起使用時,到目前為止描述的標(biāo)準(zhǔn)許可系統(tǒng)通常是不夠的槽片。內(nèi)容提供商可能希望使用讀取和寫入權(quán)限來保護(hù)自己何缓,而其直接客戶端還需要將特定URI交給其他應(yīng)用程序以供其操作。
一個典型的例子是電子郵件應(yīng)用程序中的附件还栓。應(yīng)該通過權(quán)限來保護(hù)對電子郵件的訪問碌廓,因為這是敏感的用戶數(shù)據(jù)。但是蝙云,如果向圖像查看器提供圖像附件的URI氓皱,則該圖像查看器不再具有打開附件的權(quán)限,因為它沒有理由擁有訪問所有電子郵件的權(quán)限勃刨。
此問題的解決方案是per-URI權(quán)限:啟動活動或?qū)⒔Y(jié)果返回給活動時波材,調(diào)用者可以設(shè)置Intent.FLAG_GRANT_READ_URI_PERMISSION和/或Intent.FLAG_GRANT_WRITE_URI_PERMISSION。這授予接收活動權(quán)限訪問意圖中的特定數(shù)據(jù)URI身隐,而不管它是否具有訪問對應(yīng)于意圖的內(nèi)容提供者中的數(shù)據(jù)的任何許可廷区。
此機(jī)制允許一種通用的功能樣式模型,其中用戶交互(例如打開附件或從列表中選擇聯(lián)系人)驅(qū)動臨時授予細(xì)粒度權(quán)限贾铝。這可以是將應(yīng)用程序所需的權(quán)限僅限于與其行為直接相關(guān)的權(quán)限的關(guān)鍵工具隙轻。
要構(gòu)建最安全的實現(xiàn),讓其他應(yīng)用程序?qū)δ趛or應(yīng)用程序中的操作負(fù)責(zé)垢揩,您應(yīng)該以這種方式使用細(xì)粒度權(quán)限玖绿,并使用android:grantUriPermissions屬性或<grant-uri-permissions>標(biāo)記聲明您的應(yīng)用程序?qū)λ闹С帧?br>
可以在Context.grantUriPermission(),Context.revokeUriPermission()和Context.checkUriPermission()方法中找到更多信息叁巨。
其他權(quán)限執(zhí)行
任何對服務(wù)的調(diào)用都可以強(qiáng)制執(zhí)行任意細(xì)粒度的權(quán)限斑匪。 這是通過Context.checkCallingPermission()方法完成的。 使用所需的權(quán)限字符串進(jìn)行調(diào)用锋勺,并返回一個整數(shù)蚀瘸,指示是否已將該權(quán)限授予當(dāng)前調(diào)用進(jìn)程狡蝶。 請注意,這只能在您執(zhí)行來自其他進(jìn)程的調(diào)用時使用贮勃,通常是通過從服務(wù)發(fā)布的IDL接口或以其他方式執(zhí)行到另一個進(jìn)程贪惹。
還有許多其他有用的方法可以檢查權(quán)限。 如果您具有另一個進(jìn)程的進(jìn)程ID(PID)寂嘉,則可以使用Context.checkPermission()方法檢查針對該P(yáng)ID的權(quán)限奏瞬。 如果您具有其他應(yīng)用程序的程序包名稱,則可以使用PackageManager.checkPermission()方法來確定該特定程序包是否已被授予特定權(quán)限垫释。
自動權(quán)限調(diào)整
隨著時間的推移丝格,可能會向平臺添加新的限制,以便為了使用某些API棵譬,您的應(yīng)用必須請求以前不需要的權(quán)限显蝌。 由于現(xiàn)有應(yīng)用程序假定可以免費(fèi)訪問這些API,因此Android可以將新的權(quán)限請求應(yīng)用于應(yīng)用程序的清單订咸,以避免破壞新平臺版本上的應(yīng)用程序(從而“為您的應(yīng)用程序”授予“權(quán)限”)曼尊。 Android根據(jù)為targetSdkVersion屬性提供的值,決定應(yīng)用是否可能需要該權(quán)限脏嚷。 如果該值低于添加權(quán)限的版本骆撇,則Android會添加權(quán)限。
例如父叙,從API級別19開始強(qiáng)制執(zhí)行READ_EXTERNAL_STORAGE權(quán)限神郊,以限制對共享存儲空間的訪問。 如果您的targetSdkVersion為18或更低趾唱,則此權(quán)限會在較新版本的Android上添加到您的應(yīng)用中涌乳。
警告:如果您的應(yīng)用自動添加了權(quán)限,則Google Play上的應(yīng)用列表會列出這些附加權(quán)限甜癞,即使您的應(yīng)用可能實際上并不需要這些權(quán)限夕晓。 要避免這種情況并刪除您不需要的默認(rèn)權(quán)限,請始終將targetSdkVersion更新為盡可能高悠咱。 您可以在Build.VERSION_CODES文檔中查看每個版本添加了哪些權(quán)限蒸辆。
保護(hù)級別
權(quán)限分為幾個保護(hù)級別。 保護(hù)級別會影響是否需要運(yùn)行時權(quán)限請求析既。
有三種保護(hù)級別會影響第三方應(yīng)用程序:正常躬贡,簽名和危險權(quán)限。
正常權(quán)限
普通權(quán)限涵蓋應(yīng)用程序需要訪問應(yīng)用程序沙箱外部數(shù)據(jù)或資源的區(qū)域眼坏,但用戶隱私或其他應(yīng)用程序操作的風(fēng)險很小拂玻。 例如,設(shè)置時區(qū)的權(quán)限是正常權(quán)限。
如果應(yīng)用程序在其清單中聲明它需要正常權(quán)限纺讲,則系統(tǒng)會在安裝時自動授予應(yīng)用程序該權(quán)限。 系統(tǒng)不會提示用戶授予正常權(quán)限囤屹,用戶也無法撤消這些權(quán)限熬甚。
從Android 9(API級別28)開始,以下權(quán)限被歸類為PROTECTION_NORMAL:
- ACCESS_LOCATION_EXTRA_COMMANDS
- ACCESS_NETWORK_STATE
- ACCESS_NOTIFICATION_POLICY
- ACCESS_WIFI_STATE
- BLUETOOTH
- BLUETOOTH_ADMIN
- BROADCAST_STICKY
- CHANGE_NETWORK_STATE
- CHANGE_WIFI_MULTICAST_STATE
- CHANGE_WIFI_STATE
- DISABLE_KEYGUARD
- EXPAND_STATUS_BAR
- FOREGROUND_SERVICE
- GET_PACKAGE_SIZE
- INSTALL_SHORTCUT
- INTERNET
- KILL_BACKGROUND_PROCESSES
- MANAGE_OWN_CALLS
- MODIFY_AUDIO_SETTINGS
- NFC
- READ_SYNC_SETTINGS
- READ_SYNC_STATS
- RECEIVE_BOOT_COMPLETED
- REORDER_TASKS
- REQUEST_COMPANION_RUN_IN_BACKGROUND
- REQUEST_COMPANION_USE_DATA_IN_BACKGROUND
- REQUEST_DELETE_PACKAGES
- REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
- SET_ALARM
- SET_WALLPAPER
- SET_WALLPAPER_HINTS
- TRANSMIT_IR
- USE_FINGERPRINT
- VIBRATE
- WAKE_LOCK
- WRITE_SYNC_SETTINGS
簽名權(quán)限
系統(tǒng)會在安裝時授予這些應(yīng)用程序權(quán)限肋坚,但僅限于嘗試使用權(quán)限的應(yīng)用程序使用與定義權(quán)限的應(yīng)用程序相同的證書進(jìn)行簽名時乡括。
注意:某些簽名權(quán)限不適用于第三方應(yīng)用程序。
從Android 8.1(API級別27)開始智厌,第三方應(yīng)用可以使用的以下權(quán)限歸類為PROTECTION_SIGNATURE:
- BIND_ACCESSIBILITY_SERVICE
- BIND_AUTOFILL_SERVICE
- BIND_CARRIER_SERVICES
- BIND_CHOOSER_TARGET_SERVICE
- BIND_CONDITION_PROVIDER_SERVICE
- BIND_DEVICE_ADMIN
- BIND_DREAM_SERVICE
- BIND_INCALL_SERVICE
- BIND_INPUT_METHOD
- BIND_MIDI_DEVICE_SERVICE
- BIND_NFC_SERVICE
- BIND_NOTIFICATION_LISTENER_SERVICE
- BIND_PRINT_SERVICE
- BIND_SCREENING_SERVICE
- BIND_TELECOM_CONNECTION_SERVICE
- BIND_TEXT_SERVICE
- BIND_TV_INPUT
- BIND_VISUAL_VOICEMAIL_SERVICE
- BIND_VOICE_INTERACTION
- BIND_VPN_SERVICE
- BIND_VR_LISTENER_SERVICE
- BIND_WALLPAPER
- CLEAR_APP_CACHE
- MANAGE_DOCUMENTS
- READ_VOICEMAIL
- REQUEST_INSTALL_PACKAGES
- SYSTEM_ALERT_WINDOW
- WRITE_SETTINGS
- WRITE_VOICEMAIL
危險的權(quán)限
危險權(quán)限涵蓋應(yīng)用程序需要涉及用戶私人信息的數(shù)據(jù)或資源的區(qū)域诲泌,或者可能會影響用戶存儲的數(shù)據(jù)或其他應(yīng)用程序的操作。 例如铣鹏,讀取用戶聯(lián)系人的權(quán)限是一種危險的權(quán)限敷扫。 如果應(yīng)用聲明它需要危險權(quán)限,則用戶必須明確授予該應(yīng)用的權(quán)限诚卸。 在用戶批準(zhǔn)該權(quán)限之前葵第,您的應(yīng)用無法提供依賴該權(quán)限的功能。
要使用危險權(quán)限合溺,您的應(yīng)用必須提示用戶在運(yùn)行時授予權(quán)限卒密。 有關(guān)如何提示用戶的更多詳細(xì)信息,請參閱危險權(quán)限的請求提示棠赛。
有關(guān)危險權(quán)限的列表哮奇,請參閱下面的表1。
特殊權(quán)限
有一些權(quán)限不像正常和危險的權(quán)限睛约。 SYSTEM_ALERT_WINDOW和WRITE_SETTINGS特別敏感鼎俘,因此大多數(shù)應(yīng)用程序不應(yīng)使用它們。 如果應(yīng)用程序需要其中一個權(quán)限痰腮,則必須在清單中聲明權(quán)限而芥,并發(fā)送請求用戶授權(quán)的意圖。 系統(tǒng)通過向用戶顯示詳細(xì)的管理屏幕來響應(yīng)意圖膀值。
有關(guān)如何請求這些權(quán)限的詳細(xì)信息棍丐,請參閱SYSTEM_ALERT_WINDOW和WRITE_SETTINGS參考條目。
可以在Manifest.permission中找到Android系統(tǒng)提供的所有權(quán)限沧踏。
權(quán)限組
權(quán)限分組到與設(shè)備功能或功能相關(guān)的組中歌逢。 在此系統(tǒng)下,權(quán)限請求在組級別處理翘狱,單個權(quán)限組對應(yīng)于應(yīng)用程序清單中的多個權(quán)限聲明秘案。 例如,SMS組包括READ_SMS和RECEIVE_SMS聲明。 以這種方式對權(quán)限進(jìn)行分組使用戶能夠做出更有意義和更明智的選擇阱高,而不會被復(fù)雜和技術(shù)許可請求所淹沒赚导。
所有危險的Android權(quán)限都屬于權(quán)限組。無論保護(hù)級別如何赤惊,任何權(quán)限都可以屬于權(quán)限組吼旧。但是,如果權(quán)限是危險的未舟,則權(quán)限組僅影響用戶體驗圈暗。
如果設(shè)備運(yùn)行的是Android 6.0(API級別23)且應(yīng)用的targetSdkVersion為23或更高,則當(dāng)您的應(yīng)用請求危險權(quán)限時裕膀,以下系統(tǒng)行為適用:
- 如果應(yīng)用程序當(dāng)前在權(quán)限組中沒有任何權(quán)限员串,系統(tǒng)會向用戶顯示描述應(yīng)用程序要訪問的權(quán)限組的權(quán)限請求對話框。該對話框未描述該組中的特定權(quán)限昼扛。例如寸齐,如果某個應(yīng)用請求READ_CONTACTS權(quán)限,系統(tǒng)對話框只會說該應(yīng)用需要訪問該設(shè)備的聯(lián)系人抄谐。如果用戶授予批準(zhǔn)访忿,系統(tǒng)將為應(yīng)用程序提供其請求的權(quán)限。
- 如果應(yīng)用程序已在同一權(quán)限組中被授予其他危險權(quán)限斯稳,則系統(tǒng)會立即授予權(quán)限海铆,而不與用戶進(jìn)行任何交互。例如挣惰,如果應(yīng)用程序先前已請求并已獲得READ_CONTACTS權(quán)限卧斟,然后它請求WRITE_CONTACTS,則系統(tǒng)會立即授予該權(quán)限憎茂,而不向用戶顯示權(quán)限對話框珍语。
警告:未來版本的Android SDK可能會將特定權(quán)限從一個組移動到另一個組。 因此竖幔,請不要將應(yīng)用程序的邏輯基于這些權(quán)限組的結(jié)構(gòu)板乙。
例如,READ_CONTACTS與Android 8.1(API級別27)中的WRITE_CONTACTS屬于同一權(quán)限組拳氢。 如果您的應(yīng)用程序請求READ_CONTACTS權(quán)限募逞,然后請求WRITE_CONTACTS權(quán)限,請不要假設(shè)系統(tǒng)可以自動授予WRITE_CONTACTS權(quán)限馋评。
如果設(shè)備運(yùn)行的是Android 5.1(API級別22)或更低版本放接,或者應(yīng)用程序的targetSdkVersion為22或更低,系統(tǒng)會要求用戶在安裝時授予權(quán)限留特。 系統(tǒng)再一次告訴用戶應(yīng)用程序需要哪些權(quán)限組纠脾,而不是單個權(quán)限玛瘸。 例如,當(dāng)應(yīng)用程序請求READ_CONTACTS時苟蹈,安裝對話框?qū)⒘谐觥奥?lián)系人”組糊渊。 當(dāng)用戶接受時,只有READ_CONTACTS權(quán)限被授予應(yīng)用程序慧脱。
注意:即使用戶已在同一組中授予了其他權(quán)限再来,您的應(yīng)用仍需要明確請求其所需的每個權(quán)限。 此外磷瘤,將權(quán)限分組到組中可能會在將來的Android版本中發(fā)生變化。 您的代碼不應(yīng)具有依賴于同一組中的一組特定權(quán)限的邏輯搜变。
表1.危險權(quán)限和權(quán)限組采缚。
查看應(yīng)用的權(quán)限
您可以使用“設(shè)置”應(yīng)用程序和shell命令adb shell pm list permissions查看當(dāng)前在系統(tǒng)中定義的所有權(quán)限。 要使用“設(shè)置”應(yīng)用挠他,請轉(zhuǎn)到“設(shè)置”>“應(yīng)用”扳抽。 選擇一個應(yīng)用并向下滾動以查看該應(yīng)用使用的權(quán)限。 對于開發(fā)人員殖侵,adb'-s'選項以與用戶看到的方式類似的形式顯示權(quán)限:
$ adb shell pm list permissions -s All Permissions: Network communication:
view Wi-Fi state, create Bluetooth connections, full internet access,
view network state Your location: access extra location provider commands,
fine (GPS) location, mock location sources for testing,
coarse (network-based) location Services that cost you money:
send SMS messages, directly call phone numbers ...
在模擬器或測試設(shè)備上安裝應(yīng)用程序時贸呢,您還可以使用adb -g選項自動授予所有權(quán)限:
$ adb shell install -g MyApp.apk