androidスマフォで2chブラウザを使ってるときなど
このスレを(インテントで)共有して特定のメアドに即送信したい!!ってことよくありますよねぇ。
こんなことが何度も何度も何度もあると
「share → gmail → アドレス入力 → 送信」と流れるのすら
とてもとても億劫になりますね。
そんなこんなで share した場合に、gmailのアカウントを使用して、
特定のメールアドレスに即送信するサンプルです。
まずはアクティビティ。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:orientation="horizontal" android:layout_gravity="center_horizontal|center" android:layout_width="fill_parent"> <LinearLayout android:id="@+id/LinearLayout02" android:layout_width="fill_parent" android:orientation="vertical" android:layout_margin="22px" android:layout_gravity="center" android:layout_height="70px"> <LinearLayout android:id="@+id/LinearLayout01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="horizontal"> <ProgressBar android:id="@+id/ProgressBar01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"></ProgressBar> <TextView android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Sending ..." android:textSize="24px" android:layout_marginLeft="18px"></TextView> </LinearLayout> </LinearLayout> </LinearLayout> |
丸形でくるくるとまわる ProgressBar と、sending … というテキストを中央に配置しています。
次に、activity をちょっと透過させてみるので、res/valus/ に style.xml を作ります。
ここで、半透明のテーマを定義しています。
(parent指定はいまいちよくわかりませんでした。)
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="Theme.Translucent" parent="android:style/Theme.Dialog"> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@android:color/transparent</item> </style> </resources> |
次に AndroidManifest.xml でインテントのキャッチと、
スタイル(さっき作ったカスタムテーマ)を適用します。
インテントは android.intent.action.SEND をキャッチするようにしています。
なお、メール送信したいので、uses-permissionの指定も忘れずに行います。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.trasharea.xxxxx" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".main" android:label="@string/app_name" android:theme="@style/Theme.Translucent"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND"></action> <category android:name="android.intent.category.DEFAULT"></category> <data android:mimeType="text/*" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="4" /> <uses-permission android:name="android.permission.INTERNET" /> </manifest> |
ソースコード。
gmailのアカウントを使用して、TTL(465)で固定のメールアドレスに対して、即送信します。
package com.trasharea.xxxxx; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import android.app.Activity; import android.content.Intent; import android.os.Bundle; public class main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); if (intent.getExtras() == null) { finish(); return; } // インテント経由のみ起動 setContentView(R.layout.main); Bundle bundle = intent.getExtras(); // インテントで渡されたデータをかき集める String body = ""; for (String key : bundle.keySet()) { body += key + ":" + bundle.get(key) + ", "; } Properties props = new Properties(); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.port", "465"); props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); try { final Message message = new MimeMessage(Session.getDefaultInstance(props, new Authenticator() { @Override // 認証データ。アカウント名とパスワードを指定して下さい。 protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("${gmail_account}", "${gmail_password}"); } })); // FROM/TOなど。setTextのあとに一般的(?)なエンコードにしています。 message.setFrom(new InternetAddress("${gmail_account}@gmail.com")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("${to_addr}")); message.setSubject(""); message.setText(body); message.setHeader("Content-Transfer-Encoding", "7bit"); // プログレスバーをくるくる回したいのでメール送信は別スレッドで起動。 new Thread(new Runnable() { public void run() { try { Transport.send(message); } catch (MessagingException e) { throw new RuntimeException(e); } // アクティビティを閉じます。 finish(); } }).start(); } catch (Exception e) { e.printStackTrace(); } } } |
まぁ、おのれ用ですのでサブジェクトなどは指定しません。
その他、主要なとこにはコメント入れてみました。
最後に、必要なライブラリ。
以下の3つが無いと、ビルドエラーにはならなくても実行時エラーになりますので
プロジェクトのビルドパスに追加しておきます。
mail.jar
activation.jar
additionnal.jar
javamail-android