版權聲明:本文為部落客原創文章,轉載請注明出處http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/53585894
前言
最近項目發現比較多的問題是關于Android 6.0的問題,APP安裝之後,在Android 6.0之後的系統,點選直接奔潰打不開,這是為什麼昵?這就是Android 6.0以上的系統引入運作時權限--預設所有涉及使用者隐私的權限都被關閉,我們在AndroidManifest.xml中申請了,之後我們還得動态申請權限,不然我們每次安裝完APP後,就得在“設定=》應用=》安裝的APP”打開我們所需權限。
Android 6.0 需要動态申請的權限
Android M引入了運作時權限。所有權限仍然需要在AndroidManifest中聲明。但是,當通路需要權限的API時,活動或片段必須驗證權限已被授予或使用通過支援庫的調用請求缺少的權限。Android 6.0需要單獨申請的權限,共分為9組,每組隻要有一個權限申請成功了,就預設整組權限都可以使用了。如下所示:
group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS
group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR
group:android.permission-group.CAMERA
permission:android.permission.CAMERA
group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS
group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION
group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE
group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO
group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS
Android 6.0動态權限申請主要方法
Android6.0動态權限申請主要用到v4包中的下面三個函數:
-
權限通過ActivityCompat類中的checkselfpermission
方法。
- 權限請求是通過Activitycompat 類中的requestpermissions方法,在回調activitycompat收到響應。onrequestpermissionsresultcallback # onrequestpermissionsresult方法。
-
應用程式可以提供一個額外的合理的使用權限調用Activitycompat #
shouldshowrequestpermissionrationale方法。Android原生系統中,如果第二次彈出權限申請的對話框,會出現“以後不再彈出”的提示框,如果使用者勾選了,你再申請權限,則shouldShowRequestPermissionRationale傳回true,意思是說要給使用者一個 解釋,告訴使用者為什麼要這個權限。然而,在實際開發中,需要注意的是,很多手機對原生系統做了修改,比如小米,小米4的6.0的shouldShowRequestPermissionRationale
就一直傳回false,而且在申請權限時,如果使用者選擇了拒絕,則不會再彈出對話框了。。。。 是以說這個地方有坑,我的解決方法是,在回調裡面處理,如果使用者拒絕了這個權限,則打開本應用資訊界面,由使用者自己手動開啟這個權限。
Android 6.0動态權限申請示例
上面講了Android6.0動态權限申請的原理,下面我們來看一下如何申請動态權限。
1、首先在AndroidManifest.xml檔案中申請所需要的權限。比如我要申請照相機的權限
2、在build.gradle檔案中修改targetSdkVersion即APP所支援的sdk版本号大于等于23,我這裡設定為23.因為23就是Android 6.0的sdk版本号。
3、開始申請權限,我們通過流程圖來看一下
代碼示例:
檢查權限
//檢查權限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
//進入到這裡代表沒有權限.
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE);
} else {
showcamera();
}
我們還需要寫回掉方法:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case REQUEST_CODE:
if(grantResults.length >0 &&grantResults[0]==PackageManager.PERMISSION_GRANTED){
//使用者同意授權
showcamera();
}else{
//使用者拒絕授權
}
break;
}
}
如果拒絕提示使用者
我們用上面的方法,如果申請時使用者拒絕授予權限時,APP會崩潰,是以我們需要在使用者拒絕授予權限後,提示使用者我們為什麼要這個權限。
//檢查權限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
//進入到這裡代表沒有權限.
if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA)){
//已經禁止提示了
Toast.makeText(MainActivity.this, "您已禁止該權限,需要重新開啟。", Toast.LENGTH_SHORT).show();
}else{
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE);
}