gpt4 book ai didi

android - 将图像分享到 Gmail 应用程序失败,管道损坏

转载 作者:行者123 更新时间:2023-11-29 01:24:22 25 4
gpt4 key购买 nike

我想让我的用户分享一张图片。图像是动态生成到 byte[] 的。我不想将它写入外部存储上的文件,因为这需要额外的权限。

问题是,可以共享到 Facebook、Twitter 或 Google Drive,但不能共享到 Gmail。它失败了:

    java.io.IOException: write failed: EPIPE (Broken pipe)
at libcore.io.IoBridge.write(IoBridge.java:502)
at java.io.FileOutputStream.write(FileOutputStream.java:186)
at java.io.OutputStream.write(OutputStream.java:82)
at sk.kios.scorabble.sharing.MediaContentProvider$TransferThread.run(MediaContentProvider.java:79)
Caused by: android.system.ErrnoException: write failed: EPIPE (Broken pipe)
at libcore.io.Posix.writeBytes(Native Method)
at libcore.io.Posix.write(Posix.java:223)
at libcore.io.BlockGuardOs.write(BlockGuardOs.java:313)
at libcore.io.IoBridge.write(IoBridge.java:497)
at java.io.FileOutputStream.write(FileOutputStream.java:186) 
at java.io.OutputStream.write(OutputStream.java:82) 
at sk.kios.scorabble.sharing.MediaContentProvider$TransferThread.run(MediaContentProvider.java:79) 

Gmail 应用程序报告“无法附加空文件”。难道我做错了什么?这是我第一次这样做。

这是我发送 Intent 的方式:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://" + MediaContentProvider.AUTHORITY + "/1"));
intent.setType("image/png");
context.startActivity(intent);

这是来 self 的 ContentProvideropenFile 方法:

@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
byte data[] = myMethodToCreateImage();

try {
ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe();
new TransferThread(data, new ParcelFileDescriptor.AutoCloseOutputStream(pipe[1]))
.start();

return pipe[0];
} catch (IOException e) {
throw new FileNotFoundException("Could not open pipe", e);
}
}

这是 TransferThread 类:

static class TransferThread extends Thread {
private final byte[] data;
private final OutputStream out;

TransferThread(byte[] data, OutputStream out) {
this.data = data;
this.out = out;
}

@Override
public void run() {
try {
out.write(data);
} catch (IOException e) {
Log.e(getClass().getSimpleName(), "Exception transferring file", e);
}
finally {
try {
out.close();
} catch (IOException e) {
Log.e(TAG, "", e);
}
}
}
}

最佳答案

一开始以为是gmail的bug,看这里:https://code.google.com/p/android-developer-preview/issues/detail?id=3141 .但是这个错误只与 android 6 marshmallow 有关,这不是我的情况。

事实证明,如果您将 uri 设置为不是 Intent.EXTRA_STREAM,而是使用 intent.setDataAndType,效果会更好:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setDataAndType(Uri.parse("content://" + MediaContentProvider.AUTHORITY + "/1"), "image/png");
context.startActivity(intent);

关于android - 将图像分享到 Gmail 应用程序失败,管道损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34924372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com