Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android sharing image doesn't work

I am trying to share a screenshot of the application using the following code:

View content = findViewById(R.id.layoutHome);
content.setDrawingCacheEnabled(true);
Bitmap bitmap = content.getDrawingCache();

File sdCardDirectory = Environment.getExternalStorageDirectory();
File image = new File(sdCardDirectory,"temp.png");

// Encode the file as a PNG image.
FileOutputStream outStream;
try {
  outStream = new FileOutputStream(image);
  bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
  outStream.flush();
  outStream.close();
} catch (FileNotFoundException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}

String url = "file://" + sdCardDirectory.toString() + "Images/temp.png";

Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("image/*");
String shareBody = "Here is the share content body";
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,"Subject Here");
sharingIntent.putExtra(android.content.Intent.EXTRA_STREAM, url);
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT,shareBody);
startActivity(Intent.createChooser(sharingIntent, "Share via"));

Logcat:

10-10 14:20:16.631: W/Bundle(16349): Key android.intent.extra.STREAM expected Parcelable but value was a java.lang.String.  The default value <null> was returned.
10-10 14:20:16.658: W/Bundle(16349): Attempt to cast generated internal exception:
10-10 14:20:16.658: W/Bundle(16349): java.lang.ClassCastException: java.lang.String cannot be cast to android.os.Parcelable
10-10 14:20:16.658: W/Bundle(16349):    at android.os.Bundle.getParcelable(Bundle.java:1171)
10-10 14:20:16.658: W/Bundle(16349):    at android.content.Intent.getParcelableExtra(Intent.java:4140)
10-10 14:20:16.658: W/Bundle(16349):    at android.content.Intent.migrateExtraStreamToClipData(Intent.java:6665)
10-10 14:20:16.658: W/Bundle(16349):    at android.content.Intent.migrateExtraStreamToClipData(Intent.java:6650)
10-10 14:20:16.658: W/Bundle(16349):    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1410)
10-10 14:20:16.658: W/Bundle(16349):    at android.app.Activity.startActivityForResult(Activity.java:3351)
10-10 14:20:16.658: W/Bundle(16349):    at android.app.Activity.startActivityForResult(Activity.java:3312)
10-10 14:20:16.658: W/Bundle(16349):    at android.app.Activity.startActivity(Activity.java:3522)
10-10 14:20:16.658: W/Bundle(16349):    at android.app.Activity.startActivity(Activity.java:3490)
10-10 14:20:16.658: W/Bundle(16349):    at com.example.simplegraph.EconActivity$DrawerItemClickListener.onItemClick(EconActivity.java:182)
10-10 14:20:16.658: W/Bundle(16349):    at android.widget.AdapterView.performItemClick(AdapterView.java:298)
10-10 14:20:16.658: W/Bundle(16349):    at android.widget.AbsListView.performItemClick(AbsListView.java:1086)
10-10 14:20:16.658: W/Bundle(16349):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:2855)
10-10 14:20:16.658: W/Bundle(16349):    at android.widget.AbsListView$1.run(AbsListView.java:3529)
10-10 14:20:16.658: W/Bundle(16349):    at android.os.Handler.handleCallback(Handler.java:615)
10-10 14:20:16.658: W/Bundle(16349):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-10 14:20:16.658: W/Bundle(16349):    at android.os.Looper.loop(Looper.java:137)
10-10 14:20:16.658: W/Bundle(16349):    at android.app.ActivityThread.main(ActivityThread.java:4745)
10-10 14:20:16.658: W/Bundle(16349):    at java.lang.reflect.Method.invokeNative(Native Method)
10-10 14:20:16.658: W/Bundle(16349):    at java.lang.reflect.Method.invoke(Method.java:511)
10-10 14:20:16.658: W/Bundle(16349):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-10 14:20:16.658: W/Bundle(16349):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-10 14:20:16.658: W/Bundle(16349):    at dalvik.system.NativeStart.main(Native Method)

The problem: When I try to share with gmail, gmail is force closed. When I try to share with Facebook, Facebook silently rejects the post. Messaging brings up the messenger, but is empty. Sharing works without adding in the image.

like image 662
buczek Avatar asked Oct 10 '13 21:10

buczek


3 Answers

First, never use concatenation to build file paths, let alone Uri values.

Second, EXTRA_STREAM is supposed to hold a Uri, not a String.

Third, since you know the right MIME type (image/png), use it, instead of a wildcard.

Fourth, never build the same path twice. Here you create File image the right way, then ignore that value.

So, dump the String url line, replace image/* with image/png, and modify:

sharingIntent.putExtra(android.content.Intent.EXTRA_STREAM, url);

to be:

sharingIntent.putExtra(android.content.Intent.EXTRA_STREAM, Uri.fromFile(file));
like image 73
CommonsWare Avatar answered Oct 13 '22 02:10

CommonsWare


Also, consider using the android.support.v4.content.FileProvider class to share your file using a content URI instead of a file URI. It's more secure. See the reference documentation for FileProvider

like image 31
Joe Malin Avatar answered Oct 13 '22 01:10

Joe Malin


You need to pass Content URI all the time (at least in Android 5.1+). here's how to get a content path from a Bitmap :

Bitmap bitmap;//this should be your bitmap
String MediaFilePath = Images.Media.insertImage(MainActivity.getContentResolver(), bitmap, FileName, null);

And then to share :

public static void ShareFile(String ContentPath, String Mime)
    {
        Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);

        sharingIntent.setType(Mime);

        Uri FileUri = Uri.parse( ContentPath );


        sharingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        sharingIntent.putExtra(Intent.EXTRA_STREAM, FileUri);

        MainActivity.startActivity(Intent.createChooser(sharingIntent, "Share to..."));
    }
like image 24
RelativeGames Avatar answered Oct 13 '22 01:10

RelativeGames