android - 分享图片的正确方式(使用 Intents)

标签 android image android-intent share

我在我的应用程序中创建图像并希望共享这些社交网络 (facebook)、邮件应用程序 (gmail) 和其他可以“接收”图像的应用程序。

问题的根源(我认为)是我不想使用外部存储作为图像的基础。我想使用我的数据文件夹或缓存文件夹,因为它们都不需要任何访问权限。

我用来将图像写入文件的代码(我指定了 MODE_WORLD_READABLE 以便其他应用程序可以读取它们):

FileOutputStream fos = null;
try {
    fos = context.openFileOutput("image.jpg", Context.MODE_WORLD_READABLE);
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
} finally {
    if (fos != null)
        fos.close();
}

这是我分享图片的代码:

File internalFile = context.getFileStreamPath("image.jpg");

Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(internalFile));
intent.setType("image/jpeg");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

context.startActivity(Intent.createChooser(intent, "share"));

这个解决方案非常简单,适用于像 facebook 这样的应用程序,但例如 gmail,它会失败:

file:// attachment paths must point to file:///mnt/sdcard

有许多“hacks”(见下文)可以让它与 gmail 一起工作,但我让我问自己是否有更好的方法来共享图像而无需 hacks,我忽略了这一点。所以,对于问题:

  • 分享图片的最佳方式是什么? (外部存储?)
  • 还有其他应用程序的(错误)行为与 gmail 一样吗? (我发现 google+ 有一些问题)
  • 如果没有其他方法: 我可以编写用于共享到特定应用程序的特殊 Intent 吗?当用户在我的监视列表中选择一个应用程序时,我有默认的共享方式并覆盖它吗?

黑客

  1. 使用 path-hack 通过简单地将 Uri 指向:

    文件:///mnt/sdcard/../../my/package/name/...

    这个解决方案感觉不对。

  2. 按照描述使用 ContentProvider here .但从链接中引用:

    Warning: the method described in the post works well for Gmail, but apparently has some issues with other ACTION_SEND handlers (e.g. the MMS composer).

    (问题:它使彩信编辑器崩溃)

最佳答案

您尝试过 ParecelableFileDescriptor 吗?

http://developer.android.com/reference/android/os/ParcelFileDescriptor.html

创建方式 static ParcelFileDescriptor open(File file, int mode, Handler handler, ParcelFileDescriptor.OnCloseListener listener) 创建一个访问给定文件的新 ParcelFileDescriptor。 static ParcelFileDescriptor 打开(文件文件,整数模式) 创建一个访问给定文件的新 ParcelFileDescriptor。

接收端是这样的: Returning an Input Stream from Parcel File Descriptor using Androids DownloadManager

关于android - 分享图片的正确方式(使用 Intents),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14864707/

相关文章:

html - 为什么从图像到边框底部有间隙?

Android - 如何通过 XML 编辑图像的大小以用作图标

java - 无法使用 CompileSDKVersion 'android-Q' 安装 apk

android - 有没有办法从大型图像创建 xxhdpi、xhdpi、hdpi、mdpi 和 ldpi 可绘制对象?

android - Intent 仅从后置摄像头获取图像

android - 为什么不在 Activity 中使用 "newInstance"模式?

java - 如何在kotlin中获取匿名类中的父类

java - 位置管理器在没有互联网的情况下无法工作

java - 无法从 byte[] 读取 JPEG 文件

cocoa - 使用 Cocoa 从 JPEG 图像获取位图数据