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!

InformationsquelleAutor user3835673 | 2014-07-14