Android: Comment utiliser grantUriPermission pour être en mesure de créer et d'envoyer un e-mail avec une image de la pièce jointe
De dans mon application, je suis en train de créer un e-mail qui contient une image contenue dans un objet bitmap.
private void sendEmailWithBitmapAttached(){
final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setType("plain/text");
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Email Subject");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Email Body");
emailIntent.setType("image/png");
ContentResolver cr = getContentResolver();
//insert the image and create a path
String imageBitmapPath = MediaStore.Images.Media.insertImage(cr, bitmapForEmail,"title", "description");
//create a uri
Uri imageUri = Uri.parse(imageBitmapPath);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
//send the email
startActivity(Intent.createChooser(emailIntent, "Send mail..."));
}
Cela fonctionne bien dans Android 2.3.
Mais en utilisant les versions ultérieures, il génère l'erreur suivante:
07-13 23:01:01.252: E/MediaStore(5194): Failed to insert image
07-13 23:01:01.252: E/MediaStore(5194): java.lang.SecurityException:
Permission Denial:
writing com.android.providers.media.MediaProvider
uri content://media/external/images/media from
pid=5194, uid=10151 requires
android.permission.WRITE_EXTERNAL_STORAGE,
or grantUriPermission()
Donc, en prenant la suggestion de message d'erreur, j'ai essayé de grantUriPermission.
grantUriPermission(String toPackage, Uri uri, int modeFlags)
Mais je ne sais pas quoi mettre pour toPackage ou uri
Mais encore une fois, en utilisant le message d'erreur, j'ai modifié le code comme suit:
private void sendEmailWithBitmapAttached(){
final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setType("plain/text");
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Email Subject");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Email Body");
emailIntent.setType("image/png");
ContentResolver cr = getContentResolver();
//create a Uri for the content provider suggested by the error message
Uri uri = Uri.parse("content://media/external/images/media");
//create a package provider string suggested by the error messge.
String provider = "com.android.providers.media.MediaProvider";
//grant all three uri permissions!
grantUriPermission(provider, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
grantUriPermission(provider, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
grantUriPermission(provider, uri, Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
//insert the image and create a path
String imageBitmapPath = MediaStore.Images.Media.insertImage(cr, bitmapForEmail,"title", "description");
//create a uri
Uri imageUri = Uri.parse(imageBitmapPath);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
//send the email
startActivity(Intent.createChooser(emailIntent, "Send mail..."));
}
Et j'ai exactement la même erreur.
Peut une âme charitable merci de me donner un indice que la façon de prendre soin de grantUriPermission de l'uri et le fournisseur articles? Est-ce la bonne démarche?
Merci beaucoup pour TOUTE aide, de conseil, de guides, ou suggestion, vous pouvez fournir!
Vous devez vous connecter pour publier un commentaire.
Essayez d'inclure dans votre AndroidManifest.xml.
Sur Android 6.0+ l'autorisation doit être accordée par l'utilisateur à l'application, sinon cela va lancer la SecurityException.
Pour ce faire, allez dans Paramètres/Applications/[Nom]/Autorisations et de permettre le Stockage de l'Autorisation.
J'ai eu un problème similaire. Ci-dessous comment j'ai résolu le problème pour mon projet. Vous devriez être en mesure d'adapter votre solution. Cette solution a aussi quelques Firebase code, que vous pouvez ignorer. Les points clés sont ActivityCompat.requestPermissions et ActivityCompat.checkSelfPermission:
J'ai résolu mon problème en ajoutant aussi la permission des drapeaux à l'intention, comme ceci:
Plus de détails peuvent être trouvés dans la documentation:
https://developer.android.com/reference/android/support/v4/content/FileProvider.html#Permissions