Android:在 htc Hero 上选择 Gmail 应用程序时,带有 EXTRA_STREAM 的 Intent.ACTION_SEND 不会附加任何图像
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2206397/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android: Intent.ACTION_SEND with EXTRA_STREAM doesn't attach any image when choosing Gmail app on htc Hero
提问by shinydev
On the Emulator with a default mail-app all works fine. But I have no attach when I'am receiving a mail which I've sent from my Hero using a Gmail app. The default Mail app on the hero works fine.
在带有默认邮件应用程序的模拟器上一切正常。但是当我收到一封使用 Gmail 应用程序从我的英雄发送的邮件时,我没有附件。英雄上的默认邮件应用程序运行良好。
How can I make this code works with Gmail app on Hero?
You can see the code below.
如何使此代码适用于 Hero 上的 Gmail 应用程序?
你可以看到下面的代码。
private void startSendIntent() {
Bitmap bitmap = Bitmap.createBitmap(editableImageView.getWidth(), editableImageView.getHeight(), Bitmap.Config.RGB_565);
editableImageView.draw(new Canvas(bitmap));
File png = getFileStreamPath(getString(R.string.file_name));
FileOutputStream out = null;
try {
out = openFileOutput(getString(R.string.file_name), MODE_WORLD_READABLE);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) out.close();
}
catch (IOException ignore) {}
}
final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(png));
emailIntent.setType("image/png");
startActivity(Intent.createChooser(emailIntent, getString(R.string.send_intent_name)));
}
in Logs I see the following:
在日志中,我看到以下内容:
02-05 17:03:37.526: DEBUG/Gmail(11511): URI FOUND:file:///sdcard/DCIM/100MEDIA/IMAG0001.jpg
02-05 17:03:37.535: DEBUG/Gmail(11511): ComposeActivity added to message:0 attachment:|IMAG0001.jpg|image/jpeg|0|image/jpeg|LOCAL_FILE|file:///sdcard/DCIM/100MEDIA/IMAG0001.jpg size:0
02-05 17:03:37.585: INFO/Gmail(11511): >>>>> Attachment uri: file:///sdcard/DCIM/100MEDIA/IMAG0001.jpg
02-05 17:03:37.585: INFO/Gmail(11511): >>>>> type: image/jpeg
02-05 17:03:37.585: INFO/Gmail(11511): >>>>> name: IMAG0001.jpg
02-05 17:03:37.585: INFO/Gmail(11511): >>>>> size: 0
Thank you for the answer.
谢谢你的回答。
回答by Aleks N.
For me the problem was solved with the following lines of code:
对我来说,问题是通过以下几行代码解决的:
Bitmap screenshot = Bitmap.createBitmap(_rootView.getWidth(), _rootView.getHeight(), Bitmap.Config.RGB_565);
_rootView.draw(new Canvas(screenshot));
String path = Images.Media.insertImage(getContentResolver(), screenshot, "title", null);
Uri screenshotUri = Uri.parse(path);
final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
emailIntent.setType("image/png");
startActivity(Intent.createChooser(emailIntent, "Send email using"));
The key thing is that I'm saving the screen-shot to the media library and then it can successfully send a file from there.
关键是我将屏幕截图保存到媒体库,然后它可以从那里成功发送文件。
回答by robinj
getFileStreamPath()
or openFileOutput()
will create files in a private directory that is inaccessible to other apps (i.e. Gmail). Use external storage to create publicly-accessible files:
getFileStreamPath()
或openFileOutput()
将在其他应用程序(即 Gmail)无法访问的私有目录中创建文件。使用外部存储创建可公开访问的文件:
private static final int REQUEST_SHARE = 39714;
private File png = null;
private void startSendIntent() {
png = new File(new File(Environment.getExternalStorageDirectory(), "Pictures"), getString(R.string.file_name));
FileOutputStream out = null;
try {
out = new FileOutputStream(png);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) out.close();
}
catch (IOException ignore) {}
}
final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(png));
emailIntent.setType("image/png");
startActivityForResult(Intent.createChooser(emailIntent, getString(R.string.send_intent_name)), REQUEST_SHARE);
}
}
This will not work when the external storage is unavailable, like when it is mounted as a USB drive. See the Storage API Guidefor more about detecting whether external storage is available.
当外部存储不可用时,这将不起作用,例如当它作为 USB 驱动器安装时。有关检测外部存储是否可用的更多信息,请参阅存储 API 指南。
If your minimum API level is 8 or above, you can use Context.getExternalCacheDir()
or Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
as the parent directory.
如果您的最低 API 级别为 8 或更高,则可以使用Context.getExternalCacheDir()
或Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
作为父目录。
Unless you end up using getExternalCacheDir()
, make sure you use a unique filename to prevent one of the users' files from accidentally getting overwritten.
除非您最终使用getExternalCacheDir()
,请确保您使用唯一的文件名以防止用户的文件之一被意外覆盖。
Finally, you can override onActivityResult()
to delete the file after the share operation completes:
最后,您可以覆盖onActivityResult()
以在共享操作完成后删除文件:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == REQUEST_SHARE) {
if(this.png == null) {
return;
}
this.png.delete();
}
}
回答by CasualCoder
I had the same symptoms. In my case it was because I was initially saving the attachment with the permissions MODE_PRIVATE
. As soon as I changed it to MODE_WORLD_READABLE
it seems Gmail was then able to access the file and send the attachment properly. Although I see in your code snippet you were using MODE_WORLD_READABLE
... weird.
我有同样的症状。就我而言,这是因为我最初使用权限保存附件MODE_PRIVATE
。一旦我将其更改为MODE_WORLD_READABLE
Gmail 似乎就可以访问该文件并正确发送附件。虽然我在你的代码片段中看到你正在使用MODE_WORLD_READABLE
......很奇怪。
http://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE
http://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE