Android 運行時權限

在Android6.0中加入了運行時權限,用戶不需要在安裝的時候指定所有的申請權限,而是在軟件使用過程中再對某一權限進行授權。
如果在運行時添加了一次權限,那麼以後就會默認全部添加權限,但是用戶如果以後想要再次更改權限,可以到
Setting->Apps->RuntimePermissionTest->Permissions進行權限關閉

下表列舉了所有的運行時權限,我們在運行時權限處理使用的是權限名,但是一旦某一個權限被授權了,那麼該權限組中的所有權限都會被授權。

權限組名 權限名
CALENDAR READ_CALENDAR
  WRITE_CALENDAR
CAMERA CAMERA
LOCATION ACCESS_FINE_LOCATION
  ACCESS_COARSE_LOCATION
CONTACTS READ_CONTACTS
  WRITE_CONTACTS
  GET_ACCOUNTS
PHONE READ_HPONE_STATE
  CALL_PHONE
  READ_CALL_LOG
  WRITE_CALL_LOG
  ADD_VOICEMAIL
  USE_SIP
  PROCESS_OUTGOING_CALLS
SENSORS BODY_SENSORS
SMS SEND_SMS
  RECEIVE_SENSORS
  READ_SENSORS
  RECEIVE_WAP_PUSH
  RECEIVE_MMS
MICROPHONE RECORD_AUDIO
STORAGE READ_EXTERNAL_STORAGE
  WRITE_EXTERNAL_STORAGE

示例:打電話權限

首先在manifest中需要配置權限

<uses-permission android:name="android.permission.CALL_PHONE"/>

然後在MainActivity中進行檢測 

if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)
                        != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
                } else {
                    call();
                }
private void call() {
        try {
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:10086"));
            startActivity(intent);
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }

在程序中需要使用ContextCompat.checkSelfPermission()方法判斷用戶是否已經授權,該方法接受兩個參數,第一個是context上下文,第二個參數是需要授權的權限名,返回值是一個int值,然後與PackageManager.PERMISSION_GRANTED進行比較,相等說明已經授權,否則即爲沒有授權。
沒有授權就調用ActivityCompat.requestPermissions()方法用來向用戶申請授權,該方法接受三個參數,第一個是當前活動的實例,第二個參數是一個字符串數組,包含了申請的權限,第三個參數是請求碼。該方法調用完成之後會彈出一個對話框,讓用戶選擇是否授權,不管授權與否都會回調onRequestPermissionsResult()方法,授權的結果會保存在該方法的第三個參數中

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    call();
                } else {
                    Toast.makeText(MainActivity.this, "You denied the permission", Toast.LENGTH_SHORT).show();
                }
                break;
            default:

        }
}



發佈了39 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章