2017-04-25 93 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