やりたい事が出来る目処がついたので、ここまでの道程とソースを公開。
アプリとしては、
・Android標準のGmailにContentProviderで繋げて、データを取得。
・Intentでメーラを起動して、取得したデータを渡す。
これだけ。
まず、「Gmail.java」と関連する「Lists.java」、「Maps.java」、「Sets.java」、「Regex.java」、「BaseColumns.java」、「Uri.java」をここからダウンロードしてアプリケーションのプロジェクトにインポート。
※このファイルたちを探すのに苦労した、、、最新のAndroidソースには含まれていないようだ。
次に、ここを参考にすれば簡単に受信メールを取得できるようになった。(実機でないと動作しないので注意)
だが、送信済みメールを取得する方法が分からず途方にくれる、、、gmail.javaのコード読んでqueryに「label:<label>」をセットすればラベルのついたメールを抽出できそうな事に気付く。
Intentでメーラを起動の方は、ここを参考にすれば直ぐ出来た。
で、出来たコードが下記。
今後の課題、
・Gmailアカウントを設定出来るようにする。
・見た目の改善。
・UIの改善
ソース
package net.taku1974.GmailResender; import android.app.Activity; import android.app.AlertDialog; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.AdapterView; import android.text.Html; import android.util.Log; import android.view.View; import android.widget.ListView; import android.widget.TextView; import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.DialogInterface; import android.content.Intent; import android.database.ContentObserver; import android.os.Handler; import android.provider.Gmail; import android.provider.Gmail.BecomeActiveNetworkCursor; import android.provider.Gmail.ConversationCursor; import android.provider.Gmail.LabelMap; import android.provider.Gmail.MessageCursor; public class GmailResenderActivity extends Activity { private static String account = "hoge.android.test@gmail.com"; // GMailアカウント private static String LOGTAG = "GmailResenderLog"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Gmailからメッセージ取得 ContentResolver contentResolver = this.getContentResolver(); Gmail gmail = new Gmail(contentResolver); // Gmailクラス生成 ContentObserver gmailObserver = new ContentObserver(new Handler()){}; // Gmail用コンテンツオブザーバ生成 contentResolver.registerContentObserver(Gmail.BASE_URI, true, gmailObserver); // Gmail用コンテンツオブザーバを登録 LabelMap lm = gmail.getLabelMap(account); // ラベルマップ取得 long labelId=lm.getLabelIdSent(); // 送信済みラベルID String query = "label:"+lm.getName(labelId); // ラベル:送信済みを抽出 Log.d(LOGTAG, "DBG:" + query); ConversationCursor cc = gmail.getConversationCursorForQuery(account, query, BecomeActiveNetworkCursor.YES); // 送信済みラベルを含む会話を取得 ArrayAdapterマニフェストadapterM = new ArrayAdapter (this,android.R.layout.simple_list_item_1); // リストビュー用アダプタ for (int i=0; i<10; i++){ // とりあえず10件取得 if (cc.next()){ MessageCursor mc = gmail.getMessageCursorForConversationId(account, cc.getConversationId()); while (mc.next()) { if(mc.getLabelIds().contains(labelId)){ // 送信済みラベルIDを含むなら Log.d(LOGTAG, "DBG:"+ mc.getSubject()); adapterM.add(new GmailMessage(mc.getToAddresses() , mc.getSubject(), mc.getBody())); // アダプタに追加 } } }else{ break; } } // メッセージ一覧 final ListView listview = (ListView) findViewById(R.id.listViewMail); // リストビュー生成 listview.setAdapter(adapterM); // アダブターセット listview.setOnItemClickListener( // クリックリスナー登録 new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView parent,View view, int position, long id) { setSelectedMessage(parent, position); } } ); listview.setOnItemLongClickListener( // ロングクリックリスナー登録 new AdapterView.OnItemLongClickListener() { public boolean onItemLongClick(AdapterView parent,View view, int position, long id) { setResendMessage(parent, position); return false; } } ); } // メッセージ一覧からクリックしたときの処理 protected void setSelectedMessage(AdapterView parent, int position) { GmailMessage gmess = (GmailMessage) parent.getAdapter().getItem(position); final TextView selecteditem = (TextView) findViewById(R.id.textViewBody); CharSequence csBody = Html.fromHtml(gmess.getBody()); // メール本文(HTML)をCharSequenceに変換 selecteditem.setText("Body:" + "\n" + csBody); } // メッセージ一覧からロングクリックしたときの処理 protected void setResendMessage(AdapterView parent, int position) { GmailMessage gmess = (GmailMessage) parent.getAdapter().getItem(position); // メーラー起動インテントの作成 Intent mailIntent = new Intent(Intent.ACTION_SEND); mailIntent.putExtra(Intent.EXTRA_EMAIL, gmess.getTo()); // 宛先(To) // mailIntent.putExtra(Intent.EXTRA_CC, new String[] {"bbb@xxxx.co.jp", "bbb@xxxx.co.jp"}); mailIntent.putExtra(Intent.EXTRA_SUBJECT, gmess.getSubject()); // 件名 mailIntent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(gmess.getBody())); // 本文 // mailIntent.setType("image/png"); // 添付ファイル // Uri attachments = Uri.parse("file://" + selectedImageFileName); //<-- 画像へのパス // mailIntent.putExtra(Intent.EXTRA_STREAM, attachments); mailIntent.setType("message/rfc822"); // 送信データタイプ try { // システムにインストールされているメーラーを起動 startActivity(Intent.createChooser(mailIntent, getString(R.string.app_name))); } catch (ActivityNotFoundException e ) { Log.e(LOGTAG, e.getMessage()); String errorMsg = String.format("%s\n(%s)", getString(R.string.app_name), e.getMessage()); // アラートダイアログ AlertDialog.Builder errorDialog = new AlertDialog.Builder(this); errorDialog.setTitle("GmailResenderErr"); errorDialog.setMessage(errorMsg); errorDialog.setPositiveButton(R.string.button_close, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // ダイアログを閉じるだけ } }); errorDialog.show(); } } private class GmailMessage { String[] strTo; String strSubject; String strBody; GmailMessage(String[] To, String Subject, String Body) { strTo = To; strSubject = Subject; strBody = Body; } public String toString() { return "TO:" + strTo[0] + "\n" + "Subject:" + strSubject; } public String[] getTo() { return strTo; } public String getSubject() { return strSubject; } public String getBody() { return strBody; } } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.taku1974.GmailResender" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> <activity android:name=".GmailResenderActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <!-- GmailProviderアクセス --> <uses-permission android:name="com.google.android.providers.gmail.permission.READ_GMAIL" /> </manifest>
0 件のコメント:
コメントを投稿