Android共享图像不起作用

我正在尝试使用以下代码共享该应用程序的屏幕截图:

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) 

问题:当我尝试与gmail共享时,gmail被强制closures。 当我试图与Facebook分享时,Facebook默默地拒绝了这个post。 消息传递使者,但是是空的。 共享作品而不添加图像。

Solutions Collecting From Web of "Android共享图像不起作用"

首先,不要使用连接来构build文件path,更不用说Uri值。

其次, EXTRA_STREAM应该保存一个Uri ,而不是String

第三,既然你知道正确的MIMEtypes( image/png ),就用它来代替通配符。

第四,不要两次修build同一条路。 在这里,您可以正确的方式创buildFile image ,然后忽略该值。

所以,转储String url行,用image/pngreplaceimage/* ,然后修改:

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

成为:

 sharingIntent.putExtra(android.content.Intent.EXTRA_STREAM, Uri.fromFile(file)); 

另外,考虑使用android.support.v4.content.FileProvider类来使用内容URI而不是文件URI来共享文件。 这更安全。 请参阅FileProvider的参考文档

您需要始终传递Content URI(至less在Android 5.1+中)。 这里是如何从一个位图获取内容path:

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

然后分享:

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