我在我的应用程序中创建图像并希望共享这些社交网络 (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 吗?当用户在我的监视列表中选择一个应用程序时,我有默认的共享方式并覆盖它吗?
黑客
最佳答案
您尝试过 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/