android 6.0+ 動態權限 拒毫不再詢問後跳轉設置應用詳情頁面

 android 6.0+ 的權限 須要動態申請 這裏的權限針對的是 敏感權限:java

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

一共用到 如下方法:android

  • ContextCompat.checkSelfPermission
    檢查應用是否具備某個危險權限。若是應用具備此權限,方法將返回 PackageManager.PERMISSION_GRANTED,而且應用能夠繼續操做。若是應用不具備此權限,方法將返回 PackageManager.PERMISSION_DENIED,且應用必須明確向用戶要求權限。ide

  • ActivityCompat.requestPermissions
    應用能夠經過這個方法動態申請權限,調用後會彈出一個對話框提示用戶受權所申請的權限。ui

  • ActivityCompat.shouldShowRequestPermissionRationale
    若是應用以前請求過此權限但用戶拒絕了請求,此方法將返回 true。若是用戶在過去拒絕了權限請求,並在權限請求系統對話框中選擇了 Don't ask again 選項,此方法將返回 false。若是設備規範禁止應用具備該權限,此方法也會返回 false。this

  • onRequestPermissionsResult
    當應用請求權限時,系統將向用戶顯示一個對話框。當用戶響應時,系統將調用應用的 onRequestPermissionsResult() 方法,向其傳遞用戶響應,處理對應的場景spa

 

例:code

<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方法 接收回調blog

 @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);get

                 intent.setData(uri);            }it

        }).show();
    }
相關文章
相關標籤/搜索