私の問題は、実際には次の 2 つの部分で構成されていました。
context.getCacheDir()
あなたのアプリにプライベートです。そこに何かを置いて、別のアプリがそれにアクセスできると期待することはできません。
- 使用すべき 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 カードが利用できない場合は、画像を添付できなかった理由と状況を修正する方法を説明するわかりやすいメモをメールに追加します。