web-dev-qa-db-fra.com

Comment utiliser "Partager une image avec" partage Intention de partager des images sous Android?

J'ai une application d'images dans cette application, j'ai placé toutes les images dans le dossier drawable-hdpi ..__ et j'ai appelé les images de mon activité comme suit:

private Integer[] imageIDs = {
        R.drawable.wall1, R.drawable.wall2,
        R.drawable.wall3, R.drawable.wall4,
        R.drawable.wall5, R.drawable.wall6,
        R.drawable.wall7, R.drawable.wall8,
        R.drawable.wall9, R.drawable.wall10
};

Alors maintenant, je veux savoir comment puis-je partager ces images à l'aide du partage d'intention que j'ai mis le code de partage comme ceci:

     Button shareButton = (Button) findViewById(R.id.share_button);
     shareButton.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {

        Intent sharingIntent = new Intent(Intent.ACTION_SEND);
        Uri screenshotUri = Uri.parse(Images.Media.EXTERNAL_CONTENT_URI + "/" + imageIDs);

        sharingIntent.setType("image/jpeg");
        sharingIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
        startActivity(Intent.createChooser(sharingIntent, "Share image using"));  

         }
    });

Et j'ai le bouton de partage aussi quand je clique sur le bouton de partage La boîte de partage est ouverte Mais quand je cliquai sur n'importe quel service, la plupart de ses crashs ou certains services disent: impossible d'ouvrir l'imageAlors comment je peux résoudre ce problème ou y en a-t-il autre code de format pour partager des images ???? 

Modifier :

J'ai essayé d'utiliser le code ci-dessous. Mais ça ne marche pas.

Button shareButton = (Button) findViewById(R.id.share_button);
     shareButton.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {

        Intent sharingIntent = new Intent(Intent.ACTION_SEND);
        Uri screenshotUri = Uri.parse("Android.resource://com.Android.test/*");
        try {
            InputStream stream = getContentResolver().openInputStream(screenshotUri);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        sharingIntent.setType("image/jpeg");
        sharingIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
        startActivity(Intent.createChooser(sharingIntent, "Share image using"));  

         }
    });

Si cela ne vous dérange pas, s'il vous plaît, corrigez mon code ci-dessus OR et donnez-moi un exemple correct. Comment partager mes images à partir du dossier drawable-hdpi 

66
Abhijeet
Bitmap icon = mBitmap;
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
icon.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
File f = new File(Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg");
try {
    f.createNewFile();
    FileOutputStream fo = new FileOutputStream(f);
    fo.write(bytes.toByteArray());
} catch (IOException e) {                       
        e.printStackTrace();
}
share.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/temporary_file.jpg"));
startActivity(Intent.createChooser(share, "Share Image"));
106
superM

La solution proposée par superM a fonctionné longtemps pour moi, mais récemment, je l’ai testée sur la version 4.2 (HTC One) et elle n’a plus fonctionné là-bas. Je suis conscient que c'est une solution de contournement, mais c'est le seul qui a fonctionné pour moi avec tous les appareils et toutes les versions. 

Selon la documentation, les développeurs sont invités à "utiliser le système MediaStore" pour envoyer du contenu binaire. Cela a toutefois l’avantage (ou moins) que le contenu multimédia sera sauvegardé de manière permanente sur le périphérique.

S'il s'agit d'une option pour vous, vous voudrez peut-être accorder l'autorisation WRITE_EXTERNAL_STORAGE et utiliser le MediaStore à l'échelle du système.

Bitmap icon = mBitmap;
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");

ContentValues values = new ContentValues();
values.put(Images.Media.TITLE, "title");
values.put(Images.Media.MIME_TYPE, "image/jpeg");
Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI,
        values);


OutputStream outstream;
try {
    outstream = getContentResolver().openOutputStream(uri);
    icon.compress(Bitmap.CompressFormat.JPEG, 100, outstream);
    outstream.close();
} catch (Exception e) {
    System.err.println(e.toString());
}

share.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(share, "Share Image"));
37
Sebastian Hojas

Ajouter d'abord la permission

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>

utiliser Bitmap de res

Bitmap b =BitmapFactory.decodeResource(getResources(),R.drawable.userimage);
            Intent share = new Intent(Intent.ACTION_SEND);
            share.setType("image/jpeg");
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            b.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
            String path = MediaStore.Images.Media.insertImage(getContentResolver(),
                    b, "Title", null);
            Uri imageUri =  Uri.parse(path);
            share.putExtra(Intent.EXTRA_STREAM, imageUri);
            startActivity(Intent.createChooser(share, "Select"));

Testé via Bluetooth et d'autres messagers

Fonctionne comme un charme.

20
Hemant Shori

Pour ce faire, le moyen le plus simple consiste à utiliser le MediaStore pour stocker temporairement l'image que vous souhaitez partager:

Drawable mDrawable = mImageView.getDrawable();
Bitmap mBitmap = ((BitmapDrawable) mDrawable).getBitmap();

String path = MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "Image Description", null);
Uri uri = Uri.parse(path);

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(intent, "Share Image"));

De: Partage de contenu avec intention

14
Kukiwon

Comment partager une image dans Android par programme, Parfois, vous souhaitez prendre un instantané de votre vue puis le partager alors suivez ces étapes: 1.Ajouter la permission au fichier mainfest 

<uses-permission    
   Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>

2.Tout d'abord, prenez une capture d'écran de votre vue, par exemple, il s'agit de ImageView, Textview, Framelayout, LinearLayout, etc. 

Par exemple, vous avez une vue d'image pour prendre une capture d'écran appeler cette méthode dans oncreate () 

 ImageView image= (ImageView)findViewById(R.id.iv_answer_circle);
     ///take a creenshot
    screenShot(image);

après avoir pris la méthode de partage d'image de la capture d'écran d'appel soit sur le bouton
cliquez ou où vous voulez

shareBitmap(screenShot(image),"myimage");

Après la méthode create, définissez ces deux méthodes ##

    public Bitmap screenShot(View view) {
    Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
            view.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);
    return bitmap;
}

//////// this method share your image
private void shareBitmap (Bitmap bitmap,String fileName) {
    try {
        File file = new File(getContext().getCacheDir(), fileName + ".png");
        FileOutputStream fOut = new FileOutputStream(file);
        bitmap.compress(CompressFormat.PNG, 100, fOut);
        fOut.flush();
        fOut.close();
        file.setReadable(true, false);
        final Intent intent = new Intent(     Android.content.Intent.ACTION_SEND);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
        intent.setType("image/png");
        startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }

}
11
Najaf Ali

Le code simple et le plus simple que vous pouvez utiliser pour partager des images de la galerie.

 String image_path;
            File file = new File(image_path);
            Uri uri = Uri.fromFile(file);
            Intent intent = new Intent(Intent.ACTION_SEND);
            intent .setType("image/*");
            intent .putExtra(Intent.EXTRA_STREAM, uri);
            context.startActivity(intent );
11
SANJAY GUPTA

Voici une solution qui a fonctionné pour moi. Un des pièges est que vous devez stocker les images dans un emplacement privé partagé ou non de l'application ( http://developer.Android.com/guide/topics/data/data-storage.html#InternalCache )

De nombreuses suggestions suggèrent de stocker dans l'emplacement de cache "privé" Apps, mais ceci n'est bien sûr pas accessible via d'autres applications externes, y compris l'intention de fichier de partage générique utilisée. Lorsque vous essayez ceci, il s’exécutera, mais par exemple, Dropbox vous indiquera que le fichier n’est plus disponible.

/ * ÉTAPE 1 - Enregistrez le fichier bitmap localement à l’aide de la fonction de sauvegarde de fichier ci-dessous. * /

localAbsoluteFilePath = saveImageLocally(bitmapImage);

/ * ÉTAPE 2 - Partager le chemin de fichier absolu non privé avec l'intention de partage du fichier * /

if (localAbsoluteFilePath!=null && localAbsoluteFilePath!="") {

    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    Uri phototUri = Uri.parse(localAbsoluteFilePath);

    File file = new File(phototUri.getPath());

    Log.d(TAG, "file path: " +file.getPath());

    if(file.exists()) {
        // file create success

    } else {
        // file create fail
    }
    shareIntent.setData(phototUri);
    shareIntent.setType("image/png");
    shareIntent.putExtra(Intent.EXTRA_STREAM, phototUri);
    activity.startActivityForResult(Intent.createChooser(shareIntent, "Share Via"), Navigator.REQUEST_SHARE_ACTION);
}   

/ * ENREGISTRER FONCTION IMAGE * /

    private String saveImageLocally(Bitmap _bitmap) {

        File outputDir = Utils.getAlbumStorageDir(Environment.DIRECTORY_DOWNLOADS);
        File outputFile = null;
        try {
            outputFile = File.createTempFile("tmp", ".png", outputDir);
        } catch (IOException e1) {
            // handle exception
        }

        try {
            FileOutputStream out = new FileOutputStream(outputFile);
            _bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.close();

        } catch (Exception e) {
            // handle exception
        }

        return outputFile.getAbsolutePath();
    }

/ * ÉTAPE 3 - Gestion du résultat de l’intention de fichier partagé. Besoin de fichier temporaire à distance, etc. * /

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

            // deal with this with whatever constant you use. i have a navigator object to handle my navigation so it also holds all mys constants for intents
        if (requestCode== Navigator.REQUEST_SHARE_ACTION) {
            // delete temp file
            File file = new File (localAbsoluteFilePath);
            file.delete();

            Toaster toast = new Toaster(activity);
            toast.popBurntToast("Successfully shared");
        }


    }   

J'espère que cela aide quelqu'un.

10
wired00

J'étais fatigué de chercher différentes options pour partager une vue ou une image de mon application avec d'autres applications. Et finalement j'ai la solution. 

Étape 1: Blocage de la gestion des intentions de partage. Cela fera apparaître votre fenêtre avec la liste des applications dans votre téléphone

public void share_bitMap_to_Apps() {

    Intent i = new Intent(Intent.ACTION_SEND);

    i.setType("image/*");
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    /*compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] bytes = stream.toByteArray();*/


    i.putExtra(Intent.EXTRA_STREAM, getImageUri(mContext, getBitmapFromView(relative_me_other)));
    try {
        startActivity(Intent.createChooser(i, "My Profile ..."));
    } catch (Android.content.ActivityNotFoundException ex) {

        ex.printStackTrace();
    }


}

Étape 2: Conversion de votre vue en BItmap

public static Bitmap getBitmapFromView(View view) {
    //Define a bitmap with the same size as the view
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(),      view.getHeight(), Bitmap.Config.ARGB_8888);
    //Bind a canvas to it
    Canvas canvas = new Canvas(returnedBitmap);
    //Get the view's background
    Drawable bgDrawable = view.getBackground();
    if (bgDrawable != null)
        //has background drawable, then draw it on the canvas
        bgDrawable.draw(canvas);
    else
        //does not have background drawable, then draw white background on the canvas
        canvas.drawColor(Color.WHITE);
    // draw the view on the canvas
    view.draw(canvas);
    //return the bitmap
    return returnedBitmap;
}

Étape 3 :

Pour obtenir l'URI à partir d'une image bitmap

public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}
7
AshisParajuli

Je viens d'avoir le même problème. 
Voici une réponse qui n’utilise pas de fichier explicite écrit dans votre code principal (laissant l’API la prendre en charge pour vous).

Drawable mDrawable = myImageView1.getDrawable();
Bitmap mBitmap = ((BitmapDrawable)mDrawable).getBitmap();
String path = MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "Image I want to share", null);
Uri uri = Uri.parse(path);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, "Share Image"));

C’est le chemin ... il vous suffit d’ajouter vos identifiants d’image dans un objet Drawable . Dans mon cas (code ci-dessus), le dessin était extrait d’un ImageView.

3
vianna77

La réponse SuperM a fonctionné pour moi mais avec Uri.fromFile () au lieu de Uri.parse ().

Avec Uri.parse (), cela ne fonctionnait qu'avec Whatsapp.

Ceci est mon code: 

sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(mFile));

Sortie de Uri.parse ():
/storage/émulated/0/Android/data/package_application/Files/17072015_0927.jpg

Sortie de Uri.fromFile:
file: ///storage/emulated/0/Android/data/application_package/Files/17072015_0927.jpg

3
cgr

ref: - http://developer.Android.com/training/sharing/send.html#send-multiple-content

ArrayList<Uri> imageUris = new ArrayList<Uri>();
imageUris.add(imageUri1); // Add your image URIs here
imageUris.add(imageUri2);

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, "Share images to.."));
3
Bikesh M Annur

essaye ça,

Uri imageUri = Uri.parse("Android.resource://your.package/drawable/fileName");
      Intent intent = new Intent(Intent.ACTION_SEND);
      intent.setType("image/png");

      intent.putExtra(Intent.EXTRA_STREAM, imageUri);
      startActivity(Intent.createChooser(intent , "Share"));
2
Ganpat Kaliya

Une solution parfaite pour partager du texte et des images via Intent est:

Sur votre bouton de partage, cliquez sur:

Bitmap image;
shareimagebutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            URL url = null;
            try {
                url = new URL("https://firebasestorage.googleapis.com/v0/b/fir-notificationdemo-dbefb.appspot.com/o/abc_text_select_handle_middle_mtrl_light.png?alt=media&token=c624ab1b-f840-479e-9e0d-6fe8142478e8");
                image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
            shareBitmap(image);
        }
    });

Ensuite, créez la méthode shareBitmap (image).

private void shareBitmap(Bitmap bitmap) {

    final String shareText = getString(R.string.share_text) + " "
            + getString(R.string.app_name) + " developed by "
            + "https://play.google.com/store/apps/details?id=" + getPackageName() + ": \n\n";

    try {
        File file = new File(this.getExternalCacheDir(), "share.png");
        FileOutputStream fOut = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
        fOut.flush();
        fOut.close();
        file.setReadable(true, false);
        final Intent intent = new Intent(Android.content.Intent.ACTION_SEND);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra(Intent.EXTRA_TEXT, shareText);
        intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
        intent.setType("image/png");
        startActivity(Intent.createChooser(intent, "Share image via"));

    } catch (Exception e) {
        e.printStackTrace();
    }

}

Et puis juste le tester .. !!

1
Devangi
Strring temp="facebook",temp="whatsapp",temp="instagram",temp="googleplus",temp="share";

    if(temp.equals("facebook"))
    {
        Intent intent = getPackageManager().getLaunchIntentForPackage("com.facebook.katana");
        if (intent != null) {

            Intent shareIntent = new Intent(Android.content.Intent.ACTION_SEND);
            shareIntent.setType("image/png");
            shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + "/sdcard/folder name/abc.png"));
            shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            shareIntent.setPackage("com.facebook.katana");
            startActivity(shareIntent);

        }
        else
        {
            Toast.makeText(MainActivity.this, "Facebook require..!!", Toast.LENGTH_SHORT).show();
        }
    }
    if(temp.equals("whatsapp"))
    {

        try {
            File filePath = new File("/sdcard/folder name/abc.png");
            final ComponentName name = new ComponentName("com.whatsapp", "com.whatsapp.ContactPicker");
            Intent oShareIntent = new Intent();
            oShareIntent.setComponent(name);
            oShareIntent.setType("text/plain");
            oShareIntent.putExtra(Android.content.Intent.EXTRA_TEXT, "Website : www.google.com");
            oShareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(filePath));
            oShareIntent.setType("image/jpeg");
            oShareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            MainActivity.this.startActivity(oShareIntent);


        } catch (Exception e) {
            Toast.makeText(MainActivity.this, "WhatsApp require..!!", Toast.LENGTH_SHORT).show();
        }
    }
    if(temp.equals("instagram"))
    {
        Intent intent = getPackageManager().getLaunchIntentForPackage("com.instagram.Android");
        if (intent != null)
        {
            File filePath =new File("/sdcard/folder name/"abc.png");
            Intent shareIntent = new Intent(Android.content.Intent.ACTION_SEND);
            shareIntent.setType("image");
            shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + "/sdcard/Chitranagari/abc.png"));
            shareIntent.setPackage("com.instagram.Android");
            startActivity(shareIntent);

        }
        else
        {
            Toast.makeText(MainActivity.this, "Instagram require..!!", Toast.LENGTH_SHORT).show();

        }
    }
    if(temp.equals("googleplus"))
    {

        try
        {

            Calendar c = Calendar.getInstance();
            SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
            String strDate = sdf.format(c.getTime());
            Intent shareIntent = ShareCompat.IntentBuilder.from(MainActivity.this).getIntent();
            shareIntent.setType("text/plain");
            shareIntent.putExtra(Intent.EXTRA_TEXT, "Website : www.google.com");
            shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + "/sdcard/folder name/abc.png"));
            shareIntent.setPackage("com.google.Android.apps.plus");
            shareIntent.setAction(Intent.ACTION_SEND);
            startActivity(shareIntent);
        }catch (Exception e)
        {
            e.printStackTrace();
            Toast.makeText(MainActivity.this, "Googleplus require..!!", Toast.LENGTH_SHORT).show();
        }
    }
    if(temp.equals("share")) {

        File filePath =new File("/sdcard/folder name/abc.png");  //optional //internal storage
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_TEXT, "Website : www.google.com");
        shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(filePath));  //optional//use this when you want to send an image
        shareIntent.setType("image/jpeg");
        shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        startActivity(Intent.createChooser(shareIntent, "send"));

    }
0
hardip

Toute la solution ci-dessus ne fonctionne pas pour moi dans Android Api 26 & 27 (Oreo), obtenait Error: exposed beyond app through ClipData.Item.getUri. La solution qui correspond à ma situation était 

  1. récupère le chemin uri en utilisant FileProvider.getUriForFile(Context,packagename,File) comme 
void shareImage() {
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("image/*");
        intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(this,getPackageName(),deleteFilePath));
        startActivity(Intent.createChooser(intent,"Share with..."));
    }
  1. Définissez un <provider> dans votre Manifest.xml comme
<provider
     Android:name="Android.support.v4.content.FileProvider"
     Android:authorities="com.example.stickerapplication"
      Android:exported="false"
      Android:grantUriPermissions="true">
      <meta-data
          Android:name="Android.support.FILE_PROVIDER_PATHS"
          Android:resource="@xml/file_paths">
       </meta-data>
</provider>
  1. Et la dernière étape consiste à définir le fichier resource pour vos répertoires
<paths xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <external-path name="external_files" path="." />
</paths>
*Note this solution is for `external storage` `uri`
0
Ali Tamoor

Tout d'abord , vous devez déclarer ce fournisseur de fichiers dans votre fichier AndroidManifest.xml dans la balise <application>:

<provider
    Android:name="Android.support.v4.content.FileProvider"
    Android:authorities="com.appsuite.fileprovider"
    Android:exported="false"
    Android:grantUriPermissions="true">
    <meta-data
        Android:name="Android.support.FILE_PROVIDER_PATHS"
        Android:resource="@xml/fileprovider" />
</provider>

Deuxièmement , créez un fichier XML fileprovider.xml dans le répertoire xml:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-files-path name="images" path="Pictures" />
</paths>

Enfin, codez par programme et partagez Uri avec votre application cible:

//  --------------------------  Share Image  -----------------------
private void shareImage() {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("image/*");

    intent.putExtra(Intent.EXTRA_STREAM, getShareUri());
    startActivity(Intent.createChooser(intent, "Share image using"));
}

private Uri getShareUri(){
    try {
        File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "share_image_" + System.currentTimeMillis() + ".png");
        if (file.createNewFile()) {
            FileChannel source = new FileInputStream(currentFile).getChannel();  // currentFile After edit image current sate
            FileChannel destination = new FileOutputStream(file).getChannel();

            destination.transferFrom(source, 0, source.size());
            source.close();
            destination.close();
        }

        sharedFileUri = FileProvider.getUriForFile(this, "com.appsuite.fileprovider", file);
        return sharedFileUri;

    }catch (Exception e){
        Log.e(TAG, "shareImage: error - " + e.getMessage(), e);
        return null;
    }
}

J'ai testé cela et ça fonctionne parfaitement d'API 19 à 28.

0
Hasib Akter