1. 程式人生 > >android 6.0+ 動態權限獲取

android 6.0+ 動態權限獲取

日歷 cti color manager sms 操作 cal message nts

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+ 動態權限獲取