android6.0運行時權限詳解

1. 運行時獲得權限:

從androi 6.0開始,不再是安裝應用時用戶確定獲得全部的權限.而是在使用軟件過程中需要該權限時,彈出對話框讓用戶選擇權限.不僅如此,用戶選擇權限後還可以關閉。

2. 檢查是否獲得權限:

通過 ContextCompat.checkSelfPermission(context,permission)方法,方法返回值爲 PackageManager.PERMISSION_GRANTED or PackageManager.PERMISSION_DENIED

int permissionCheck = ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_CALENDAR);
        if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(PermissionActivity.this, "hava this permission", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(PermissionActivity.this, "no this permission", Toast.LENGTH_SHORT).show();
        }

3. 請求權限:

通過ActivityCompat.requestPermissions(activity,permissions,requestCode)第二個參數是一個String數組,第三個參數是請求碼便於在onRequestPermissionsResult 方法中根據requestCode進行判斷.

 ActivityCompat.requestPermissions(PermissionActivity.this,
                        new String[]{Manifest.permission.READ_CONTACTS},
                        MY_PERMISSIONS_REQUEST_READ_CONTACTS);

4. 請求權限後的回調:

請求權限後會回調onRequestPermissionsResult方法,在activity中重寫onRequestPermissionsResult(requestCode,permissions,grantResults)方法 grantResults是int類型的數組每個值爲PackageManager.PERMISSION_GRANTED or PackageManager.PERMISSION_DENIED 分別對應permissions的每個請求.

     @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    

                } else {

                }

            }
        }
       
    }

5. 告訴用戶爲何需要權限:

ActivityCompat.shouldShowRequestPermissionRationale(activity,permission) 這個方法是在用戶拒絕權限後返回true. 也就是說:用戶第一次點擊一個需要權限的地方,該方法返回false(因爲用戶沒拒絕~),當用戶拒絕掉該權限,下次點擊此權限處,該方法會返回true.可在裏面進行對該權限的說明,然後彈出權限讓用戶選擇,並且對話框有don't ask again選項.

@OnClick(R.id.btn_check)
    public void onClick() {

        //判斷是否有權限
        if (ContextCompat.checkSelfPermission(PermissionActivity.this,
                Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {
            //當用戶拒絕掉權限時.
            if (ActivityCompat.shouldShowRequestPermissionRationale(PermissionActivity.this,
                    Manifest.permission.READ_CONTACTS)) {

                Toast.makeText(PermissionActivity.this, "true", Toast.LENGTH_SHORT).show();
                AlertDialog dialog = new AlertDialog.Builder(this).setTitle("該權限保證手機不會爆炸^ ^").setPositiveButton("我需要此權限!", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ActivityCompat.requestPermissions(PermissionActivity.this,
                                new String[]{Manifest.permission.READ_CONTACTS},
                                MY_PERMISSIONS_REQUEST_READ_CONTACTS);
                    }
                }).setNegativeButton("炸吧炸吧~", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(PermissionActivity.this, "準備爆炸了", Toast.LENGTH_SHORT).show();
                    }
                }).show();

            } else {

                Toast.makeText(PermissionActivity.this, "false", Toast.LENGTH_SHORT).show();
                ActivityCompat.requestPermissions(PermissionActivity.this,
                        new String[]{Manifest.permission.READ_CONTACTS},
                        MY_PERMISSIONS_REQUEST_READ_CONTACTS);

            }
        }
    }

6.用戶選擇do't ask again 後

ActivityCompat.shouldShowRequestPermissionRationale(activity,permission) 方法一直返回false,並且ActivityCompat.requestPermissions不會彈出對話框,系統直接deny,並回調onRequestPermissionsResult方法.

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                } else {
                    showDialog();
                   // Toast.makeText(PermissionActivity.this, "request false", Toast.LENGTH_SHORT).show();
                }

            }
        }

    }

    private void showDialog() {
        AlertDialog dialog = new AlertDialog.Builder(this).setTitle("還可以手動開啓哦~").setMessage("可以前往設置->app->myapp->permission打開").setPositiveButton("確定!", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            }
        }).show();
    }

7. 用戶接受權限

 

8.補充

android權限有normal和dangerous兩種 normal系統會自動給予權限,dangerous需要用戶選擇.Normal and Dangerous Permissions

用戶手動開啓權限:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章