簡體   English   中英

MarshMallow權限對話框不提示

[英]MarshMallow Permission dialog doesn't prompt

在棉花糖中,如果第一次拒絕該權限,則運行時權限對話框不會再次提示。 我必須3危險權限WRITE_EXTERNAL_STORAGE,READ_SMS和CAMERA權限。 誰能告訴我我要去哪里錯了。

if (Build.VERSION.SDK_INT >= 23) {
        if (ContextCompat.checkSelfPermission(getActivity(),
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getActivity(),
                Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getActivity(),
                Manifest.permission.READ_SMS)
                != PackageManager.PERMISSION_GRANTED) {

            if (ContextCompat.checkSelfPermission(getActivity(),
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

                } else {   
                    ActivityCompat.requestPermissions(getActivity(),
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
                }
            }
            if (ContextCompat.checkSelfPermission(getActivity(),
                    Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

                } else {

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

            }
            if (ContextCompat.checkSelfPermission(getActivity(),
                    Manifest.permission.READ_SMS)
                    != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

                } else {
        ActivityCompat.requestPermissions(getActivity(),
                            new String[]{Manifest.permission.READ_SMS},
                            MY_PERMISSIONS_REQUEST_SMS);
                }
            }

        }
    }

我想你一定要用

requestPermissions(new String[]{Manifest.permission.CAMERA}, Constants.RESULT_CODE);

代替

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

使用此代碼可能會幫助您

在要打開權限請求對話框的位置使用此代碼。

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            requestPermissions(new String[]{Manifest.permission.CAMERA}, 2);
            requestPermissions(new String[]{Manifest.permission.READ_SMS}, 3);


        }

下面的代碼用於處理權限對話框的響應(再次打開權限對話框以及授予或拒絕權限檢查等)

@RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == 1) {

            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                }
                else{
                    Log.e("permission force:", "Here you code if anyone check never and denied request of Write External Storage");

                }
            }

        } else if (requestCode == 2) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {

                    requestPermissions(new String[]{Manifest.permission.CAMERA}, 2);

                }else{
                    Log.e("permission force:", "Here you code if anyone check never and denied request of Camera");


                }
            }
        }else if (requestCode == 3) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) {
                if (shouldShowRequestPermissionRationale(Manifest.permission.READ_SMS)) {

                    requestPermissions(new String[]{Manifest.permission.READ_SMS}, 3);

                }else{
                    Log.e("permission force:", "Here you code if anyone check never and denied request of ReadSMS");


                }
            }
        }


    }

運行時權限API較為混亂的方面之一是,僅當在onRequestPermissionsResult()回調中獲得PERMISSION_DENIED時,才應使用shouldShowRequestPermissionRationale() 在其他地方這樣做可能會導致奇怪的行為。

最好的選擇是檢查所需的許可權,如果您的應用程序沒有許可權,則請求該許可權。 如果需要,在結果中處理拒絕。

您可能會發現此幫助程序庫更容易處理,因為它可以為您處理此問題,還可以幫助您的應用程序遵循針對ui的Google准則: https//github.com/hiqes/andele

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM