我在应用程序中创建图像,并希望共享这些社交网络 (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 等应用程序,但是not例如 gmail 失败并显示:
file:// attachment paths must point to file:///mnt/sdcard
有许多“技巧”(见下文)可以让它与 gmail 一起使用,但我让我问自己是否有更好的方法来共享无需技巧的图像,这是我忽略的。那么,对于问题:
- 分享图像的最佳方式是什么? (外置储存?)
- 还有其他应用程序的行为(错误)与 Gmail 类似吗? (我发现 google+ 有一些问题)
-
如果没有其他办法的话:我可以编写特殊意图以共享到特定应用程序吗?当用户在我的监视列表中选择应用程序时,我有默认的共享方式并覆盖它吗?
Hacks
-
Using a 路径破解 http://stephendnicholas.com/archives/974#comment-127只需指向Uri
to:
文件:///mnt/sdcard/../../my/package/name/...
这个解决方案感觉不对。
-
Using a ContentProvider
如上所述here http://stephendnicholas.com/archives/974。但引用了链接中的内容:
警告:帖子中描述的方法适用于 Gmail,但显然与其他 ACTION_SEND 处理程序(例如 MMS 编辑器)存在一些问题。
(问题:它使 MMS 编辑器崩溃)