Android:使用EXTRA_STREAM的Intent.ACTION_SEND在htc Hero上选择Gmail应用时不会附加任何图像

shi*_*dev 12 email android attachment htc-hero android-intent

在具有默认邮件应用程序的模拟器上一切正常.但是当我收到一封我使用Gmail应用程序从我的Hero发送的邮件时,我没有依恋.英雄的默认邮件应用程序正常工作.

如何使此代码适用于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)));
}
Run Code Online (Sandbox Code Playgroud)

在日志中我看到以下内容:

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
Run Code Online (Sandbox Code Playgroud)

谢谢你的回答.

Ale*_* N. 31

对我来说,问题通过以下代码行解决:

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"));
Run Code Online (Sandbox Code Playgroud)

关键是我将屏幕截图保存到媒体库,然后它可以从那里成功发送文件.

  • 之后有什么方法可以删除文件吗? (10认同)
  • @Aleks N.,这是一个很好的方法(意味着它运作良好 - 我试了一下).但我唯一的问题是 - 图像是否存储在手机的某个地方?或者这是临时存储? (2认同)

rob*_*inj 7

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当外部存储不可用时,例如当它作为USB驱动器安装时,这将不起作用.有关检测外部存储是否可用的详细信息,请参阅" 存储API指南".

如果您的最低API级别为8或更高,则可以使用Context.getExternalCacheDir()Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)作为父目录.

除非您最终使用getExternalCacheDir(),否则请确保使用唯一的文件名以防止其中一个用户的文件被意外覆盖.

最后,您可以onActivityResult()在共享操作完成后覆盖以删除文件:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if(requestCode == REQUEST_SHARE) {
        if(this.png == null) {
            return;
        }

        this.png.delete();
    }
}
Run Code Online (Sandbox Code Playgroud)