安卓系統權限(Runtime Permissions)分為兩種:普通權限和高危權限。對于普通權限的申請,只在APP安裝的時候詢問一次,而對于高危權限,從Android M(API.23)開始,將會在APP運行時動態申請,這樣就可以使用戶選擇是否授予APP該權限,從而保護用戶安全。
運行時權限官方文檔解釋:https://developer.android.com/training/permissions/requesting.html
注: - 如果設備系統低于6.0,權限只會在APP安裝時詢問 - 如果targetSdkVersion小于23,權限只會在APP安裝時詢問
注意:同一個組內一個權限被授權了,同組內其他權限也自動被授權
Permission Group | Permissions |
---|---|
CALENDAR | READ_CALENDAR,WRITE_CALENDAR |
CAMERA | CAMERA |
CONTACTS | READ_CONTACTS,WRITE_CONTACTS , GET_ACCOUNTS |
LOCATION | access_FINE_LOCATION,ACCESS_COARSE_LOCATION |
MICROPHONE | RECORD_AUDIO |
PHONE | READ_PHONE_STATE,CALL_PHONE,READ_CALL_LOG,WRITE_CALL_LOG,ADD_VOICEMAIL,USE_Sip,PROCESS_OUTGOING_CALLS |
SENSORS | BODY_SENSORS |
SMS | SEND_SMS,RECEIVE_SMS,READ_SMS,RECEIVE_WAP_PUSH,RECEIVE_MMS |
STORAGE | READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE |
申請權限的時候,第二個參數為數組格式,也就是說,可以同時申請多個權限,但不建議這么做。REQUEST_STORAGE_PERMISSION為自定義的請求碼。
如果在Fragment中申請權限的話,需要調用Fragment的requestPermissions(...)
方法,把ActivityCompat.requestPermissions
改為requestPermissions
。否則會回調到Activity的 onRequestPermissionsResult方法。
權限申請的成功或失敗之后的操作需要在此回調方法中實現。
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case REQUEST_STORAGE_PERMISSION: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 權限獲得成功 } else { // 權限沒有獲得 } break; } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }因為權限可以同時申請多個,所以回調結果也是以數組的方式返回。此處我們以只請求一個權限為例,如果用戶授予權限,則grantResults[0] = PackageManager.PERMISSION_GRANTED;
1.第一次申請權限的時候,該方法返回false 2.第一次申請權限失敗,用戶點擊拒絕授權后,如果再次申請權限,則該方法返回true 3.如果用戶拒絕授權并選擇[不再提醒]之后,該方法返回false 4.設備系統禁止APP使用該權限后,返回false
用戶拒絕授權權限的時候,系統會提供一個方法讓我們解釋為什么要申請該權限。因此,我們可以顯示一個Dialog向用戶再次申請權限。
if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { //向用戶解釋權限申請原因 AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("二維碼掃描需要使用相機權限"); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { // 權限申請 } }); builder.setNegativeButton("Cancle", null); builder.show(); } else { // 權限申請 } } else { // 有權限了 }EasyPermissions簡化了Android運行時權限申請、判斷、處理的操作步驟 官方文檔 https://github.com/googlesamples/easypermissions
注:如果提示Error:Failed to resolve: com.android.support:appcompat-v7:25.1.0
,就是需要你升級你的SDK了。
在第一次申請失敗后,如果需要再次申請,會自動彈出Dialog對話框,第二個參數即為對話框的Message,向用戶解釋為什么申請該權限,提高用戶授權的可能性。
AfterPermissionGranted是一個可選的注解,如果有此標簽,那么當request值對應的權限申請通過的話會自動調用該方法。
如果用戶點擊了”不在詢問“,就無法在通過APP獲取權限了,權限只能在設置界面重新授予。這種情況下,你可以使用EasyPermissions.somePermissionPermanentlyDenied(...)
方法來顯示一個系統對話框,用以打開系統設置界面。
當用戶從設置界面返回到APP界面的時候,在onActivityResult(...)
方法中就可以再次判斷權限的授權情況了。
附上demo地址: http://download.csdn.net/download/u014527323/9762717
新聞熱點
疑難解答