ページ

2013/05/15

[Android]添付ファイル付きメール送信Intentを作成する

添付ファイルの MIME Type を返す関数も
[Android]拡張子からMIME Typeを返す関数 | DevAchieveで作ったし、
クラッシュレポートを JSON で送信出来れば
コマンドラインJSONプロセッサ jq をインスールする でフォーマットして見れるし、
データがいっぱい集まったら MongoDB に JSON をインポートして見れたら楽しそう!

このようにクラッシュレポート送信機能を作り始めたがどうにもファイルが添付できない。
Intent#ACTION_SEND | Android Developersによると
setType で添付ファイルの MIME Type を指定する必要があるようなので application/json を指定するも
メーラー側が text/plain と image/* にしか(?)対応していなくて添付できない。

諦めてテキストファイルを送信することにしました。
Intent intent = createSendMailIntent(mailto, subject, body);
intent = addFile(intent, attachmentFile);
Utilクラスに以下のコードをコピペしておくと呼び出しが上記だけで済む。
/**
 * メールを送信するIntentを作成する
 * 
 * @param mailto
 * @param subject
 * @param body
 */
public static Intent createSendMailIntent(String mailto, String subject, String body){
    return createSendMailIntent(new String[]{ mailto }, new String[]{}, new String[]{}, subject, body);
}

/**
 * メールを送信するIntentを作成する
 * 
 * @param mailto
 * @param subject
 * @param body
 */
public static Intent createSendMailIntent(String[] mailto, String subject, String body){
    return createSendMailIntent(mailto, new String[]{}, new String[]{}, subject, body);
}

/**
 * メールを送信するIntentを作成する
 * 
 * @param mailto
 * @param cc
 * @param bcc
 * @param subject
 * @param body
 */
public static Intent createSendMailIntent(String[] mailto, String[] cc, String[] bcc, String subject, String body){
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType(HTTP.PLAIN_TEXT_TYPE);
    intent.putExtra(Intent.EXTRA_EMAIL, mailto);
    intent.putExtra(Intent.EXTRA_CC, cc);
    intent.putExtra(Intent.EXTRA_BCC, bcc);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    intent.putExtra(Intent.EXTRA_TEXT, body);
    return intent;
}

/**
 * メールIntentにファイルを添付する
 * 
 * @param intent
 * @param filePath
 * @return
 */
public static Intent addFile(Intent intent, String filePath){
    return addFile(intent, new File(filePath));
}

/**
 * メールIntentにファイルを添付する
 * 
 * @param intent
 * @param file
 * @return
 */
public static Intent addFile(Intent intent, File file){
    return addFile(intent, Uri.fromFile(file), getMimeType(file));
}

/**
 * メールIntentにファイルを添付する
 * 
 * @param intent
 * @param uri
 * @param mimeType
 * @return
 */
public static Intent addFile(Intent intent, Uri uri, String mimeType){
    intent.setType(mimeType);
    intent.putExtra(Intent.EXTRA_STREAM, uri);
    return intent;
}