My Photo
無料ブログはココログ

« December 2010 | Main | June 2011 »

【Android】メール受信イベントを受け取る

例えば、AndroidでメールをサーバPUSHにより受信した契機で、様々な処理を動作させる(etc.オリジナル着信音再生等)ことが可能か試してみた。

まず、前提として2つのポイントがある。
1.BroadcastReceiver
2.Androidの「メール」について

1.BroadcastReceiver
http://developer.android.com/intl/ja/reference/android/content/BroadcastReceiver.html
http://www.saturn.dti.ne.jp/~npaka/android/IntentReceiverEx/index.html

ここら辺かな。。。要はOSで管理されているアプリに特定の処理を契機にイベントを発信(broadcast)する仕組み。
で、どの処理時にイベントを取れるかはAndroid公式のIntentクラス説明にある「Standard Broadcast Actions」(日本語はこことか)
時刻設定変更、電源起動時、アプリインストール等が並んでる。
おや、メール受信がないとお気付きのあなた!!
そうなんですないんです。

「神は言っている。ググレカスと」

で分かったことは「あるけど公開してない(保障されてない?)」イベントがあるらしい

2.Androidの「メール」について
Androidの場合、現在発売済みの実機を見たところ基本的に3つのメールがあるようです。
(1)Gmail
(2)E-mail(PCメール)
(3)キャリアメール(SMS/MMS)

(1),(2)はだいたいわかると思いますが、(3)は分かりずらいと思いますが、ざっくりとSoftBankの場合は「S!メール」docomoの場合は「spモードメール」、AUの場合は「Cメール」と思ってもらって大丈夫。

ここまで分かれば、こんな風に各メール受信時に発するbroadcastイベントを受け取るReceiverアプリを作ればいいじゃん。


そんな風に考えていた時期が俺にもありました。

まずはソースを晒そう
[AndroidManifest.xml]

<?xml version="1.0" encoding="utf-8"?>

	
	
		
			
				
			
			
				
				
			
			
				
				
			
			
				
			
		
	
	
	


[TestReceiver.java]

package po.po.po.pooooon;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class TestReceiver extends BroadcastReceiver {
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    private static final String WAPPUSH_RECEIVED = "android.provider.Telephony.WAP_PUSH_RECEIVED";
    private static final String MMS_RECEIVED = "android.intent.action.CONTENT_CHANGED";
    @Override
    public void onReceive(Context context, Intent intent) {
	if (Intent.ACTION_NEW_OUTGOING_CALL.equals(intent.getAction())) {
	    System.out.println("popopopooooon:" + "ougoing call received");
	    Toast.makeText(context, "ougoing call received", Toast.LENGTH_LONG).show();
	}
	else if (Intent.ACTION_PROVIDER_CHANGED.equals(intent.getAction())) {
	    System.out.println("popopopooooon:" + "gmail received");
	    Toast.makeText(context, "gmail received", Toast.LENGTH_LONG).show();
	}
	else if (SMS_RECEIVED.equals(intent.getAction())) {
	    System.out.println("popopopooooon:" + "sms received");
	    Toast.makeText(context, "sms received", Toast.LENGTH_LONG).show();
	}
	else if (WAPPUSH_RECEIVED.equals(intent.getAction())) {
	    System.out.println("popopopooooon:" + "wap push received");
	    Toast.makeText(context, "wap push received", Toast.LENGTH_LONG).show();
	}
	else if (MMS_RECEIVED.equals(intent.getAction())) {
	    System.out.println("popopopooooon:" + "mms received");
	    Toast.makeText(context, "mms received", Toast.LENGTH_LONG).show();
	}
    }
}

※各メール受信時のブロードキャストイベントを拾ってトースト焼くだけ

【SMS受信イベント(android.provider.Telephony.SMS_RECEIVED)】
これはここに載ってるように書いた
で、SMSならば3キャリアとも動いた。SoftBankの場合S!メール設定の「SMS/S!メール受信の優先設定」をONにすると何故かSMS受信イベント発生しなかったが。。。

同一キャリアしか送れないSMSなんて使わねえよという話は置いといて

【Gmail受信イベント(android.intent.action.PROVIDER_CHANGED)】
これは、ここ見た。Android2.2端末(祖父番1機種、ドコモ1機種)だと動いた。IS03だと動かなかった。。。AUが悪いのか、Android1.6が悪いのか。。。
ちなみにlogcat をした時にgmail受信時に上記イベント受信できたやつとできないやつで以下の差分があった

・gmail受信イベントできた端末(祖父番、ドコモ各Android2.2機種)
Sending notification intent: Intent { act=android.intent.action.PROVIDER_CHANGED dat=content://gmail-ls/unread/^i (has extras) }

・gmail受信イベントできなかった端末(IS03)
Sending notification intent: Intent { act=android.intent.action.PROVIDER_CHANGED dat=content://gmail-ls/unread/^i typ=gmail-ls (hasextras) }

この「typ=gmail-ls」が曲者のような気がする。。。intent-filterでこれを引っかけるための情報が必要なのか。。。。

【キャリアメール受信イベント(android.provider.Telephony.WAP_PUSH_RECEIVED)】
こ項目だけ、サッパわからん。。。一応ここ見た
このページの通りdocomoで全く通知なし。というかlogcat見てると全くどこにもIntent投げてる気配なし。どういうことなの。。。ヽ(`⌒´♯)ノ

で、色々試行錯誤したところ、logcat見ると以下の行が出力されてるのを発見。
V/MmsSystemEventReceiver(14062): Intent received: Intent { act=android.intent.action.CONTENT_CHANGED cmp=com.android.mms/.transaction.MmsSystemEventReceiver (has extras) }

したらば、AndroidManifest.XMLに以下のintent-filterを追加

<action android:name="android.intent.action.CONTENT_CHANGED" />

で、なんと受信成功ヽ(●`∀´)乂(○`∀´)ノ
本当にこれでいいのか!!
でもググってもMMS関連でしかこのintent-filter使われてないようだし。。。

とうことで以下の結果となりますた。

Gmail・・・基本的(Android2.2以降?)に受信時イベント処理可能
SMS・・・基本的に可能(機種(アプリ)依存有り)
キャリアメール・・・今のところS!メールのみ可能

尚、俗に言うEmail(PCメール)に関しては全く詳細不明。というか完全にキャリア・メーカー依存な気がするし、そもそもPUSHを使わずにポーリングでポートからメール取ってるような子や、logcat見ててもIntentを全く投げない子が多く、世はまさに世紀末状態。( ゜∀゜)ヒャッハー!

【結論】
そもそも標準仕様がない。偶然ブロードキャストイベントを発行する良心的なメールアプリがあっても動作するとは限らない。

(* ̄ノ ̄)/Ωチーン

Androidで端末情報取得まとめ

ています。徐々に追加予定(2011/03/08現在)

・ハードウェア情報取得
http://techbooster.jpn.org/device/1330/

・SIM/固有識別情報取得
http://techbooster.jpn.org/device/1528/
http://typex2.wordpress.com/2009/12/03/android-market%E3%81%AE%E3%83%8F%E3%83%83%E3%82%AF%E4%BA%8B%E6%83%85%EF%BC%886%EF%BC%89%EF%BC%9Aandroid%E3%81%AE%E5%9B%BA%E6%9C%89%E8%AD%98%E5%88%A5%E6%83%85%E5%A0%B1-1android_id/
https://sites.google.com/a/gclue.jp/android-1000-tips/simjouhou-wo-shutoku-suru

※特にIMSIはTelephonyManager#getSubscriberIdから取得する。


・画面情報取得
http://labs.techfirm.co.jp/android/m_yamada/1668
http://www.adakoda.com/android/000269.html


そのうち、端末情報取得すだけに特化したアプリを出したい。。。

インストール済みアプリの起動Activityパッケージ名を取得するアプリ

(Android)を作りました。
主にADW.LauncherやA HomeといったHOMEアプリでアプリケーションアイコンを差し替える時に差し替えるアプリのActivityパッケージフルパスのファイル名にしないといけないのでインストール済みのアプリを全て抜き出すするためにだけ使うとい超隙間アプリですが。世間にはなかったので。。。

MENUボタンでメールをIntent起動し、一覧リストを送れます!!
主にADW.Launcherのアイコン職人に捧ぐ!!

AndroLib:
http://jp.androlib.com/android.application.jp-co-drecom-getlaunchactivity-zEAnm.aspx

Android実機から:
market://details?id=jp.co.drecom.getlaunchactivity

« December 2010 | Main | June 2011 »

Categories

  • Android Dev
  • グルメ・クッキング
  • ゲーム
  • プログラマ
  • 携帯・デジカメ
  • 日記・コラム・つぶやき
December 2021
Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31