Android - Share on Facebook, Twitter, Mail, ecc

AndroidFacebookTwitterShare

Android Problem Overview


I need to develop an app that has the share function. I have to share on Facebook, twitter, email and maybe other services.

How can I do this? There a library on the net? For the iOS development there were ShareKit, but for Android?

Thanks :)

Android Solutions


Solution 1 - Android

Paresh Mayani's answer is mostly correct. Simply use a Broadcast Intent to let the system and all the other apps choose in what way the content is going to be shared.

To share text use the following code:

String message = "Text I want to share.";
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("text/plain");
share.putExtra(Intent.EXTRA_TEXT, message);

startActivity(Intent.createChooser(share, "Title of the dialog the system will open"));

Solution 2 - Android

yes you can ... you just need to know the exact package name of the application:

  • Facebook - "com.facebook.katana"
  • Twitter - "com.twitter.android"
  • Instagram - "com.instagram.android"
  • Pinterest - "com.pinterest"

And you can create the intent like this

Intent intent = context.getPackageManager().getLaunchIntentForPackage(application);
if (intent != null) {
     // The application exists
     Intent shareIntent = new Intent();
     shareIntent.setAction(Intent.ACTION_SEND);
     shareIntent.setPackage(application);
    
     shareIntent.putExtra(android.content.Intent.EXTRA_TITLE, title);
     shareIntent.putExtra(Intent.EXTRA_TEXT, description);
     // Start the specific social application
     context.startActivity(shareIntent);
} else {
    // The application does not exist
    // Open GooglePlay or use the default system picker
}

Solution 3 - Android

I think you want to give Share button, clicking on which the suitable media/website option should be there to share with it. In Android, you need to create createChooser for the same.

Sharing Text:

Intent sharingIntent = new Intent(Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, "This is the text that will be shared.");
startActivity(Intent.createChooser(sharingIntent,"Share using"));

Sharing binary objects (Images, videos etc.)

Intent sharingIntent = new Intent(Intent.ACTION_SEND);
Uri screenshotUri = Uri.parse(path);

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

FYI, above code are referred from Sharing content in Android using ACTION_SEND Intent

Solution 4 - Android

Use this

Facebook - "com.facebook.katana"
Twitter - "com.twitter.android"
Instagram - "com.instagram.android"
Pinterest - "com.pinterest"



SharingToSocialMedia("com.facebook.katana")


public void SharingToSocialMedia(String application) {

	Intent intent = new Intent();
	intent.setAction(Intent.ACTION_SEND);
	intent.setType("image/*");
	intent.putExtra(Intent.EXTRA_STREAM, bmpUri);

	boolean installed = checkAppInstall(application);
	if (installed) {
		intent.setPackage(application);
		startActivity(intent);
	} else {
		Toast.makeText(getApplicationContext(),
				"Installed application first", Toast.LENGTH_LONG).show();
	}

}


 private boolean checkAppInstall(String uri) {
    PackageManager pm = getPackageManager();
    try {
        pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
    }

    return false;
}

Solution 5 - Android

The ACTION_SEND will work correctly for all and it takes the Body of the text to wall in twitter, G mail.. but it fails For Face Book page... Its as known bug in the Facebook android SDK .. but still they haven't fixed it

Solution 6 - Android

This will help

1- First Define This Constants

 public static final String FACEBOOK_PACKAGE_NAME = "com.facebook.katana";
    public static final String TWITTER_PACKAGE_NAME = "com.twitter.android";
    public static final String INSTAGRAM_PACKAGE_NAME = "com.instagram.android";
    public static final String PINTEREST_PACKAGE_NAME = "com.pinterest";
    public static final String WHATS_PACKAGE_NAME =  "com.whatsapp";

2- Second Use This method

 public static void shareAppWithSocial(Context context, String application, String title, 
 String description) {

        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_SEND);
        intent.setPackage(application);

        intent.putExtra(android.content.Intent.EXTRA_TITLE, title);
        intent.putExtra(Intent.EXTRA_TEXT, description);
        intent.setType("text/plain");

        try {
            // Start the specific social application
            context.startActivity(intent);
        } catch (android.content.ActivityNotFoundException ex) {
            // The application does not exist
            Toast.makeText(context, "app have not been installed.", Toast.LENGTH_SHORT).show();
        }


    }

Solution 7 - Android

I think the following code will help....

public void btnShareClick(View v) {
	// shareBtnFlag = 1;
	Dialog d = new Dialog(DrawAppActivity.this);
	d.requestWindowFeature(d.getWindow().FEATURE_NO_TITLE);
	d.setCancelable(true);

	d.setContentView(R.layout.sharing);

	final Button btnFacebook = (Button) d.findViewById(R.id.btnFacebook);
	final Button btnEmail = (Button) d.findViewById(R.id.btnEmail);

	btnEmail.setOnClickListener(new OnClickListener() {

		public void onClick(View arg0) {
			if (!btnEmail.isSelected()) {
				btnEmail.setSelected(true);
			} else {
				btnEmail.setSelected(false);
			}
			saveBtnFlag = 1;
			// Check if email id is available-------------
			AccountManager manager = AccountManager
					.get(DrawAppActivity.this);
			Account[] accounts = manager.getAccountsByType("com.google");
			Account account = CommonFunctions.getAccount(manager);
			if (account.name != null) {
				emailSendingTask eTask = new emailSendingTask();
				eTask.execute();
				if (CommonFunctions.createDirIfNotExists(getResources()
						.getString(R.string.path)))

				{
					tempImageSaving(
							getResources().getString(R.string.path),
							getCurrentImage());
				}

				Intent sendIntent;
				sendIntent = new Intent(Intent.ACTION_SEND);
				sendIntent.setType("application/octet-stream");
				sendIntent.setType("image/jpeg");
				sendIntent.putExtra(Intent.EXTRA_EMAIL,
						new String[] { account.name });
				sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Drawing App");
				sendIntent.putExtra(Intent.EXTRA_TEXT, "Check This Image");
				sendIntent.putExtra(Intent.EXTRA_STREAM,
						Uri.parse("file://" + tempPath.getPath()));

				List<ResolveInfo> list = getPackageManager()
						.queryIntentActivities(sendIntent,
								PackageManager.MATCH_DEFAULT_ONLY);

				if (list.size() != 0) {

					startActivity(Intent.createChooser(sendIntent,
							"Send Email Using:"));

				}

				else {
					AlertDialog.Builder confirm = new AlertDialog.Builder(
							DrawAppActivity.this);
					confirm.setTitle(R.string.app_name);
					confirm.setMessage("No Email Sending App Available");
					confirm.setPositiveButton("Set Account",
							new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog,
										int which) {
									dialog.dismiss();
								}
							});
					confirm.show();
				}
			} else {
				AlertDialog.Builder confirm = new AlertDialog.Builder(
						DrawAppActivity.this);
				confirm.setTitle(R.string.app_name);
				confirm.setMessage("No Email Account Available!");
				confirm.setPositiveButton("Set Account",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog,
									int which) {
								Intent i = new Intent(
										Settings.ACTION_SYNC_SETTINGS);
								startActivity(i);
								dialog.dismiss();
							}
						});
				confirm.setNegativeButton("Cancel",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog,
									int which) {

								dialog.dismiss();
							}
						});
				confirm.show();
			}
		}

	});

	btnFacebook.setOnClickListener(new OnClickListener() {

		public void onClick(View arg0) {
			if (!btnFacebook.isSelected()) {
				btnFacebook.setSelected(true);
			} else {
				btnFacebook.setSelected(false);
			}
			saveBtnFlag = 1;
			// if (connection.isInternetOn()) {

			if (android.os.Environment.getExternalStorageState().equals(
					android.os.Environment.MEDIA_MOUNTED)) {
				getCurrentImage();
				Intent i = new Intent(DrawAppActivity.this,
						FaceBookAuthentication.class);
				i.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
				startActivity(i);
			}

			else {
				ShowAlertMessage.showDialog(DrawAppActivity.this,
						R.string.app_name, R.string.Sd_card,
						R.string.button_retry);
			}
		}
	});
	d.show();

}

public void tempImageSaving(String tmpPath, byte[] image) {
	Random rand = new Random();

	tempfile = new File(Environment.getExternalStorageDirectory(), tmpPath);
	if (!tempfile.exists()) {
		tempfile.mkdirs();
	}

	tempPath = new File(tempfile.getPath(), "DrawApp" + rand.nextInt()
			+ ".jpg");
	try {
		FileOutputStream fos1 = new FileOutputStream(tempPath.getPath());
		fos1.write(image);

		fos1.flush();
		fos1.close();

	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (Exception e) {
		e.printStackTrace();
	}
	sendBroadcast(new Intent(
			Intent.ACTION_MEDIA_MOUNTED,
			Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}

public byte[] getCurrentImage() {

	Bitmap b = drawingSurface.getBitmap();
	ByteArrayOutputStream stream = new ByteArrayOutputStream();
	b.compress(Bitmap.CompressFormat.PNG, 100, stream);

	byteArray = stream.toByteArray();

	return byteArray;
}

private class emailSendingTask extends AsyncTask<String, Void, String> {
	@Override
	protected void onPreExecute() {
		progressDialog = new ProgressDialog(DrawAppActivity.this);
		progressDialog.setTitle(R.string.app_name);
		progressDialog.setMessage("Saving..Please Wait..");
		// progressDialog.setIcon(R.drawable.icon);
		progressDialog.show();

	}

	@Override
	protected String doInBackground(String... urls) {

		String response = "";
		try {

			if (android.os.Environment.getExternalStorageState().equals(
					android.os.Environment.MEDIA_MOUNTED)) {

				response = "Yes";

			} else {
				ShowAlertMessage.showDialog(DrawAppActivity.this,
						R.string.app_name, R.string.Sd_card,
						R.string.button_retry);

			}

		} catch (Exception e) {

			e.printStackTrace();
		}

		return response;

	}

	@Override
	protected void onPostExecute(String result) {

		if (result.contains("Yes")) {
			getCurrentImage();

		}
		sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
				Uri.parse("file://"
						+ Environment.getExternalStorageDirectory())));

		progressDialog.cancel();
	}
}

private class ImageSavingTask extends AsyncTask<String, Void, String> {
	@Override
	protected void onPreExecute() {
		progressDialog = new ProgressDialog(DrawAppActivity.this);
		progressDialog.setTitle(R.string.app_name);
		progressDialog.setMessage("Saving..Please Wait..");
		// progressDialog.setIcon(R.drawable.icon);
		progressDialog.show();

	}

	@Override
	protected String doInBackground(String... urls) {

		String response = "";
		try {

			if (android.os.Environment.getExternalStorageState().equals(
					android.os.Environment.MEDIA_MOUNTED)) {

				response = "Yes";

			} else {
				ShowAlertMessage.showDialog(DrawAppActivity.this,
						R.string.app_name, R.string.Sd_card,
						R.string.button_retry);

			}

		} catch (Exception e) {

			e.printStackTrace();
		}

		return response;

	}

	@Override
	protected void onPostExecute(String result) {

		if (result.contains("Yes")) {
			getCurrentImage();

			if (CommonFunctions.createDirIfNotExists(getResources()
					.getString(R.string.path)))

			{
				saveImageInSdCard(getResources().getString(R.string.path),
						getCurrentImage());
			}
		}
		sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
				Uri.parse("file://"
						+ Environment.getExternalStorageDirectory())));

		progressDialog.cancel();
	}
}

For facebook application use facebook SDK

Solution 8 - Android

The ACTION_SEND will only give you options for sending using GMail, YahooMail... etc(Any application installed on your phone, that can perform ACTION_SEND). If you want to share on Facebook or Twitter you will need to place custom buttons for each and use their own SDK such as Facebook SDK or Twitter4J .

Solution 9 - Android

> Create Choose Editable

Intent sendIntent = new Intent(Intent.ACTION_SEND);
        	sendIntent.setType("text/plain");
        	sendIntent.putExtra(Intent.EXTRA_SUBJECT, "My application name");
        	String sAux = "\nLet me recommend you this application\n\n";
        	sAux = sAux + "https://play.google.com/store/apps/details?id=the.package.id \n\n";
        	sendIntent.putExtra(Intent.EXTRA_TEXT, sAux);
        	startActivity(Intent.createChooser(sendIntent, "choose one"));

==============================================================

> Create Choose Default

        	Intent sendIntent = new Intent(Intent.ACTION_SEND);
        	sendIntent.setType("text/plain");
        	sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
        	startActivity(sendIntent);

=================================================================

> Multi-Piece send

Send multiple pieces of content

To share multiple pieces of content, use the ACTION_SEND_MULTIPLE action together with a list of URIs pointing to the content. The MIME type varies according to the mix of content you're sharing. For example, if you share 3 JPEG images, the type is still "image/jpeg". For a mixture of image types, it should be "image/*" to match an activity that handles any type of image. You should only use "*/*" if you're sharing out a wide variety of types. As previously stated, it's up to the receiving application to parse and process your data. Here's an example:

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.."));

================================================================

> Share With Facebook

    ShareLinkContent shareLinkContent = new ShareLinkContent.Builder()
            .setQuote("Application of social rating share with your friend")
            .setContentUrl(Uri.parse("https://google.com"))
            .build();
    if (ShareDialog.canShow(ShareLinkContent.class)) {
        sd.show(shareLinkContent);
    }

==============================================================

> Share With SMS

    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.putExtra("Body", "Application of social rating share with your friend");
    intent.setType("vnd.android-dir/mms-sms");
    startActivity(intent);

==============================================================

> Share With Mail

    Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", "", null));
    emailIntent.putExtra(Intent.EXTRA_EMAIL, "Address");
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Application of social rating share with your friend");
    emailIntent.putExtra(Intent.EXTRA_TEXT, "Body");
    startActivity(Intent.createChooser(emailIntent, "Send Email..."));

=============================================================

> Share with WhatsApp

    Intent whatsappIntent = new Intent(Intent.ACTION_SEND);
    whatsappIntent.setType("text/plain");
    whatsappIntent.setPackage("com.whatsapp");
    whatsappIntent.putExtra(Intent.EXTRA_TEXT, "Application of social rating share with your friend");
    try {
        Objects.requireNonNull(getActivity()).startActivity(whatsappIntent);
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(getActivity(), "WhatsApp have not been installed.", Toast.LENGTH_SHORT).show();
    }

Solution 10 - Android

This will let you share your app on whats app etc:

try
			{ Intent i = new Intent(Intent.ACTION_SEND);  
			  i.setType("text/plain");
			  i.putExtra(Intent.EXTRA_SUBJECT, "My application name");
			  String sAux = "\nLet me recommend you this application\n\n";
			  sAux = sAux + "https://play.google.com/store/apps/details?id=Orion.Soft \n\n";
			  i.putExtra(Intent.EXTRA_TEXT, sAux);  
			  startActivity(Intent.createChooser(i, "choose one"));

Solution 11 - Android

String message = "This is testing."
Intent shareText = new Intent(Intent.ACTION_SEND);
shareText .setType("text/plain");
shareText .putExtra(Intent.EXTRA_TEXT, message);

startActivity(Intent.createChooser(shareText , "Title of the dialog the system will open"));

Solution 12 - Android

sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,"your subject" );
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, "your text");
startActivity(Intent.createChooser(sharingIntent, ""));

Solution 13 - Android

Share on Facebook

private ShareDialog shareDialog;

shareDialog = new ShareDialog((AppCompatActivity) context);
shareDialog.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>() {
    @Override
    public void onSuccess(Sharer.Result result) {
    	Log.e("TAG","Facebook Share Success");
        logoutFacebook();
    }

    @Override
    public void onCancel() {
        Log.e("TAG","Facebook Sharing Cancelled by User");
    }

    @Override
    public void onError(FacebookException error) {
        Log.e("TAG","Facebook Share Success: Error: " + error.getLocalizedMessage());
    }
});

if (ShareDialog.canShow(ShareLinkContent.class)) {
    ShareLinkContent linkContent = new ShareLinkContent.Builder()
            .setQuote("Content goes here")
            .setContentUrl(Uri.parse("URL goes here"))
            .build();
    shareDialog.show(linkContent);
}

AndroidManifest.xml

<!-- Facebook Share -->
<provider
    android:name="com.facebook.FacebookContentProvider"
    android:authorities="com.facebook.app.FacebookContentProvider{@string/facebook_app_id}"
    android:exported="true" />
<!-- Facebook Share -->

dependencies {
	implementation 'com.facebook.android:facebook-share:[5,6)' //Facebook Share
}

Share on Twitter

public void shareProductOnTwitter() {
    TwitterConfig config = new TwitterConfig.Builder(this)
            .logger(new DefaultLogger(Log.DEBUG))
            .twitterAuthConfig(new TwitterAuthConfig(getResources().getString(R.string.twitter_api_key), getResources().getString(R.string.twitter_api_secret)))
            .debug(true)
            .build();
    Twitter.initialize(config);

    twitterAuthClient = new TwitterAuthClient();

    TwitterSession twitterSession = TwitterCore.getInstance().getSessionManager().getActiveSession();

    if (twitterSession == null) {
        twitterAuthClient.authorize(this, new Callback<TwitterSession>() {
            @Override
            public void success(Result<TwitterSession> result) {
                TwitterSession twitterSession = result.data;
                shareOnTwitter();
            }

            @Override
            public void failure(TwitterException e) {
                Log.e("TAG","Twitter Error while authorize user " + e.getMessage());
            }
        });
    } else {
        shareOnTwitter();
    }
}

private void shareOnTwitter() {
    StatusesService statusesService = TwitterCore.getInstance().getApiClient().getStatusesService();
    Call<Tweet> tweetCall = statusesService.update("Content goes here", null, false, null, null, null, false, false, null);
    tweetCall.enqueue(new Callback<Tweet>() {
        @Override
        public void success(Result<Tweet> result) {
            Log.e("TAG","Twitter Share Success");
            logoutTwitter();
        }

        @Override
        public void failure(TwitterException exception) {
            Log.e("TAG","Twitter Share Failed with Error: " + exception.getLocalizedMessage());
        }
    });
}

Solution 14 - Android

Addition to the answer given by Ionut Negru, From Android 11 don't forget to add

<queries>

 ....        
 <package android:name="com.whatsapp" />
 <package android:name="com.whatsapp.w4b" />
 <package android:name="com.twitter.android" />
 <package android:name="com.facebook.katana" />

 </queries>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAndrea Mario LufinoView Question on Stackoverflow
Solution 1 - AndroidJanuszView Answer on Stackoverflow
Solution 2 - AndroidIonut NegruView Answer on Stackoverflow
Solution 3 - AndroidParesh MayaniView Answer on Stackoverflow
Solution 4 - AndroidSunil ChaudharyView Answer on Stackoverflow
Solution 5 - AndroidRAJESHView Answer on Stackoverflow
Solution 6 - AndroidIslam AlshnaweyView Answer on Stackoverflow
Solution 7 - AndroidRoboView Answer on Stackoverflow
Solution 8 - AndroidOvidiu LatcuView Answer on Stackoverflow
Solution 9 - AndroidPrince DholakiyaView Answer on Stackoverflow
Solution 10 - AndroidFarhad UllahView Answer on Stackoverflow
Solution 11 - AndroidAvanish SinghView Answer on Stackoverflow
Solution 12 - AndroidManju S BView Answer on Stackoverflow
Solution 13 - AndroidKetan RamaniView Answer on Stackoverflow
Solution 14 - AndroidHanryView Answer on Stackoverflow