2

Dans mon application, j'ai créé un nom de classe Untility où j'ai créé le code pour obtenir l'autorisation de READ_EXTERNAL_STORAGE. Mais le problème est que lorsque je clique sur Refuser dans l'application, je ne trouve pas la notification d'alerte pour la réactiver. Initialement, j'ai l'option "Ne plus demander". Une fois que j'ai cliqué dessus, la boîte de dialogue désapparaît. et maintenant après l'exécution de l'application si je clique sur le refus, je ne peux plus trouver le message Dialog pour le faire autoriser à nouveau. Comment puis-je modifier mon code pour afficher ce message à chaque fois.Comment obtenir l'option "Ne jamais demander à nouveau" dans l'autorisation d'exécution

Mon utilitaire classe est

public class Utility { 

public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 123; 

@TargetApi(Build.VERSION_CODES.M) 
public static boolean checkPermission(final Context context) { 
    int currentAPIVersion = Build.VERSION.SDK_INT; 
    if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) { 
     if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
      if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.READ_EXTERNAL_STORAGE)) { 
       Log.v("TAG", "Permission is granted"); 
      } 
      else { 
       ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); 
      } 
      return false; 
     } else { 
      return true; 
     } 
    } else { 
     return true; 
    } 
} 

Mon autre classe ici, je fais appel à la classe utilitaire est

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case Utility.MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       if(userChoosenTask.equals("Take Photo")) 
        cameraIntent(); 
       else if(userChoosenTask.equals("Choose from Library")) 
        galleryIntent(); 

        //do something here 
      } else { 
       //code for deny 
       Toast.makeText(DetailMyColleague.this, "Permission Denied", Toast.LENGTH_SHORT).show(); 
      } 
      break; 
    } 
} 
private void selectImage() { 
    final CharSequence[] items = { "Take Photo", "Choose from Library", 
      "Cancel" }; 

    AlertDialog.Builder builder = new AlertDialog.Builder(DetailMyColleague.this); 
    builder.setTitle("Add Photo!"); 
    builder.setItems(items, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int item) { 
      boolean result=Utility.checkPermission(DetailMyColleague.this); 

      if (items[item].equals("Take Photo")) { 
       userChoosenTask ="Take Photo"; 
       if(result) 
        cameraIntent(); 

      } else if (items[item].equals("Choose from Library")) { 
       userChoosenTask ="Choose from Library"; 
       if(result) 
        galleryIntent(); 

      } else if (items[item].equals("Cancel")) { 
       dialog.dismiss(); 
      } 
     } 
    }); 
    builder.show(); 
} 
private void galleryIntent() 
{ 
    Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT);// 
    startActivityForResult(Intent.createChooser(intent, "Select File"),SELECT_FILE); 
} 
private void cameraIntent() 
{ 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(intent, REQUEST_CAMERA); 
} 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == Activity.RESULT_OK) { 
     if (requestCode == SELECT_FILE) 
      onSelectFromGalleryResult(data); 
     else if (requestCode == REQUEST_CAMERA) 
      onCaptureImageResult(data); 
    } 
} 

private void onCaptureImageResult(Intent data) { 
    Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bytes); 

    File destination = new File(Environment.getExternalStorageDirectory(), 
      System.currentTimeMillis() + ".jpg"); 

    FileOutputStream fo; 
    try { 
     destination.createNewFile(); 
     fo = new FileOutputStream(destination); 
     fo.write(bytes.toByteArray()); 
     fo.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    profilePic.setImageBitmap(thumbnail); 
} 
@SuppressWarnings("deprecation") 
private void onSelectFromGalleryResult(Intent data) { 

    Bitmap bm=null; 
    if (data != null) { 
     try { 
      bm = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    profilePic.setImageBitmap(bm); 
} 

Répondre

1

Vous ne pouvez pas afficher le même message de demande une fois qu'ils disent "ne plus demander", mais vous pouvez vérifier la permission, et si refusé, afficher une boîte de dialogue personnalisée qui les dirige vers la page de paramètres avec une intention:

startActivityForResult(new Intent(android.provider.Settings.ACTION_SETTINGS), 0); 

Si vous cochez autorisation tombe en panne:

if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
    // show a dialog 
    new AlertDialog.Builder(this).setMessage("You need to enable permissions to use this feature").setPositiveButton("Go to settings", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      // navigate to settings 
      startActivityForResult(new Intent(android.provider.Settings.ACTION_SETTINGS), 0); 
     } 
    }).setNegativeButton("Go back", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      // leave? 
      MyActivity.this.onBackPressed(); 
     } 
    }).show(); 
} 
+0

où puis-je écrire cette ligne. Je suis désolé je suis nouveau dans androind développement –

+0

J'ai mis à jour ma réponse – anomeric

+0

Je reçois beaucoup d'erreur, comme MyActivity.this.onBackPressed(); startActivityForResult –

0

Comment puis-je modifier mon code pour montrer thi message à chaque fois.

Vous ne pouvez pas. Si l'utilisateur a coché "Ne plus demander", l'utilisateur ne peut accorder cette autorisation que via l'application "Paramètres". Une fois que l'utilisateur a coché "ne pas demander à nouveau" et refuse l'autorisation, vous ne pouvez pas afficher la boîte de dialogue d'autorisation pour toute autorisation dans ce groupe d'autorisations.

+0

ok Puis-je le faire manuellement dans l'émulateur ou le téléphone, pour le montrer de nouveau –

+0

@ktina: En tant qu'utilisateur, vous pouvez aller dans Paramètres> Applications, trouver votre application, cliquer sur "Permissions", et accorder la permission. Je ne connais aucun moyen pour vous de revenir à l'état "ne pas demander à nouveau", sinon en désinstallant complètement l'application. – CommonsWare

0

La case à cocher "ne pas demander" est visible après plus d'un code par nier la permission. Si vous cochez "Ne plus demander" et cliquez sur Refuser, l'autorisation sera automatiquement refusée. Si vous souhaitez effectuer une nouvelle sélection, accédez à la page "Informations sur l'application" de votre application et effacez le stockage des données de votre application. Maintenant, si vous revenez dans votre application et demandez à nouveau la permission. Ensuite, la boîte de dialogue d'autorisation par défaut s'affiche. Vous pouvez voir la documentation here.