一、許可權限
一個應用程序必須在程序清單中用 <uses-permission>
標簽來聲明所需的權限 。例如,需要發(fā)送 SMS 消息的應用程序需要在清單中包含以下行:
<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)會自動將這些權限授予你的應用。
如果清單中列出了危險權限(即可能影響用戶隱私權或設備正常操作的權限)氧吐,例如上述
SEND_SMS
權限,則用戶必須明確同意授予這些權限末盔。
1. Request prompts for dangerous permissions — 對于危險權限要求提示
只有危險的權限需要用戶同意授權筑舅。Android 要求用戶授予危險權限的方式取決于用戶設備上運行的 Android 版本以及應用的目標 Android 版本。
1.1 Runtime requests (Android 6.0 and higher) — 運行時請求
如果設備運行的是 Android 6.0(API 級別 23)或更高版本陨舱,并且應用程序的 targetSdkVersion 是 23 或更高翠拣,則安裝時用戶不會收到任何有關權限的通知。應用程序必須要求用戶在運行時授予危險權限游盲。這時误墓,用戶會看到一個系統(tǒng)對話框,該對話框包含拒絕和允許按鈕益缎,如下左圖谜慌。
如果用戶拒絕權限請求,則在應用下次請求權限時莺奔,該對話框?qū)粋€復選框欣范,該復選框在選中后表示用戶不會再次被要求提供權限,如下右圖令哟。
即使用戶授予你所請求的權限恼琼,用戶還是可以選擇在系統(tǒng)設置中逐個啟用和禁用權限。所以你應該始終在運行時檢查并請求權限以防止運行時錯誤(SecurityException)屏富。
1.2 Install-time requests (Android 5.1.1 and below) — 安裝時請求
如果設備的 Android 版本是 Android 5.1.1(API 級別 22)或更低晴竞,或者該應用的 targetSdkVersion 為 22 或更低,則系統(tǒng)會自動要求用戶在安裝時為應用授予所有危險權限狠半,如下圖噩死。
如果用戶點擊接受,則授予應用請求的所有權限神年。如果用戶拒絕權限請求甜滨,系統(tǒng)將取消應用程序的安裝。
如果應用程序更新包含對額外權限的需求瘤袖,則在更新應用程序之前會提示用戶接受這些新的權限衣摩。
二、Permissions for optional hardware features — 可選硬件功能的權限
訪問某些硬件功能(例如藍牙或相機)需要應用程序許可。但是艾扮,不是所有的 Android 設備都具備這些硬件功能既琴。因此,如果應用程序請求 CAMERA
許可權泡嘴,則必須在清單中用 <uses-feature>
標簽來聲明是否實際需要此功能甫恩。例如:
<uses-feature android:name="android.hardware.camera" android:required="false" />
如果你用
android:required="false"
聲明了該功能,那么 Google Play 可讓你的應用安裝在沒有此功能的設備上酌予。你必須調(diào)用PackageManager.hasSystemFeature()
來檢查當前設備是否在運行時具有該功能 磺箕,并在不可用時禁用該功能。如果你不提供
<uses-feature>
標簽抛虫,那么當 Google Play 發(fā)現(xiàn)應用請求相應的權限時松靡,會假定該應用需要此功能。因此建椰,該應用會無法安裝在沒有該功能的設備上雕欺,就像你在<uses-feature>
標簽中聲明android:required="true"
一樣 。
三棉姐、自動權限調(diào)整
Android 根據(jù) targetSdkVersion 的值來決定是否需要添加權限屠列。如果該值低于權限被添加的版本,則 Android 會自動添加權限伞矩。
例如笛洛,READ_EXTERNAL_STORAGE
權限從 API 級別 19 開始強制要求,以限制對共享存儲空間的訪問乃坤。如果 targetSdkVersion 是 18 或更低版本撞蜂,則會在新版 Android 上將此權限添加到應用中。
注意:如果你的應用自動添加了權限侥袜,即使實際上不需要它們蝌诡,Google Play 上的應用列表也會列出這些附加權限。為了避免這種情況并刪除不需要的默認權限枫吧,請將 targetSdkVersion 設置為盡可能高浦旱。
四、權限保護級別
權限分為幾個保護級別九杂,保護級別將影響是否需要在運行時請求權限颁湖。
1. 普通權限
普通權限涵蓋應用程序需要訪問沙箱外的數(shù)據(jù)或資源的區(qū)域,但是對用戶的隱私或其他應用程序的風險很小例隆。例如甥捺,設置時區(qū)的權限是普通權限。
系統(tǒng)會在安裝時自動授予普通權限許可權镀层,不會提示用戶镰禾,并且用戶無法撤消這些權限。
從 Android 8.1(API 級別 27)開始,以下權限分類為 PROTECTION_NORMAL
:
2. 簽名權限
系統(tǒng)在安裝時授予應用程序這些權限吴侦,但僅當試圖使用權限的應用程序與定義權限的應用程序具有相同的證書簽名時屋休。
注意:某些簽名權限不適用于第三方應用程序。
從 Android 8.1(API 級別 27)開始备韧,第三方應用程序可以使用以下分類為 PROTECTION_SIGNATURE
的權限:
3. 危險權限
危險權限涵蓋應用程序需要涉及用戶私人信息或資源的區(qū)域劫樟,或者可能會影響用戶的存儲數(shù)據(jù)或其他應用程序的操作。例如织堂,閱讀用戶聯(lián)系人的權限是一個危險的權限叠艳。
危險權限和權限組如下圖:
4. 特殊權限
有幾個不屬于普通和危險級別的權限。SYSTEM_ALERT_WINDOW
和 WRITE_SETTINGS
特別敏感易阳,所以大多數(shù)應用程序不應該使用它們附较。如果應用程序需要這些權限之一,則必須在清單中聲明權限闽烙,并請求用戶授權。系統(tǒng)通過向用戶顯示詳細的管理界面來響應請求声搁。
五黑竞、查看應用程序權限
你可以使用 “設置” 應用程序和 shell 命令 adb shell pm list permissions
查看系統(tǒng)中當前定義的所有權限。對于開發(fā)人員疏旨,使用 adb '-s'
選項將在一個表格中顯示權限很魂,類似用戶看到的那樣:
$ 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
...
在模擬器或測試設備上安裝應用程序時,你還可以使用 adb -g
選項自動授予所有權限:
$ adb shell install -g MyApp.apk