プロジェクションマッピング

エンターテインメントから工業利用まで、プロジェクションマッピングの活用・運用をお考えの方へ

more

インタラクティブ&サイネージ

情報表示用のデジタルサイネージから、センサーを利用したインタラクティブ要素などをお考えの方へ

more

VR/360MOVIE

VRHMD用コンテンツからプラットフォームを利用した360度ムービーを活用したPRをお考えの方へ

more
CONTACT 052-253-9866

【Android】Intentを利用したGmailでの画像添付が上手く行かない!

2015.01.04 日曜日 20:42:14

tU3ptNgGSP6U2fE67Gvy_SYDNEY-162_02

当ブログをご覧になっているユーザーの皆様、ありがとうございます。
前回の記事で、業務多忙つき少しお休みしますと言っていたら、いつの間にか年が明けていました…

新年、明けましておめでとうございます。
今年も宜しくお願い致します。

今回Androidのカメラアプリで、撮影した画像をGmailに添付するのに以外に手間取ったので、
手順をまとめました。
同じところで躓いているかたの参考になればと思います。

画像を保存

検証端末について、Nexus5では動作を確認していますが、
その他の機種は未検証です。ご了承くださいませ。

今回、ファイル保存画面を「EditActivity」、メール送信画面を「ShareActivity」と仮定し、
進めていきます。

カメラで撮影した画像を保持する為に、
以下のようにstaticで変数を指定しています。

public static Bitmap sendBitmap;

本当はIntentで保持出来ると良いのですが、上手く行きませんでした…
static変数で保持したデータは、明示的に削除しないとキャッシュとして残り続けてしまう等
問題もありますので、もしIntentで上手く保持出来れば、そのほうが良いかもしれません。

それでは、具体的な記述を記載していきます。
まず、EditActivity内で、ファイル保存用フォルダを作成します。
フォルダを指定せずに保存する方法もありますが、その場合だと、
添付の際に、画像のパスが特定し辛くなってしまう為、
ここでフォルダを作ったほうが良いと思いました。

EditActivity内へ記述

// 画像保持用
public static Bitmap sendBitmap;

protected void imgSave() {

// 保存するフォルダを作成
final String SAVE_DIR = "/保存するフォルダ名/";
File file = new File(Environment.getExternalStorageDirectory().getPath() + SAVE_DIR);
try{
if(!file.exists()){
file.mkdir();
}
}catch(SecurityException e){
e.printStackTrace();
throw e;
}

//保存するファイル名を日付にする
Date mDate = new Date();
SimpleDateFormat fileNameDate = new SimpleDateFormat("yyyyMMdd_HHmmss");
String name = fileNameDate.format(mDate) + ".jpg";
String AttachName = file.getAbsolutePath() + "/" + name;

try {
FileOutputStream out = new FileOutputStream(AttachName);
MainActivity.sendBitmap.compress(CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch(IOException e) {
e.printStackTrace();
}

//保存
ContentValues values = new ContentValues();
ContentResolver contentResolver = getContentResolver();
values.put(Images.Media.MIME_TYPE, "image/jpeg");
values.put(Images.Media.TITLE, name);
values.put("_data", AttachName);
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

Toast.makeText(EditActivity.this, "保存しました。", Toast.LENGTH_SHORT).show();
send_intent(name);
}

//Intent処理
protected void send_intent(String name) {
Intent intent = new Intent(EditActivity.this, ShareActivity.class);
// ファイル名を保持
intent.putExtra("filename", name);
// 次画面のアクティビティ起動
startActivity(intent);
}

上の「imgSave」をButtonのクリックイベント等に割り当てて使用して頂くのが良いと思います。

画像をGmailへ添付

続いて、メール添付部分です。
先ほどの「imgSave」を実行し、メール送信用画面の「ShareActivity」へ
遷移してきたと仮定し、進めます。

ShareActivity内へ記述

// 画像保持用
public static Bitmap sendBitmap;

protected void mailSend() {
final String SAVE_DIR = "/保存するフォルダ名/";
File file = new File(Environment.getExternalStorageDirectory().getPath() + SAVE_DIR);

Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_SUBJECT, "添付ファイル送信テスト");

intent.setType("image/jpg");
//ファイルパス指定(nameはIntentで保持したファイル名です)
File sendFile = new File(file.getAbsolutePath() + "/" +name);
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(sendFile));

//Gmailを指定
intent.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");
startActivity(intent);
}

「imgSave」の場合と同様に、上の「mailSend」をButtonクリックイベントに
割り当てて頂ければと思います。

iOSだとメール添付はもっと単純なイメージがありますが…

参考にさせて頂いたサイト

画像保存の手順は、こちらを参考にさせて頂きました。
AndroidでBitmap画像を保存 – conta’s diary

Intent.EXTRA_STREAMの部分で、「Uri.fromFile」ではなく「Uri.parse」で
画像のパスを指定すると、Gmailへ添付した画像が消える現象が発生するため、注意が必要です。

こちらの記事を参考にさせて頂き、対処しました。
AndroidでIntentを利用して添付ファイル付きのメール送信をすると、メールにファイルが添付されずに送信される現象 | IT関連の技術情報サイト

Gmail起動方法は、こちらの記事を参考にさせて頂いています。
メール送信(メーラーをGmailに指定) | SugiBlog

先人の方々には、いつも感謝しております!

Category:Android , Development     Tag:
Authorブログの著者について
田中 義弘

田中 義弘

イベントプロダクション・グラフィックデザイナーを経て、2010年3月に株式会社アイデアクラウドを設立。近年、WEBから得た技術をベースに、プロジェクションマッピング事業をはじめとした先端事業をスタート。

Our Business
最近の記事
人気記事
Our Project