Share image and text through Whatsapp or Facebook
Asked Answered
P

12

30

I have in my app a share button and i want to share an image and a text at the same time. In GMail it works fine but in WhatsApp, only the image is sent and in Facebook the app crashes.

The code i use to share is this:

Intent shareIntent = new Intent(Intent.ACTION_SEND);  
shareIntent.setType("image/*");
shareIntent.putExtra(Intent.EXTRA_TEXT, "Message");         

Uri uri = Uri.parse("android.resource://" + getPackageName() + "/drawable/ford_focus_2014");
     try {
        InputStream stream = getContentResolver().openInputStream(uri);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

shareIntent.putExtra(Intent.EXTRA_STREAM, uri);

If I use "shareIntent.setType("*/ *")" Facebook and WhatsApp crashes.

Is there some way to do this? Maybe sent two messages by separate at the same time (WhatsApp).

Thanks in advance.

Pandowdy answered 15/4, 2014 at 7:36 Comment(2)
possible duplicate of Android How to send text and images or any object using intent?Lulu
This link have a lot of examples about this github.com/codepath/android_guides/wiki/…Embellishment
S
31

Please try the below code and hopefully it will work.

    Uri imgUri = Uri.parse(pictureFile.getAbsolutePath());
    Intent whatsappIntent = new Intent(Intent.ACTION_SEND);
    whatsappIntent.setType("text/plain");
    whatsappIntent.setPackage("com.whatsapp");
    whatsappIntent.putExtra(Intent.EXTRA_TEXT, "The text you wanted to share");
    whatsappIntent.putExtra(Intent.EXTRA_STREAM, imgUri);
    whatsappIntent.setType("image/jpeg");
    whatsappIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    try {
        activity.startActivity(whatsappIntent);
    } catch (android.content.ActivityNotFoundException ex) {
        ToastHelper.MakeShortText("Whatsapp have not been installed.");
    }
Stratocumulus answered 15/4, 2014 at 7:48 Comment(8)
Check the answer below, it makes sharing both possible.Pitching
@ShaniGoriwal I have a custom listview of the apps where we can share data, but how can i share data using the getLaunchIntentForPackage(String pckg)?Pindling
Can be sent through passing Intent.EXTRA_STREAM, imageUriMyer
@ShaniGoriwal To share image i used "image/*" or "image/specific_format" from android drawable . I am getting "File Format is not supported" error. Is there need to set any permission or to do something more?Mammillary
Not really. You can send the image and text together in the intent it is possible, You can check inshorts app doing it.Bimbo
if sharing image with text is not possible on whatsapp, how the app like flipkat and amazon does? i tried bellow code but it is not workingWhinny
the answer below says otherwise and is correct! it should be upTolerance
I am using image url from my backend, it says, the file format is not supported for whatsapp.Mabe
L
39

Currently Whatsapp supports Image and Text sharing at the same time. (Nov 2014).

Here is an example of how to do this:

    /**
     * Show share dialog BOTH image and text
     */
    Uri imageUri = Uri.parse(pictureFile.getAbsolutePath());
    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    //Target whatsapp:
    shareIntent.setPackage("com.whatsapp");
    //Add text and then Image URI
    shareIntent.putExtra(Intent.EXTRA_TEXT, picture_text);
    shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
    shareIntent.setType("image/jpeg");
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    try {
        startActivity(shareIntent);
    } catch (android.content.ActivityNotFoundException ex) {
        ToastHelper.MakeShortText("Whatsapp have not been installed.");
    }
Lea answered 6/11, 2014 at 12:52 Comment(6)
and for video with text?Zealous
I tried above code it is not working,it showing "sharing failed, please try again later".Whinny
Works! Can we have separate caption for each image?Retral
Uri.parse(pictureFile.getAbsolutePath()) will throw exception on marshmallow and later as you need to declare your FileProvider inside the Manifest.xml file then call it link this: Uri imageUri = FileProvider.getUriForFile( context, context.getPackageName() + ".provider", new File(pictureFile.getAbsolutePath()))Liquesce
Is there any similar option for PHP?Bitterling
How to use this when the number is not saved in the contaacts?Tactful
S
31

Please try the below code and hopefully it will work.

    Uri imgUri = Uri.parse(pictureFile.getAbsolutePath());
    Intent whatsappIntent = new Intent(Intent.ACTION_SEND);
    whatsappIntent.setType("text/plain");
    whatsappIntent.setPackage("com.whatsapp");
    whatsappIntent.putExtra(Intent.EXTRA_TEXT, "The text you wanted to share");
    whatsappIntent.putExtra(Intent.EXTRA_STREAM, imgUri);
    whatsappIntent.setType("image/jpeg");
    whatsappIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    try {
        activity.startActivity(whatsappIntent);
    } catch (android.content.ActivityNotFoundException ex) {
        ToastHelper.MakeShortText("Whatsapp have not been installed.");
    }
Stratocumulus answered 15/4, 2014 at 7:48 Comment(8)
Check the answer below, it makes sharing both possible.Pitching
@ShaniGoriwal I have a custom listview of the apps where we can share data, but how can i share data using the getLaunchIntentForPackage(String pckg)?Pindling
Can be sent through passing Intent.EXTRA_STREAM, imageUriMyer
@ShaniGoriwal To share image i used "image/*" or "image/specific_format" from android drawable . I am getting "File Format is not supported" error. Is there need to set any permission or to do something more?Mammillary
Not really. You can send the image and text together in the intent it is possible, You can check inshorts app doing it.Bimbo
if sharing image with text is not possible on whatsapp, how the app like flipkat and amazon does? i tried bellow code but it is not workingWhinny
the answer below says otherwise and is correct! it should be upTolerance
I am using image url from my backend, it says, the file format is not supported for whatsapp.Mabe
B
9

For sharing text and image on WhatsApp, more controlled version of code is below, you can add more methods for sharing with Twitter, Facebook ...

public class IntentShareHelper {

    public static void shareOnWhatsapp(AppCompatActivity appCompatActivity, String textBody, Uri fileUri) {
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("text/plain");
        intent.setPackage("com.whatsapp");
        intent.putExtra(Intent.EXTRA_TEXT,!TextUtils.isEmpty(textBody) ? textBody : "");

        if (fileUri != null) {
            intent.putExtra(Intent.EXTRA_STREAM, fileUri);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setType("image/*");
        }

        try {
            appCompatActivity.startActivity(intent);
        } catch (android.content.ActivityNotFoundException ex) {
            ex.printStackTrace();
            showWarningDialog(appCompatActivity, appCompatActivity.getString(R.string.error_activity_not_found));
        }
    }

    public static void shareOnTwitter(AppCompatActivity appCompatActivity, String textBody, Uri fileUri){...}

    private static void showWarningDialog(Context context, String message) {
        new AlertDialog.Builder(context)
                .setMessage(message)
                .setNegativeButton(context.getString(R.string.close), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .setCancelable(true)
                .create().show();
    }
}

For getting Uri from File, use below class:

public class UtilityFile {
    public static @Nullable Uri getUriFromFile(Context context, @Nullable File file) {
        if (file == null)
            return null;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            try {
                return FileProvider.getUriForFile(context, "com.my.package.fileprovider", file);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        } else {
            return Uri.fromFile(file);
        }
    }

    // Returns the URI path to the Bitmap displayed in specified ImageView       
    public static Uri getLocalBitmapUri(Context context, ImageView imageView) {
        Drawable drawable = imageView.getDrawable();
        Bitmap bmp = null;
        if (drawable instanceof BitmapDrawable) {
            bmp = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
        } else {
            return null;
        }
        // Store image to default external storage directory
        Uri bmpUri = null;
        try {
            // Use methods on Context to access package-specific directories on external storage.
            // This way, you don't need to request external read/write permission.
            File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "share_image_" + System.currentTimeMillis() + ".png");
            FileOutputStream out = new FileOutputStream(file);
            bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.close();

            bmpUri = getUriFromFile(context, file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bmpUri;
    }    
}

For writing FileProvider, use this link: https://github.com/codepath/android_guides/wiki/Sharing-Content-with-Intents

Bugaboo answered 24/2, 2017 at 9:37 Comment(1)
what if we just got the bitmap from on the fly #27836107 Could we attach this too ? Coz i dont want to mess writing file insidedirectory......Dumah
L
2

As of now, a Whatsapp Intent supports image and text:

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_TEXT,title + "\n\nLink : " + link );
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(sharePath));
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, "Share image via:"));

The image will be as it is and EXTRA_TEXT will be shown as the caption.

Lulu answered 17/11, 2014 at 11:44 Comment(2)
Working as of Feb 2016Vigil
what if i want to share to the non-saved contact ? is it possible?Dumah
B
1

try with this code

    Uri imageUri = Uri.parse(Filepath);
    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.setPackage("com.whatsapp");
    shareIntent.putExtra(Intent.EXTRA_TEXT, "My sample image text");
    shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
    shareIntent.setType("image/jpeg");
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    
    try {
        startActivity(shareIntent);
    } catch (android.content.ActivityNotFoundException ex) {
        ToastHelper.MakeShortText("Kindly install whatsapp first");
    }
Bibliopegy answered 30/6, 2016 at 3:40 Comment(1)
Thank you for this code snippet, which may provide some immediate help. A proper explanation would greatly improve its educational value by showing why this is a good solution to the problem, and would make it more useful to future readers with similar, but not identical, questions. Please edit your answer to add explanation, and give an indication of what limitations and assumptions apply.Dekameter
A
0
public void shareIntentSpecificApps(String articleName, String articleContent, String imageURL) {
    List<Intent> intentShareList = new ArrayList<Intent>();
    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.setType("text/plain");
    //shareIntent.setType("image/*");
    List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(shareIntent, 0);

    for (ResolveInfo resInfo : resolveInfoList) {
        String packageName = resInfo.activityInfo.packageName;
        String name = resInfo.activityInfo.name;
        Log.d("System Out", "Package Name : " + packageName);
        Log.d("System Out", "Name : " + name);

        if (packageName.contains("com.facebook") ||
                packageName.contains("com.whatsapp")) {


            Intent intent = new Intent();
            intent.setComponent(new ComponentName(packageName, name));
            intent.setAction(Intent.ACTION_SEND);
            intent.setType("text/plain");
            intent.putExtra(Intent.EXTRA_SUBJECT, articleName);
            intent.putExtra(Intent.EXTRA_TEXT, articleName + "\n" + articleContent);
            Drawable dr = ivArticleImage.getDrawable();
            Bitmap bmp = ((GlideBitmapDrawable) dr.getCurrent()).getBitmap();
            intent.putExtra(Intent.EXTRA_STREAM, getLocalBitmapUri(bmp));
            intent.setType("image/*");
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intentShareList.add(intent);
        }
    }

    if (intentShareList.isEmpty()) {
        Toast.makeText(ArticleDetailsActivity.this, "No apps to share !", Toast.LENGTH_SHORT).show();
    } else {
        Intent chooserIntent = Intent.createChooser(intentShareList.remove(0), "Share Articles");
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentShareList.toArray(new Parcelable[]{}));
        startActivity(chooserIntent);
    }
}

You can share image also I have done in my app like mentioned in above code.

Auspicate answered 23/4, 2018 at 23:27 Comment(0)
W
0

Use this code for sharing on whatsapp or on another package with image and video. Here the URI is the path of image. If image in Memory then it took fast loading and if you are using url then sometimes images don't load and links gone direct.

shareBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    uri1=Uri.parse(Paths+File.separator+Img_name);
                    Intent intent=new Intent(Intent.ACTION_SEND);
                    intent.setType("image/*");
                    //intent.putExtra(intent.EXTRA_SUBJECT,"Insert Something new");
                    String data = "Hello";
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    intent.putExtra(Intent.EXTRA_TEXT,data);
                    intent.putExtra(Intent.EXTRA_STREAM,uri1);
                    intent.setPackage("com.whatsapp");

                    startActivity(intent);

                    // end Share code
                }

If this code is not understandable then see the full code in my other answer.

Wandering answered 28/8, 2018 at 9:53 Comment(0)
W
0

My second answer for this question is: I'm pasting full code here because new developer need sometimes full code.

public class ImageSharer extends AppCompatActivity {
    private ImageView imgView;
    private Button shareBtn;
    FirebaseStorage fs;
    StorageReference sr,sr1;
    String Img_name;
    File dir1;
    Uri uri1;



    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.app_sharer);
        imgView = (ImageView) findViewById(R.id.imgView);
        shareBtn = (Button) findViewById(R.id.shareBtn);

        // Initilize firebasestorage instance
        fs=FirebaseStorage.getInstance();
        sr=fs.getReference();
        Img_name="10.jpg";
        sr1=sr.child("shiva/"+Img_name);
        final String Paths= Environment.getExternalStorageDirectory()+ File.separator+"The_Bhakti"+File.separator+"Data";
dir1=new File(Paths);
if(!dir1.isDirectory())
{
    dir1.mkdirs();
}
   sr1.getFile(new File(dir1,Img_name)).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
       @Override
       public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
           sr1.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
               @Override
               public void onSuccess(Uri uri) {
                   uri1= Uri.parse(uri.toString());
               }
           });

       }
   }) ;

        shareBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                uri1=Uri.parse(Paths+File.separator+Img_name);
                Intent intent=new Intent(Intent.ACTION_SEND);
                intent.setType("image/*");
                //intent.putExtra(intent.EXTRA_SUBJECT,"Insert Something new");
                String data = "Hello";
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                intent.putExtra(Intent.EXTRA_TEXT,data);
                intent.putExtra(Intent.EXTRA_STREAM,uri1);
                intent.setPackage("com.whatsapp");
                // for particular choose we will set getPackage()
                /*startActivity(intent.createChooser(intent,"Share Via"));*/// this code use for universal sharing
                startActivity(intent);

                // end Share code
            }
        });

    }// onCreate closer
}
Wandering answered 28/8, 2018 at 10:6 Comment(0)
G
0

Actually. it is possible to send image and text through WhatsApp by downloading the image to device external storage and then share the image to WhatsApp.

if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {

    Bitmap bm = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
    Intent intent = new Intent(Intent.ACTION_SEND);
    String share_text = "image and text";
    intent.putExtra(Intent.EXTRA_TEXT, notification_share);
    String path = MediaStore.Images.Media.insertImage(MainActivity.this.getContentResolver(), bm, "", null);
    Uri screenshotUri = Uri.parse(path);

    intent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
    intent.setType("image/*");
    startActivity(Intent.createChooser(intent, "Share image via..."));
} else {
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
//The above code works perfect need to show image in an imageView
Geisler answered 19/9, 2018 at 6:20 Comment(0)
F
0

This worked for me in January 2019

 private void shareIntent() {

        Bitmap imgBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
        String imgBitmapPath = MediaStore.Images.Media.insertImage(getContentResolver(),imgBitmap,"title",null);
        Uri imgBitmapUri = Uri.parse(imgBitmapPath);

        Intent shareIntent = new Intent(Intent.ACTION_SEND);
        shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        shareIntent.putExtra(Intent.EXTRA_STREAM,imgBitmapUri);
        shareIntent.setType("image/png");
        shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        shareIntent.putExtra(Intent.EXTRA_TEXT, "My Custom Text ");
        shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject text");
        startActivity(Intent.createChooser(shareIntent, "Share this"));
    }

This will let the user share the image + text to WhatsApp and all other apps the user wants, it's always the best to let the user select where to share the content instead of prompting just WhatsApp.

Also make sure that if you include just WhatsApp to share it might not be installed in some devices, for this you will need a try catch and inside of it the startActivity(intent); and also set the package of the intent to just WhatsApp with intent.setPackage("com.whatsapp").

Fortyfive answered 25/1, 2019 at 18:24 Comment(0)
M
0

This works:

    <activity android:name="com.selcuksoydan.sorucevap.Main">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="image/*" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

        soru_image = (ImageView) soruView.findViewById(R.id.soru_image);
       soru_image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    v.buildDrawingCache();
                    Bitmap bitmap =   v.getDrawingCache();
                    String root = Environment.getExternalStorageDirectory().toString();
                    File myDir = new File(root + "/SoruCevap");
                    Random generator = new Random();
                    int n = 10000;
                    n = generator.nextInt(n);
                    String fname = "Image-" + n + ".jpg";
                    File file = new File(myDir, fname);
                    if (file.exists()) file.delete();
                    try {
                        FileOutputStream out = new FileOutputStream(file);
                        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
                        out.flush();
                        out.close();
                    } catch (Exception ex) {
                        //ignore
                    }
                    Intent waIntent = new Intent(Intent.ACTION_SEND);
                    waIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    waIntent.setType("image/*");
                    waIntent.setPackage("com.whatsapp");
                    waIntent.putExtra(android.content.Intent.EXTRA_STREAM, Uri.fromFile(file));
                    getContext().startActivity(Intent.createChooser(waIntent, "Share with"));
                } catch (Exception e) {
                    Log.e("Error on sharing", e + " ");
                    Toast.makeText(getContext(), "App not Installed", Toast.LENGTH_SHORT).show();
                }
Mcdaniel answered 20/2, 2019 at 18:28 Comment(0)
A
-1
  1. Copy text from anywhere.let it be Google, Facebook or whatsapo itself

  2. attempt to upload the image in whatsapp anywhere.at contact or group.before you hit the send image arrow... you will see caption option to that image... touch and hold, a paste option will appear.hit paste... your text will show up... then you can send the photo.and it will appear with the text you wanted... there you go... you have the text and image in it... the only problem will be the text size, which is limited to certain number of words

😀 This works for Android users only

Allow answered 17/8, 2016 at 7:32 Comment(2)
Thanks bro 👍👏👏👏Allow
While this might be a valuable hint to solve the problem, a good answer also demonstrates the solution. Please edit to provide example code to show what you mean. Alternatively, consider writing this as a comment instead.Dekameter

© 2022 - 2024 — McMap. All rights reserved.