Android動態權限

動態獲取權限

這是一個老生常談的問題,在Android6.0之前,只要同意安裝應用,所有在Manifest文件里聲明的權限都能被獲取到,而從6.0開始,加入了動態權限,權限被分為normal permission 和 dangerous permission,dangrous permission都是一些可能會侵犯到使用者隱私的權限,所以這些權限都必須在應用需要使用該權限時對用戶進行詢問是否授予權限。
下面就以一個打電話的權限來演示。在布局文件中寫一個button,并給這個button設置點擊事件為call()方法。
首先在Manifest文件中加入<uses-permission android:name="android.permission.CALL_PHONE" />
然后寫了下面兩個方法,我們開始分析這兩個方法。

private void call() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, PERMISSIONS_REQUEST_CALL_PHONE);
            } else {
                callPhone();
            }
        }
        callPhone();
    }


    public void callPhone() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        Uri data = Uri.parse("tel:" + "10086");
        intent.setData(data);
        try {
            startActivity(intent);
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }

callPhone()方法是我們封裝好的一個給10086打電話的方法(霧,沒有什么難點,就不解釋了。
重點來看call()方法,首先我們要對當前手機的SDK的版本進行判斷,如果是Android6.0及以上才去進行權限的判斷和獲取,否則就直接執行callPhone()方法。當確定SDK版本在6.0及以上時,首先要去確認一下是否已經獲取到了權限,如果已經獲取到了權限則直接執行callPhone(),沒有的話去執行ActivityCompat.requestPermissions(Activity activity,String[] permissions, int requestCode)方法來獲取權限。這個方法一共要傳入三個參數,第一個是一個activty,第二個是以字符串形式保存的權限名的數組,這里我這只需要申請一個權限,所以就直接在方法里初始化了這個數組,第三個是一個int型的requesetcode,因為我在全局變量里加入了private static final int PERMISSIONS_REQUEST_CALL_PHONE = 1;,所以這里實際上相當于傳的是一個1。這個值在我們后邊會說到的onRequestPermissionsResult()方法里會用到。

以上我們已經實現了動態權限的獲取,但是如果只按以上的代碼來寫在用戶體驗上有一些小小的不友好,比如在獲取權限時,不論能否獲取到權限,用戶都不能得到一個有效的反饋,我們希望在申請完權限后,如果用戶給了這個權限,就直接運行我們的方法,而當沒有獲取到時就彈出一個Toast來提示用戶沒有獲取到權限。想要達到這樣的效果,我們就需要重寫onRequestPermissionsResult方法。

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == PERMISSIONS_REQUEST_CALL_PHONE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                callPhone();
            } else {
                Toast.makeText(this, "需要權限", Toast.LENGTH_SHORT).show();
            }
            return;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

在這個方法里,我們用到了上面提到的requestcode,我們需要對每個requestcode進行獨立的判斷,當獲取到的結果為PackageManager.PERMISSION_GRANTED時,說明權限獲取成功了,這里的數組grantResults是與上面發送請求時的String數組一一對應的。當權限獲取成功時我們直接運行callPhone()方法,沒有成功時彈出一個Toast,這樣我們就達到了我們想要的效果。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容