Reputation: 7921
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 :)
Upvotes: 62
Views: 123015
Reputation: 5531
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>
Upvotes: 0
Reputation: 5763
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());
}
});
}
Upvotes: 0
Reputation: 3391
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();
}
Upvotes: 1
Reputation: 852
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();
}
}
Upvotes: 4
Reputation: 101
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, ""));
Upvotes: 0
Reputation: 288
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"));
Upvotes: 0
Reputation: 1247
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;
}
Upvotes: 6
Reputation: 189474
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"));
Upvotes: 88
Reputation: 128428
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
Upvotes: 28
Reputation: 34
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"));
Upvotes: 0
Reputation: 6314
yes you can ... you just need to know the exact package name of the application:
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
}
Upvotes: 37
Reputation: 281
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
Upvotes: 2
Reputation: 72321
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 .
Upvotes: 1
Reputation: 231
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
Upvotes: 4