Android 6.0 運行權限的問題

Android開發中當targetSDKVersion 的值大於22時候,就會涉及到運行時權限的問題。有的應用程序會在剛進入App的首頁的時候彈出提示框讓用戶選擇允許還是拒絕,有的應用程序會在需要這個權限的地方彈出提示框讓用戶選擇,當用戶選擇允許的時候還好,但當用戶選擇拒絕的時候,當再次進入App或者某個頁面的時候就不會再一次彈出提示框讓用戶選擇,這就比較尷尬了,有的手機得不到某個權限的時候會導致App崩潰,例如getDeviceId的時候需要READ-PHONE_STATE這個權限,在vivo ,oppo,魅族的手機上是可以得到這個權限的,但在小米的機型上需要動態申請纔可以得到。就會導致程序在小米的手機上不能兼容。下面說一下我的解決方法。

1.進入App或進入某個頁面的onResume生命週期裏先檢查是否有這個權限。(這裏以進入登錄頁面爲例),沒有這個權限的時候去申請這個權限彈出提示框。

2.彈出提示框後如果用戶點擊允許就可以結束這個邏輯了,萬事大吉。

                           用戶點擊了拒絕後,繼續操作在需要特殊權限的地方用try catch 語句處理,當走到catch裏的時候彈出自己寫的提示框,提示用戶跳轉到設置頁面手動開啓所需要的權限。

代碼如下:

1.

@Override

    public void onResume() {

        super.onResume();

        //檢查是否有讀取手機信息的權限

        int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_PHONE_STATE);

        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {

            // 沒有這個權限去請求

            requestReadPhonePermission();

        } else {

            //TODO

        }

    }

2.

private void requestReadPhonePermission() {

//shouldShowRequestPermissionRationale 這個方法是提示用戶請求權限的理由

        if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), android.Manifest.permission.READ_PHONE_STATE)) {

            //在這裏面處理需要權限的代碼

        } else {

            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_PHONE_STATE}, 0);

        }

    }


    @Override

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

        switch (requestCode) {

            case 0:

                if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {

                    //TODO

                    Log.i("fkajfk", "走了這個log");

                }

                break;


            default:

                break;

        }

    }


3.

    /**

     * 提示用戶的 dialog

     */

    protected void showMissingPermissionDialog() {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        builder.setTitle("提示");

        builder.setMessage("當前應用缺少獲取手機信息權限。\n\n請點擊\"設置\"-\"權限管理\"-打開所需權限。");

        // 拒絕, 退出應用

        builder.setNegativeButton("取消",

                new DialogInterface.OnClickListener() {

                    @Override

                    public void onClick(DialogInterface dialog, int which) {

                        Log.i("info", "8--權限被拒絕,此時不會再回調onRequestPermissionsResult方法");

                    }

                });

        builder.setPositiveButton("設置",

                new DialogInterface.OnClickListener() {

                    @Override

                    public void onClick(DialogInterface dialog, int which) {

                        Log.i("info", "4,需要用戶手動設置開啓當前app設置界面");

                        startAppSettings();

                    }

                });

        builder.setCancelable(false);

        builder.show();

    }


4.

    /**

     * 打開     App設置界面

     */

    private void startAppSettings() {

        Intent intent = new Intent(

                Settings.ACTION_APPLICATION_DETAILS_SETTINGS);

        intent.setData(Uri.parse("package:" + getActivity().getPackageName()));

        startActivity(intent);

    }

5.//try catch 的異常裏調用 showMissingPermissionDialog();

try {

         //正常做操作   

        }catch (Exception e){

            showMissingPermissionDialog();

        }

附上兩張截圖:





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