《Android進階之光》運行時權限Permission

Android6.0新特性,運行時權限。以打電話爲例。

步驟:

1、檢查權限:有就打電話;沒有就請求權限(如果之前用戶拒絕過,先提示爲啥需要這個權限)。

2、請求權限回來後:如果成功就打電話;沒成功就提示被拒絕(如果勾選了“不再詢問”則提示如何手動打開權限)。

代碼如下:


    private void call() {
        
        //檢查權限
        if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            //沒有就去申請
            if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.CALL_PHONE)) {
                // 用戶拒絕過這個權限了,應該提示用戶,爲什麼需要這個權限。
                AlertDialog dialog = new AlertDialog.Builder(getContext())
                        .setMessage("解釋一下,因爲你要打電話,所以需要打電話權限。")
                        .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                                //繼續請求權限
                                requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, PERMISSIOINS_REQUEST_CODE_CALL);
                            }
                        }).create();
                dialog.show();
            }else {
                //請求權限,fragment中運行時權限的特殊處理、在Fragment中申請權限、不要使用ActivityCompat.requestPermissions、直接使用Fragment的requestPermissions方法、否則會回調到Activity的 onRequestPermissionsResult
                requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, PERMISSIOINS_REQUEST_CODE_CALL);
            }
        } else {
            callPhone();
        }

    }

    /**
     * 申請權限的回調
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == PERMISSIOINS_REQUEST_CODE_CALL) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                callPhone();
            }
            //拒絕後,再次彈框提示申請權限 ,若勾選“不再詢問”後點擊拒絕,會走此邏輯(此時shouldShowRequestPermissionRationale返回false)。
            //因爲已經拒絕且不在提示,需要告訴用戶如何打開權限。
            else if (!ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.CALL_PHONE)) {
                AlertDialog dialog = new AlertDialog.Builder(getContext())
                        .setMessage("該功能需要訪問電話的權限,當前未打開權限! 打開權限的方法:設置-應用—權限。")
                        .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        }).create();
                dialog.show();
            } else {
                Toast.makeText(getContext(), "被拒絕了", Toast.LENGTH_SHORT).show();
            }
        }
    }

    /**
     * 打電話.
     * <p>
     * 注意:
     * android.intent.action.CALL需要在配置文件中添加撥號權限 且 點擊後直接撥號
     * android.intent.action.DIAL只是調用撥號鍵盤,不用在文件中添加權限
     */
    private void callPhone() {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:" + "10086"));
        startActivity(intent);
    }

 

效果圖

1、第一次申請權限,用戶拒絕了,再次申請時 提示用戶爲啥需要這個權限,以免用戶勾選“不再詢問”且拒絕。

2、點擊確定後,申請權限的彈框 會有“不在詢問”的勾選框

3、勾選“不再詢問”後拒絕 的提示,告訴用戶怎麼打開權限。

 

比較好的文章及框架:

Android 6.0 運行時權限管理最佳實踐

目前最流行的運行時權限請求框架PermissionsDispatcher、RxPermissions和easypermissions的使用和對比

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