2017-07-14 81 views
3

檢查權限對話框出現一次又一次,儘管授予權限並單擊所有對話框,因爲接受它關閉應用程序。權限請求對話框多次出現android

我有一個幫助方法來檢查多個權限,看看他們中的任何一個都沒有被授予。

  public static boolean hasPermissions(Context context, String... permissions) { 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) { 
      for (String permission : permissions) { 
       if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { 
        return false; 
       } 
      } 
     } 
     return true; 
    } 
int PERMISSION_ALL = 1; 

     String[] PERMISSIONS = {Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.CAMERA}; 
     if(!hasPermissions(this, PERMISSIONS)){ 
      Log.d("permission","permission"); 
      ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL); 

     } 

我希望它在授予權限後加載相同的活動,即MainActivity。

任何人都可以指出爲什麼權限被詢問多次。

+0

您會收到兩個提示:一個'ACCESS_FINE_LOCATION',一個用於'CAMERA'。如果用戶沒有授予權限,那麼每次調用onCreate時都會詢問您的代碼。這是你所看到的,還是你看到別的東西? –

+0

我收到兩個提示:一個用於ACCESS_FINE_LOCATION,另一個用於CAMERA。我正在授予權限,但權限提示仍然會一次又一次地出現,如4次或5次,然後關閉應用程序。 – asifa

+0

是否有堆棧跟蹤? – Zoe

回答

1

類末到本黨,但給這個代碼嘗試

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { 
     } else { 
      requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 666); // Comment 26 
     } 
    } 

    onAvail(); 
    onLoad(); 
} 

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

    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    switch (requestCode) { 

     case 666: // User selected Allowed Permission Granted 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       Snackbar s = Snackbar.make(findViewById(android.R.id.content), "Permission Granted", Snackbar.LENGTH_LONG); 
       View snackbarView = s.getView(); 
       snackbarView.setBackgroundColor(Color.WHITE); 
       TextView textView = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text); 
       textView.setTextColor(Color.RED); 
       textView.setTextSize(18); 
       textView.setMaxLines(6); 
       s.show(); 

       // do your work here 

       // User selected the Never Ask Again Option Change settings in app settings manually 
      } else if (Build.VERSION.SDK_INT >= 23 && !shouldShowRequestPermissionRationale(permissions[0])) { 

       AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this, R.style.MyAlertDialogStyle); 
       alertDialogBuilder.setTitle("Change Permissions in Settings"); 
       alertDialogBuilder 
         .setMessage("Click SETTINGS to Manually Set\n\n" + "Permissions to use Database Storage") 
         .setCancelable(false) 
         .setPositiveButton("SETTINGS", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
           Uri uri = Uri.fromParts("package", getPackageName(), null); 
           intent.setData(uri); 
           startActivityForResult(intent, 1000); 
          } 
         }); 

       AlertDialog alertDialog = alertDialogBuilder.create(); 
       alertDialog.show(); 

      } else { 
       // User selected Deny Dialog to EXIT App ==> OR <== RETRY to have a second chance to Allow Permissions 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { 

       AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this, R.style.MyAlertDialogStyle); 
       alertDialogBuilder.setTitle("Second Chance"); 
       alertDialogBuilder 
         .setMessage("Click RETRY to Set Permissions to Allow\n\n" + "Click EXIT to the Close App") 
         .setCancelable(false) 
         .setPositiveButton("RETRY", new DialogInterface.OnClickListener() { 

          public void onClick(DialogInterface dialog, int id) { 
           Intent i = new Intent(MainActivity.this, MainActivity.class); 
           i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
           startActivity(i); 
          } 
         }) 
         .setNegativeButton("EXIT", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           finish(); 
           dialog.cancel(); 
          } 
         }); 
       AlertDialog alertDialog = alertDialogBuilder.create(); 
       alertDialog.show(); 
      } 
    } 
    break; 
    }}; 
0

只需檢查您在此處提及的權限 String [] PERMISSIONS = {Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.CAMERA};

應在清單文件中給出

+0

權限在清單文件中 – asifa

-1
Please do the following changes in the corresponding places. 

if (hasPermissions(this, PERMISSIONS)) { 
      // you have permissions 
      //Do your work.  
} 

replace **hasPermissions()** method with following code  

    public static boolean hasPermissions(Context context, String... permissions) { 
    int result; 
    List<String> listPermissionsNeeded = new ArrayList<>(); 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) { 
      for (String permission : permissions) { 
       result = ContextCompat.checkSelfPermission(context, permission); 
       if (result != PackageManager.PERMISSION_GRANTED) { 
        listPermissionsNeeded.add(permission); 
       } 
      } 
      if (!listPermissionsNeeded.isEmpty()) { 
       ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), PERMISSION_ALL); 
       return false; 
      } 
     } 
       return true; 
    } 

replace **onRequestPermissionsResult()** with following code 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, 
             int[] grantResults) { 
    Log.d("requestCode", String.valueOf(requestCode)); 
    switch (requestCode) { 
     case PERMISSION_ALL: { 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { 
       //Do your work. 
       Toast.makeText(MainActivity.this, "Permission Recieved", Toast.LENGTH_LONG).show(); 
      } else { 
       Toast.makeText(this, "Until you grant the permission, we cannot proceed further", Toast.LENGTH_SHORT).show(); 
      } 
     } 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
}