7

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

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

日志猫:

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 被强制关闭。当我尝试与 Facebook 分享时,Facebook 默默地拒绝了该帖子。消息传递使信使,但为空。无需添加图像即可共享作品。

4

3 回答 3

17

首先,永远不要使用连接来构建文件路径,更不用说Uri值了。

其次,EXTRA_STREAM应该持有 a Uri,而不是 a String

第三,既然您知道正确的 MIME 类型 ( image/png),请使用它,而不是通配符。

第四,永远不要重复构建相同的路径。在这里,您创建File image正确的方式,然后忽略该值。

因此,转储该String url行,替换image/*image/png并修改:

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

成为:

sharingIntent.putExtra(android.content.Intent.EXTRA_STREAM, Uri.fromFile(file));
于 2013-10-10T21:27:07.240 回答
1

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

于 2013-10-11T01:11:55.013 回答
1

您需要一直传递 Content URI(至少在 Android 5.1+ 中)。以下是如何从 Bitmap 获取内容路径:

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..."));
    }
于 2015-10-14T09:30:47.480 回答