編輯:關於Android編程
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中簡單聲明這些權限就好,安裝時就授權。不需要每次使用時都檢查權限,而且用戶不能取消以上授權。
這類權限包括:
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訪問設備上的照片、媒體內容和文件嗎?”。
這類權限包括:
其實一下權限能看官方的文檔,是最好的:
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. 檢查某一個權限的當前狀態,你應該在請求某個權限時檢查這個權限是否已經被用戶授權,已經授權的權限重復申請可能會讓用戶產生厭煩。
2. 該方法有一個參數是權限名稱,有一個int的返回值,用這個值與上面提到的兩個常量做比較可判斷檢查的權限當前的狀態。
if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // 沒有權限,可以在這裡重新申請權限。 }else{ // 有權限了。 }
申請權限
請求用戶授權幾個權限,調用後系統會顯示一個請求用戶授權的提示對話框,App不能配置和修改這個對話框,如果需要提示用戶這個權限相關的信息或說明,需要在調用 requestPermissions() 之前處理 該方法有兩個參數:int requestCode: 會在回調onRequestPermissionsResult()時返回,用來判斷是哪個授權申請的回調。由於該方法是異步的,所以無返回值,當用戶處理完授權操作時,會回調Activity或者Fragment的onRequestPermissionsResult()方法。
String[] permissions: 權限數組,你需要申請的的權限的數組。
ActivityCompat.requestPermissions(activity, 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; } } }
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; } } }
Github: https://github.com/tbruyelle/RxPermissions
Github: https://github.com/yanzhenjie/AndPermission
Github: https://github.com/k0shk0sh/PermissionHelper
Github: https://github.com/hotchemi/PermissionsDispatcher
我嘗試了上面幾種權限管理庫
本文實例為大家分享了Android創建發送和接收短信應用的簡單實現過程,供大家參考,具體內容如下一、接收短信項目的結構如下:一個簡單的接收和發送短信的功能1、定義一個接收
經常會網友遇到手機使用時間較久後會遇到提示“SD卡已損壞,您可能必須將其重新格式化”故障,導致手機SD卡無法使用。最近身邊有朋友手機
目前市面上的應用,貌似除了微信和手Q都會比較擔心被用戶或者系統(廠商)殺死問題。本文對 Android 進程拉活進行一個總結。Android 進程拉活包括兩個層面:A.
Android基礎入門教程——8.4.3 Android動畫合集之屬性動畫-初見標簽(空格分隔): Android基礎入門教程本節引言: 本節給帶