2017-04-25 91 views
0

在棉花糖中,運行時權限對話框在第一次拒絕權限時不會再次提示。 我有3個危險權限WRITE_EXTERNAL_STORAGE,READ_SMS & CAMERA權限。 任何人都可以告訴我我哪裏出錯了。MarshMallow權限對話框不會提示

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); 
       } 
      } 

     } 
    } 
+0

哪裏是你AlertDialog.Builder代碼? –

+0

是oncreate()中的代碼;? –

+0

onViewCreated of a fragment @Hasmukhkachhatiya –

回答

0

我認爲你必須使用

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

,而不是

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

使用此代碼,它可能會幫助你

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

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"); 


       } 
      } 
     } 


    } 
0

一個較爲混亂的方面運行時權限API是shouldShowRequestPermissionRationale()僅用於在onRequestPermissionsResult()回撥中獲得PERMISSION_DENIED。在其他地方這樣做會導致奇怪的行爲。

最好的辦法是檢查所需的權限並請求它,如果你的應用程序沒有它。如果需要,結果處理拒絕。

你會發現這個助手庫更容易處理,因爲它爲您處理此,還可以幫助你的應用程序遵循UI中的谷歌準則:https://github.com/hiqes/andele