Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> [Android開發] Android6.0以上權限總結

[Android開發] Android6.0以上權限總結

編輯:關於Android編程

Android6.0以上權限總結

一. Android6.0 權限變化

在Android M中權限系統被重新設計,發生了很大的變化。

1. 6.0以後Android權限分普通權限危險權限,如果應用的targetSdkVersion>=23,危險權限AndroidManifest注冊了也沒用,要用戶動態獲取的,即谷歌為了用戶安全性考慮,對危險權限不再是安裝時許可了,而是使用時讓用戶自己判斷。

如果App運行在Android 5.1 (API level 22)或者更低級的設備中,或者代碼中設置了targetSdkVersion<=22時(此時設備可以是Android 6.0 (API level 23)或者更高),將采用舊的權限管理策略,系統會要求用戶在安裝第一次運行的時候授予權限。其次,系統就告訴用戶App需要什麼權限組,而不是個別的某個權限。

二. 權限分類列表

權限分為了普通權限和危險權限

1. PROTECTION_NORMAL(普通權限):

這類權限只需要在AndroidManifest.xml中簡單聲明這些權限就好,安裝時就授權。不需要每次使用時都檢查權限,而且用戶不能取消以上授權。

這類權限包括:

權限名字 中文解析 android.permission.ACCESS LOCATIONEXTRA_COMMANDS 網上太多就不寫了 android.permission.ACCESS NETWORKSTATE   android.permission.ACCESS NOTIFICATIONPOLICY   android.permission.ACCESS WIFISTATE   android.permission.ACCESS WIMAXSTATE   android.permission.BLUETOOTH   android.permission.BLUETOOTH_ADMIN   android.permission.BROADCAST_STICKY   android.permission.CHANGE NETWORKSTATE   android.permission.CHANGE WIFIMULTICAST_STATE   android.permission.CHANGE WIFISTATE   android.permission.CHANGE WIMAXSTATE   android.permission.DISABLE_KEYGUARD   android.permission.EXPAND STATUSBAR   android.permission.FLASHLIGHT   android.permission.GET_ACCOUNTS   android.permission.GET PACKAGESIZE   android.permission.INTERNET   android.permission.KILL BACKGROUNDPROCESSES   android.permission.MODIFY AUDIOSETTINGS   android.permission.NFC   android.permission.READ SYNCSETTINGS   android.permission.READ SYNCSTATS   android.permission.RECEIVE BOOTCOMPLETED   android.permission.REORDER_TASKS   android.permission.REQUEST INSTALLPACKAGES   android.permission.SET TIMEZONE   android.permission.SET_WALLPAPER   android.permission.SET WALLPAPERHINTS   android.permission.SUBSCRIBED FEEDSREAD   android.permission.TRANSMIT_IR   android.permission.USE_FINGERPRINT   android.permission.VIBRATE   android.permission.WAKE_LOCK   android.permission.WRITE SYNCSETTINGS   com.android.alarm.permission.SET_ALARM   com.android.launcher.permission.INSTALL_SHORTCUT   com.android.launcher.permission.UNINSTALL_SHORTCUT  

2. Dangerous Permissions(危險權限)

所有危險的Android系統權限屬於權限組,如果APP運行在Android 6.0 (API level 23)或者更高級別的設備中,而且targetSdkVersion>=23時,系統將會自動采用動態權限管理策略,如果你在涉及到特殊權限操作時沒有做動態權限的申請將會導致App崩潰。

這類權限需要注意:
- 此類權限必須也在Manifest中申明,否則申請時不提使用用戶,直接回調開發者權限被拒絕。
- 同一個權限組的任何一個權限被授權了,這個權限組的其他權限也自動被授權。例如,一旦WRITE_CONTACTS被授權了,App也有READ_CONTACTS和GET_ACCOUNTS了。
- 申請某一個權限的時候系統彈出的Dialog是對整個權限組的說明,而不是單個權限。例如我申請READ_EXTERNAL_STORAGE,系統會提示”允許xxx訪問設備上的照片、媒體內容和文件嗎?”。

這類權限包括:

組名稱 組下面的權限 group:android.permission-group.CONTACTS(聯系人組) android.permission.WRITE_CONTACTS(寫入聯系人)
android.permission.GET_ACCOUNTS(查找設備上的帳戶)
android.permission.READ_CONTACTS(讀取聯系人) group:android.permission-group.PHONE(手機撥號) android.permission.READ_CALL_LOG(讀取通話記錄)
android.permission.READ_PHONE_STATE(讀取電話狀態)
android.permission.CALL_PHONE(撥打電話)
android.permission.WRITE_CALL_LOG(修改通話記錄)
android.permission.USE_SIP(SIP視頻服務)
android.permission.PROCESS_OUTGOING_CALLS(程序監視,修改或放棄撥出電話)
com.android.voicemail.permission.ADD_VOICEMAIL(允許應用程序添加系統中的語音郵件) group:android.permission-group.CALENDAR(日歷) android.permission.READ_CALENDAR(讀取日歷)
android.permission.WRITE_CALENDAR(修改日歷) group:android.permission-group.CAMERA(相機) android.permission.CAMERA(獲取拍照權限) group:android.permission-group.SENSORS(傳感器) android.permission.BODY_SENSORS(獲取傳感器權限) group:android.permission-group.LOCATION(定位) android.permission.ACCESS_FINE_LOCATION(通過gps獲取定位權限)
android.permission.ACCESS_COARSE_LOCATION(通過wifi和移動基站獲取定位權限) group:android.permission-group.STORAGE(內存卡) android.permission.READ_EXTERNAL_STORAGE(讀取內存卡)
android.permission.WRITE_EXTERNAL_STORAGE(寫內存卡) group:com.sina.weibo.permission-group() com.sina.weibo.permission.USER group:android.permission-group.MICROPHONE(麥克風) android.permission.RECORD_AUDIO(錄音權限) group:android.permission-group.SMS(短信) android.permission.READ_SMS(讀取短信)
android.permission.RECEIVE_WAP_PUSH(接收WAP PUSH信息)
android.permission.RECEIVE_MMS()
android.permission.RECEIVE_SMS(接收短信權限)
android.permission.SEND_SMS(發送短信)
android.permission.READ_CELL_BROADCASTS(獲取小區廣播)

其實一下權限能看官方的文檔,是最好的:
https://developer.android.com/guide/topics/security/permissions.html
https://developer.android.com/guide/topics/security/normal-permissions.html
https://developer.android.com/guide/topics/security/permissions.html#perm-groups

三. 手動獲取判斷處理權限

主要用到的幾個方法:

//檢查權限
int checkSelfPermission(String)
//申請權限
void requestPermissions(int, String...)
//是否應該顯示請求權限的說明
boolean shouldShowRequestPermissionRationale(String)
//處理權限結果回調
void onRequestPermissionsResult(int,String[],int[])

是否有權限常量標識:

PackageManager.PERMISSION_DENIED:拒絕了。

PackageManager.PERMISSION_GRANTED:授權了。

上述四個方法中,前三個方法在support-v4的ActivityCompat中都有,建議使用兼容庫中的方法。最後一個方法是用戶授權或者拒絕某個權限組時系統會回調Activity或者Fragment中的方法。

1. checkSelfPermission(String)

檢查權限
1. 檢查某一個權限的當前狀態,你應該在請求某個權限時檢查這個權限是否已經被用戶授權,已經授權的權限重復申請可能會讓用戶產生厭煩。
2. 該方法有一個參數是權限名稱,有一個int的返回值,用這個值與上面提到的兩個常量做比較可判斷檢查的權限當前的狀態。

if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
    // 沒有權限,可以在這裡重新申請權限。
}else{
    // 有權限了。
}

2. requestPermissions(int, String…)

申請權限

請求用戶授權幾個權限,調用後系統會顯示一個請求用戶授權的提示對話框,App不能配置和修改這個對話框,如果需要提示用戶這個權限相關的信息或說明,需要在調用 requestPermissions() 之前處理 該方法有兩個參數:
int requestCode: 會在回調onRequestPermissionsResult()時返回,用來判斷是哪個授權申請的回調。
String[] permissions: 權限數組,你需要申請的的權限的數組。
由於該方法是異步的,所以無返回值,當用戶處理完授權操作時,會回調Activity或者Fragment的onRequestPermissionsResult()方法。
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_CONTACTS}, MMM);

3. onRequestPermissionsResult(int,String[],int[])

處理權限結果回調 1. 該方法在Activity/Fragment中應該被重寫,當用戶處理完授權操作時,系統會自動回調該方法 2. 該方法有三個參數: **int requestCode**: 在調用requestPermissions()時的第一個參數。 **String[] permissions**: 權限數組,在調用requestPermissions()時的第二個參數。 **int[] grantResults**: 授權結果數組,對應permissions,具體值和上方提到的PackageManager中的兩個常量做比較。
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MMM: {
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 權限被用戶同意,可以做你要做的事情了。
            } else {
                // 權限被用戶拒絕了,可以提示用戶,關閉界面等等。
            }
            return;
        }
    }
}

4. shouldShowRequestPermissionRationale(String)

是否應該顯示請求權限的說 第一次請求權限時,用戶拒絕了,調用shouldShowRequestPermissionRationale()後返回true,應該顯示一些為什麼需要這個權限的說明。 用戶在第一次拒絕某個權限後,下次再次申請時,授權的dialog中將會出現“不再提醒”選項,一旦選中勾選了,那麼下次申請將不會提示用戶。 第二次請求權限時,用戶拒絕了,並選擇了“不在提醒”的選項,調用shouldShowRequestPermissionRationale()後返回false。 設備的策略禁止當前應用獲取這個權限的授權:shouldShowRequestPermissionRationale()返回false 。 加這個提醒的好處在於,用戶拒絕過一次權限後我們再次申請時可以提醒該權限的重要性,面得再次申請時用戶勾選“不再提醒”並決絕,導致下次申請權限直接失敗。
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {// 沒有權限。
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)) {
            // 用戶拒絕過這個權限了,應該提示用戶,為什麼需要這個權限。
    } else {
        // 申請授權。
        ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MMM);
    }
}

...

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MMM: {
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 權限被用戶同意。
            } else {
                // 權限被用戶拒絕了。
            }
            return;
        }
    }
}

四、一些權限管理庫

1. RxPermissios

Github: https://github.com/tbruyelle/RxPermissions

2. AndPermission

Github: https://github.com/yanzhenjie/AndPermission

3. PermissionHelper

Github: https://github.com/k0shk0sh/PermissionHelper

4. PermissionsDispatcher

Github: https://github.com/hotchemi/PermissionsDispatcher

我嘗試了上面幾種權限管理庫

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved