android 6.0+ 動態權限獲取
android 6.0+ 的權限 需要動態申請 這裏的權限針對的是 敏感權限:
SMS(短信) SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS STORAGE(存儲卡) READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE CONTACTS(聯系人) READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS PHONE(手機) READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS CALENDAR(日歷) READ_CALENDAR WRITE_CALENDAR CAMERA(相機) CAMERA LOCATION(位置) ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION SENSORS(傳感器) BODY_SENSORS MICROPHONE(麥克風) RECORD_AUDIO
一共用到 以下方法:
-
ContextCompat.checkSelfPermission
檢查應用是否具有某個危險權限。如果應用具有此權限,方法將返回 PackageManager.PERMISSION_GRANTED,並且應用可以繼續操作。如果應用不具有此權限,方法將返回 PackageManager.PERMISSION_DENIED,且應用必須明確向用戶要求權限。 -
ActivityCompat.requestPermissions
應用可以通過這個方法動態申請權限,調用後會彈出一個對話框提示用戶授權所申請的權限。 -
ActivityCompat.shouldShowRequestPermissionRationale
如果應用之前請求過此權限但用戶拒絕了請求,此方法將返回 true。如果用戶在過去拒絕了權限請求,並在權限請求系統對話框中選擇了 Don‘t ask again 選項,此方法將返回 false。如果設備規範禁止應用具有該權限,此方法也會返回 false。 -
onRequestPermissionsResult
當應用請求權限時,系統將向用戶顯示一個對話框。當用戶響應時,系統將調用應用的 onRequestPermissionsResult() 方法,向其傳遞用戶響應,處理對應的場景
例:
<uses-permission android:name="android.permission.READ_CONTACTS" />
private void requestPermission() {
if(Build.VERSION.SDK_INT>=23){
if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
//此處一般直接去申請對應的權限 有必要時可以去做判斷
if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_CONTACTS)) {
Log.i(TAG,"shouldShowRequestPermissionRationale");
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);
} else {
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
}else{
//這裏是權限已經授予了 去做該做的事
}
}
}
重寫Activity 的 onRequestPermissionsResult方法 接收回調
@Override
public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.i(TAG,"onRequestPermissionsResult granted");
} else {
Log.i(TAG,"onRequestPermissionsResult denied");
//彈出框 讓用戶去應用詳情頁手動設置權限
showWaringDialog();
}
return;
}
}
}
private void showWaringDialog() {
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("警告!")
.setMessage("請前往設置->應用->PermissionDemo->權限中打開相關權限,否則功能無法正常運行!")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri); }
}).show();
}
android 6.0+ 動態權限獲取