Bitmap画像をJPEGかPNG形式でインテントに入れて,GMailなどの外部アプリを起動する方法です (Android SDK 1.6)
インテントに画像を渡す方法
自分のアプリ内部でBitmapのやりとりをする場合は,インテントに直接putExtra()して好きなように扱えば良いと思います.以下が参考になります.
しかし外部アプリに渡したい場合は,これではうまくいきませんでした.地図ロイドへの組み込みでかなりハマりましたので,書いておきます.
内蔵ファイル領域を使って渡す方法 (没)
Bitmapを直接インテントにputExtraしてActivityを起動した場合,Gmailで受け取るとClassCastExceptionが出ました.なので色々調べてみると,
直接Bitmapを渡すのではなく,自分自身のファイル領域に一旦ファイルとして書き出して,
そのURI(file://〜)をputExtraしたインテントを渡す必要があるようです.
もちろんその画像ファイルは外部アプリから読み出す必要があるため,
上のリンクに書かれている通り,パーミッションを
Context.MODE_WORLD_READABLE なファイルとして作成するわけです.
SDカードを使う方法
ところがこの方法でも,駄目でした
picasaで受け取って画像を見ることはできたのですが,
Gmailだと,送信画面には添付ファイルとしてアイコンが出るのですが,
実際に送信したメールには添付されませんでした
なぜGmailがそうなるのか不思議なのですが,
アプリのコンテキストから取得できる内蔵のファイル領域ではなく,SDカードに画像を保存すれば,Gmailでも正しく添付されるようになりました.
実装例
public
static
void
shareBitmap(Context context, Bitmap b) {
String fname = "share.jpg"
;
// ファイル保存先 (SDカード)
String fileFullPath = Environment.getExternalStorageDirectory().getAbsolutePath()
+ File.separator + "share_test"
+ File.separator + fname;
FileOutputStream out = null
;
try
{
// 画像をバイト配列に変換する
ByteArrayOutputStream os = new
ByteArrayOutputStream();
b.compress(CompressFormat.JPEG, 100, os); // PNGの場合は CompressFormat.PNG にする
os.flush();
byte
[] w = os.toByteArray();
os.close();
// バイト配列をファイルとしてSDカードに書き出す
out = new
FileOutputStream(fileFullPath);
out.write(w, 0, w.length);
out.flush();
// ファイルを示すインテントを作成する
Uri uri = Uri.fromFile(new
File(fileFullPath));
intent = new
Intent(Intent.ACTION_SEND);
intent.setType("image/jpg"
); // PNGの場合は "image/png"
にする
intent.putExtra(Intent.EXTRA_STREAM, uri);
// 外部アプリを起動する
try
{
context.startActivity(Intent.createChooser(intent, null
));// 常に送信先を選択させる
} catch
(ActivityNotFoundException e) {
//
}
} catch
(FileNotFoundException ex) {
//
} catch
(IOException ex) {
//
} finally
{
try
{
if
(out != null
) {
out.close();
}
} catch
(IOException ex) {
//
}
}
}
Gmailは一体何をやっているのだろうか...