Sharing images and text with Facebook on Android Sharing images and text with Facebook on Android android android

Sharing images and text with Facebook on Android


Why? Because they are Facebook and can permit to themselves such bugs.So, they expect only images upon type is "image/". If the type is "text/plain"-then a URL should be contained in the message. Don't use .setType("/*");Otherwise use their SDK. But in this case you'll sacrifice simplicity and flexibility of your application.


Solution to the following highlighted problems.

Please attach only photos or a single video.

Facebook isn't in the Share option Dialog

even if Facebook wall appears, then it won't let you open your image on the front page.

Share an image on Facebook without using Facebook SDK

I got lucky after searching for three days constantly. Sorry, The answer might be lengthy, because I found no solution on StackOverflow that could share an image on Facebook without using Facebook SDK.

Here is the full and perfect solution:

Bitmap bitmap = viewToBitmap(load your image OR layout background for your imageView);shareImage(bitmap, "com.facebook.katana");

The first parameter is the imageView/layout for the images that are loaded into the bitmap. The second parameter is the facebook's package name.

Then code the following Method as shown.

public void shareImage(Bitmap bitmap, String packageName) {        try {            File file = new File(this.getExternalCacheDir(), "temp.png");            FileOutputStream fileOutputStream = new FileOutputStream(file);            bitmap.compress(Bitmap.CompressFormat.PNG, 95, fileOutputStream);            fileOutputStream.flush();            fileOutputStream.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/*");            intent.setPackage(packageName);            startActivity(Intent.createChooser(intent, "Share image on facebook"));        } catch (Exception e) {            Log.e(TAG, e.toString());            Toast.makeText(this, "Error while sharing Image on Facebook", Toast.LENGTH_SHORT).show();        }    }

Here're my app Screenshots:

1. "Quote book App" is loading a picture with a quote on it.

2. Click the share button and click on Facebook from the dialog.

3. Facebook sharing options dialog appears.

4. Image loaded to the Facebook front page.

5. Finally the Image is shared on Facebook And the method is working properly as we expected.

PS: You can check out this functionality in my app, Here's the Link to download it from google play store.


There is only one solution you can create the bitmap of text and image using canvas and share it on facebook. (Download source code here)

Here is my code:

activity_main

 <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff"xmlns:android="http://schemas.android.com/apk/res/android"><EditText    android:id="@+id/et_text"    android:layout_width="match_parent"    android:textSize="15dp"    android:layout_height="45dp"    android:layout_marginTop="10dp"    android:background="@drawable/edittext_drawable"    android:hint="Enter your text"    android:layout_marginLeft="10dp"    android:layout_marginRight="10dp"    android:paddingRight="10dp"    android:inputType="text"    android:imeOptions="actionDone"    android:paddingLeft="10dp"    android:singleLine="true"    android:textColorHint="#979797" /><RelativeLayout    android:layout_width="match_parent"    android:layout_height="match_parent"    android:id="@+id/rl_main"    android:background="#ffffff"    android:layout_below="@+id/et_text"    android:layout_above="@+id/tv_share">    <ImageView        android:layout_width="match_parent"        android:layout_height="250dp"        android:src="@drawable/index"        android:scaleType="fitXY"        android:id="@+id/iv_image"        android:layout_marginTop="10dp"        />    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textSize="15dp"        android:id="@+id/tv_text"        android:layout_below="@+id/iv_image"        android:layout_margin="10dp"        android:textColor="#000000"        android:maxLines="5"        /></RelativeLayout><TextView    android:id="@+id/tv_share"    android:layout_width="match_parent"    android:layout_height="50dp"    android:background="#F38D0A"    android:gravity="center"    android:padding="10dp"    android:layout_margin="10dp"    android:text="Share"    android:textColor="#ffffff"    android:textSize="15dp"    android:layout_alignParentBottom="true"/></RelativeLayout>

MainActivity.java

package com.shareimage;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.net.Uri;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.text.Editable;import android.text.TextWatcher;import android.util.Log;import android.view.View;import android.widget.EditText;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.TextView;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class MainActivity extends AppCompatActivity implements View.OnClickListener {EditText et_text;ImageView iv_image;TextView tv_share,tv_text;RelativeLayout rl_main;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    init();}private void init(){    et_text = (EditText)findViewById(R.id.et_text);    iv_image = (ImageView)findViewById(R.id.iv_image);    tv_share = (TextView)findViewById(R.id.tv_share);    rl_main = (RelativeLayout)findViewById(R.id.rl_main);    tv_text= (TextView) findViewById(R.id.tv_text);    File dir = new File("/sdcard/Testing/");    try {        if (dir.mkdir()) {            System.out.println("Directory created");        } else {            System.out.println("Directory is not created");        }    } catch (Exception e) {        e.printStackTrace();    }    tv_share.setOnClickListener(this);    et_text.addTextChangedListener(new TextWatcher() {        @Override        public void beforeTextChanged(CharSequence s, int start, int count, int after) {        }        @Override        public void onTextChanged(CharSequence s, int start, int before, int count) {        }        @Override        public void afterTextChanged(Editable s) {            tv_text.setText(et_text.getText().toString());        }    });}@Overridepublic void onClick(View v) {    switch (v.getId()){        case R.id.tv_share:            Bitmap bitmap1 = loadBitmapFromView(rl_main, rl_main.getWidth(), rl_main.getHeight());            saveBitmap(bitmap1);            String str_screenshot = "/sdcard/Testing/"+"testing" + ".jpg";            fn_share(str_screenshot);            break;    }}public void saveBitmap(Bitmap bitmap) {    File imagePath = new File("/sdcard/Testing/"+"testing" + ".jpg");    FileOutputStream fos;    try {        fos = new FileOutputStream(imagePath);        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);        fos.flush();        fos.close();        Log.e("ImageSave", "Saveimage");    } catch (FileNotFoundException e) {        Log.e("GREC", e.getMessage(), e);    } catch (IOException e) {        Log.e("GREC", e.getMessage(), e);    }}public static Bitmap loadBitmapFromView(View v, int width, int height) {    Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);    Canvas c = new Canvas(b);    v.draw(c);    return b;}public void fn_share(String path) {    File file = new File("/mnt/" + path);    Bitmap bmp = BitmapFactory.decodeFile(file.getAbsolutePath());    Uri uri = Uri.fromFile(file);    Intent intent = new Intent(Intent.ACTION_SEND);    intent.setType("image/*");    intent.putExtra(Intent.EXTRA_STREAM, uri);    startActivity(Intent.createChooser(intent, "Share Image"));}}