4

我在我的应用程序中创建图像并希望共享这些社交网络 (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

有许多“黑客”(见下文)可以让它与 gmail 一起使用,但我让我问自己是否有更好的方法来共享没有黑客的图像,这是我忽略的。所以,对于问题:

  • 共享图像的最佳方式是什么?(外置储存?)
  • 是否还有其他(错误)行为与 gmail 类似的应用程序?(我在 google+ 上看到了一些问题)
  • 如果没有其他方法:我可以编写特殊意图以共享到特定应用程序。当用户在我的监视列表中选择应用程序时,我有默认的共享方式并覆盖它?

黑客

  1. 通过简单地指向来使用路径破解Uri

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

    这个解决方案感觉不对。

  2. 使用ContentProvider此处描述的 a 。但从链接中引用:

    警告:帖子中描述的方法适用于 Gmail,但显然与其他 ACTION_SEND 处理程序(例如 MMS 作曲家)存在一些问题。

    (问题:它使 MMS 作曲家崩溃)

4

2 回答 2

0

你试过 ParecelableFileDescriptor 吗?

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

Create with static ParcelFileDescriptor open(File file, int mode, Handler handler, ParcelFileDescriptor.OnCloseListener listener) 创建一个访问给定文件的新 ParcelFileDescriptor。 static ParcelFileDescriptor open(File file, int mode) Create a new ParcelFileDescriptor accessing a given file.

像这样的接收端: 使用 Androids DownloadManager 从 Parcel File Descriptor 返回输入流

于 2013-12-13T06:44:34.890 回答
0

你应该做3个步骤。
拍照片。

public Bitmap takeScreenshot() {
    View rootView = findViewById(android.R.id.content).getRootView();
    rootView.setDrawingCacheEnabled(true);
    return rootView.getDrawingCache();
}

保存图片。

public String saveBitmap(Bitmap bitmap) {

File imagePath = new File(Environment.getExternalStorageDirectory() + “/screenshot.png”);
    FileOutputStream fos;
    try {
        fos = new FileOutputStream(imagePath);
        bitmap.compress(CompressFormat.PNG, 100, fos);
        fos.flush();
        fos.close();
    } catch (FileNotFoundException e) {
        Log.e(“GREC”, e.getMessage(), e);
    } catch (IOException e) {
        Log.e(“GREC”, e.getMessage(), e);
    }

    return imagePath.getAbsolutePath();
} 

分享到社交网络。

于 2014-09-24T09:35:38.333 回答