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で受け取って画像を見ることはできたのですが,

bitmap_intent-1.png

Gmailだと,送信画面には添付ファイルとしてアイコンが出るのですが,

bitmap_intent-2.png

実際に送信したメールには添付されませんでした

なぜ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は一体何をやっているのだろうか...


© 2023 KMIソフトウェア