16

ACTION_SENDプログラムで生成された画像があり、 andEXTRA_STREAMメソッドを介して添付ファイルとして送信します。

しかし、どうすればこれを行うことができますか?

私の最初の試み(context.getCacheDir()ベースのファイルパスへの書き込み)はGmailプレビューで機能するように見えました(画像プレビューはありませんが、添付ファイル名とアイコンが表示されていました)が、添付ファイルが受信者側に届きませんでした。これは、生成されたファイルのアクセス許可と関係があると思いますが、これを回避するにはどうすればよいですか?これらの生成されたファイルに(Gmailアクティビティがアクセスできるように)より寛容な設定を行う必要がありますか?それはアプリのキャッシュフォルダーでも可能ですか?

ファイルの書き込みに適した別のファイルの場所はありますか?ダウンロードフォルダを検討しましたが、電子メールで送信されるまで存在する必要があるものにとっては厄介な場所になると思います。

私は自分の画像を純粋にdata:image/png;base64,ABCD...スタイルURIでエンコードしようとさえしました。これもGmailプレビュー(添付ファイルアイコン、ファイル名なし)に表示されましたが、受信者側の添付ファイルにはなりませんでした。

ワンショットで生成された画像を何らかの方法でメールインテントに添付できる人はいますか?どのようなオプションを見落としている可能性がありますか?

4

3 に答える 3

19

私の問題は、実際には次の 2 つの部分で構成されていました。

  1. context.getCacheDir()あなたのアプリにプライベートです。そこに何かを置いて、別のアプリがそれにアクセスできると期待することはできません。
  2. 使用すべき MIME タイプを誤解していました。私は電子メールのテキストを送信していimage/pngましたが、添付ファイルのために本当に指定する必要がありました.

さらに、調査によると、(潜在的に大きな) イメージをプライマリ メモリに配置することは、たとえすぐにクリーンアップしようとしても、お勧めできません。

これらのことを行って、生成したイメージを SD カードの公開場所に書き込むと、問題なく動作しました。

したがって、概要は次のとおりです。

マニフェストで SD カード アクセスをリクエストする

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

SDカードが利用可能であることを確認してください

if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) 
{
    //Bail gracefully
}

SD カードにディレクトリを作成する

File pngDir = new File(
    Environment.getExternalStorageDirectory(),   
    //Loose convention inferred from app examples
    "Android/data/com.somedomain.someapp/flotsam");

if (!pngDir.exists())
    pngDir.mkdirs();

ファイルをそのディレクトリに書き込み、Uri をキャプチャします

File pngFile = new File(pngDir, "jetsam.png");
//Save file encoded as PNG
Uri pngUri = Uri.fromFile(pngFile);

ACTION_SENDインテントを構築する

Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("image/png"); //
intent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { "someone@somewhere.com" });
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Portable Network Graphics");
intent.putExtra(android.content.Intent.EXTRA_CC, new String[] { "carbon@somewhere.com" });
intent.putExtra(Intent.EXTRA_TEXT, "Something textual");
intent.putExtra(Intent.EXTRA_STREAM, pngUri);

そして活動開始

context.startActivity(Intent.createChooser(intent, "Something Pithy"));

そして、すべてをきれいにすることを確認してください...

警告 1

アプリ固有の SD カード ディレクトリのサポートが追加されているようですが、残念ながら、必要な SDK バージョンではサポートされていません。

警告 2

これは、最終的に私のために働いたソリューションの概要です。これは必ずしも「ベスト プラクティス」のアプローチではありません。

警告 3

これは、画像添付機能を利用できるようにするには、アプリケーションに SD カードをマウントする必要があることを意味しますが、これは私の使用例では完全に受け入れられました。あなたのマイレージは異なる場合があります。SD カードが利用できない場合は、画像を添付できなかった理由と状況を修正する方法を説明するわかりやすいメモをメールに追加します。

于 2010-08-27T16:58:24.337 に答える
4

まったく同じ問題に遭遇しました(私の場合はテキストファイルを添付したい)。Android のログを見ると、その理由は次のとおりです。

02-28 21:01:28.434: E/Gmail(19673): file:// attachment paths must point to file:///mnt/sdcard. Ignoring attachment file:///data/data/com.stephendnicholas.gmailattach/cache/Test.txt

回避策として (HRJ が述べているように)、ContentProvider を使用して、アプリケーションの内部キャッシュ内のファイルへのアクセスを提供し、Gmail がファイルを添付できるようにすることができます。やり方をブログに書いてみました。

うまくいけば、それはいくつかの助けになります:)

于 2012-02-28T22:22:53.190 に答える
-1
tableLayout.buildDrawingCache();
        Bitmap test = Bitmap.createBitmap(tableLayout.getDrawingCache());
        tableLayout.destroyDrawingCache();

        Log.d("Image", test.toString());

        String path = Environment.getExternalStorageDirectory().toString(); 
        Log.d("Path", path);
        File file = new File(path,"mail_image.png");
        Uri pngUri = Uri.fromFile(file);
        Log.d("Real Image Path", pngUri.toString());

        Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
        emailIntent.setType("image/png");
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, "email to"); 
        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,"Subject"); 
        emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "From My App"); 
                    emailIntent.putExtra(android.content.Intent.EXTRA_STREAM, pngUri );

        startActivity(Intent.createChooser(emailIntent, "Send mail..."));
于 2013-04-30T22:12:51.337 に答える