Android應用許可權
Android應用的許可權必須提前在AndroidManifest.xml中宣告。如果申請的是普通許可權,系統會自動下發許可權,如果申請的是危險的許可權則必須由使用者同意後才能獲取。
對於危險許可權,在Android 5.1.1(API 22)之前,應用安裝時會彈出系統彈窗,請求使用者同意所有的危險許可權。如果點選accept,則會將所有的危險許可權下放給應用,否則,系統會取消安裝應用。在Android 6.0(API 23)之後,在安裝時,不會提示各種危險許可權的申請。應用必須在執行時,請求使用者下放許可權。使用者拒絕後則功能不能繼續執行。同意後,則之後不會彈出彈窗。
對於一些使用到系統功能的許可權,應用必須在AndroidManifest.xml中先通過<uses-feature>標籤去宣告需要裝置提供哪些硬體支援。如果將required屬性設定為false,代表這個硬體功能不是必須的,即使裝置沒有這個功能,也會安裝應用。所以,在應用中必須通過PackageManager.hasSystemFeature()來檢測,以避免可能導致的問題。如果沒有宣告這個功能,而在許可權申請中又需要這個許可權,則系統會認為你是必須這個硬體,對於沒有這個硬體功能的裝置,將不被允許安裝。
許可權許可
- Activity
- Service
- BroadcastReceiver
- ContentProvider
- URI
- Others
保護等級(針對第三方應用)
- Normal permissions :普通許可權。指的是那些你的App需要獲取沙箱之外的資料或者資源,但是這些對使用者的隱私或者其他App的影響很小。普通許可權在安裝時會被系統自動下發,而不會提示使用者。
- Signature permissions :簽名許可權。系統會在安裝時下放許可權 。
- Dangerous permissions :危險許可權。指那些App需要獲取使用者的隱私資訊,或者對使用者資料和其它應用有潛在影響的許可權。在訪問危險許可權時,系統會有彈窗提示使用者,在使用者同意時才能繼續使用。
- Special permissions :特殊許可權。有些許可權格外敏感,一般情況下不會被使用。例如:SYSTEM_ALERT_WINDOW 和WRITE_SETTINGS 。必須現在Manifest中申請,然後通過Intent向用戶申請許可權。
檢查是否有許可權
/** * 檢測是否具有相機許可權,相機許可權必須在AndroidManifest.xml中宣告 * 如果返回值為PackageManager.PERMISSION_GRANTED:0則為有許可權 * 如果返回值為PackageManager.PERMISSION_DENIED:-1則為沒有許可權 */ int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA); if(PackageManager.PERMISSION_GRANTED== permissionCheck){ //有許可權 }else{ //沒有許可權 }
shouldShowRequestPermissionRationale()方法。如果應用之前請求過此許可權但使用者拒絕了請求,此方法將返回true。如果使用者在過去拒絕了許可權請求,並在許可權請求系統對話方塊中選擇了 Don't ask again 選項,此方法將返回false。如果裝置規範禁止應用具有該許可權,此方法也會返回false。
請求所需要的許可權
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CAMERA)) { /** * 新增一些許可權提示 */ } else { /** * 申請許可權 * RequestCode:請求碼,返回結果時使用 */ ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, RequestCode); } }
處理許可權請求響應
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case RequestCode: { //如果請求被取消,grantResults陣列為空 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { /** * 許可權申請通過 */ } else { /** * 許可權申請被拒絕 */ } return; } } }
使用Android許可權的原則
- 僅使用應用正常工作所需的許可權
- 注意庫所需的許可權
- 公開透明
- 讓系統以顯示方式訪問