問題:
①onRequestPermissionsResult回調不執行
有的時候我們可能在fragment中去檢查權限、申請權限,自然就認為回調也就寫在fragment中了,而且寫了之後也沒有報任何錯。這也就是為什麼回調方法不執行的原因,是以我們把這個回調移到這個Fragment所依附的那個Activity,就可以順利執行啦。(注意,我這裡說的Fragment是v4包下的)
②如果你的app的targetSdkVersion 是23也就是android 6.0的話,遇到運作時權限不去做代碼處理的話,程式直接崩掉
如果你的app沒有在android 6.0上做足夠的測試,請不要設定targetSdk為23,22以下就不會出現問題。
1.權限分析
從Android6.0開始,權限分為普通權限和許可權限。許可權限分類歸組,一個權限授權之後,該組下的權限均可使用.
①普通權限
隻需要在xml申請即可,使用方法和之前6.0以前的一樣。在應用安裝應用時,會預設獲得許可。
②許可權限
可執行 $adb shell pm list permissions -d -g
Permission Group Permissions
android.permission-group.CALENDAR
android.permission.READ_CALENDAR
android.permission.WRITE_CALENDAR
android.permission-group.CAMERA
android.permission.CAMERA
android.permission-group.CONTACTS
android.permission.READ_CONTACTS
android.permission.WRITE_CONTACTS
android.permission.GET_ACCOUNTS
android.permission-group.LOCATION
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_COARSE_LOCATION
android.permission-group.MICROPHONE
android.permission.RECORD_AUDIO
android.permission-group.PHONE
android.permission.READ_PHONE_STATE
android.permission.CALL_PHONE
android.permission.READ_CALL_LOG
android.permission.WRITE_CALL_LOG
com.android.voicemail.permission.ADD_VOICEMAIL
android.permission.USE_SIP
android.permission.PROCESS_OUTGOING_CALLS
android.permission-group.SENSORS
android.permission.BODY_SENSORS
android.permission-group.SMS
android.permission.SEND_SMS
android.permission.RECEIVE_SMS
android.permission.READ_SMS
android.permission.RECEIVE_WAP_PUSH
android.permission.RECEIVE_MMS
android.permission.READ_CELL_BROADCASTS
android.permission-group.STORAGE
android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE
同一組的任何一個權限被授權了,其他權限也自動被授權。例如,一旦WRITE_CONTACTS被授權了,app也有READ_CONTACTS和GET_ACCOUNTS了。
源碼中被用來檢查和請求權限的方法分别是Activity的checkSelfPermission和requestPermissions,這些方法api23引入。
2.相關方法
①.ContextCompat.checkSelfPermission()
檢查應用是否擁有該權限,被授權傳回值為PERMISSION_GRANTED,否則傳回PERMISSION_DENIED
②.ActivityCompat.requestPermissions()
将彈出請求授權對話框,這個方法在M之前版本調用,OnRequestPermissionsResultCallback 直接被調用,帶着正确的 PERMISSION_GRANTED或者 PERMISSION_DENIED 。
(3).AppCompatActivity.onRequestPermissionsResult()
該方法類似于Activity的OnActivityResult()的回調方法,主要接收請求授權的傳回值if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { if ( progressDialogUtil != null) { progressDialogUtil.DismissAllDialog(); } String[] permissions = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}; ActivityCompat.requestPermissions(getActivity(), permissions, 10); return; } }
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
MyLogManager.d("資料定位權限回調", grantResults.length + "");
if (grantResults.length == 0) {
return;
}
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//已授權
ToastUtil.getInstance(this).makeTextCenter("您已開啟定位權限,請重新操作");
} else { //使用者拒絕
if (progressDialogUtil != null) {
progressDialogUtil.DismissAllDialog();
}
ToastUtil.getInstance(this).makeTextCenter("您已拒絕了開啟定位權限,若想再通路請手動打開定位權限");
}
}
封裝demo位址: https://download.csdn.net/download/haoxuhong/10414632
注:将demo中baseactivity類裡面的
Manifest.permission.CAMERA 改為:
permission