基础知识:

当设备接收到一条新的SMS消息时,就会广播一个包含了android.provider.Telephony.SMS_RECEIVED动作的Intent。注意,这个动作是一个字符串值,SDK 1.0不再包含对这个字符串的引用,因此,在你的应用程序中,你需要显式的指定它。


对于应用程序监听SMS Intent广播,首先需要添加RECEIVE_SMS权限。通过在应用程序manifest中添加一个uses-permission,如下面的片段所示:


<uses-permissionandroid:name=”android.permission.RECEIVE_SMS”/>

       <receiver android:name=".SMSReceiver" android:enabled="true">  

       <intent-filter>  

       <action android:name="android.provider.Telephony.SMS_RECEIVED"/>  

       </intent-filter>  

       </receiver>




SMS广播Intent包含了新来SMS的细节。为了提取包装在SMS广播IntentBundle中的SmsMessage对象数组,使用pdus key来提取SMS pdus数组,其中,每个对象表示一个SMS消息。将每个pdu字节数组转化成SmsMessage对象,调用SmsMessage.createFromPdu,传入每个字节数组,如下面的片段所示:


Bundle bundle = intent.getExtras();

if (bundle != null) {

Object[] pdus = (Object[]) bundle.get(“pdus”);

SmsMessage[] messages = new SmsMessage[pdus.length];

for (int i = 0; i < pdus.length; i++)

messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);

}


每个SmsMessage对象包含SMS 消息的细节,包括源地址(手机号),时间和消息体。

实例代码

Activity01:

package com.yarin.android.Examples_04_05;


import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import android.widget.Toast;


public class Activity01 extends Activity {

private TextView textview;

   /** Called when the activity is first created. */

   @Override

   public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);


       textview = (TextView)this.findViewById(R.id.tv1);

String string = "Toast示例,当收到短信时,我们会提示,欢迎使用!";

textview.setTextSize(30);

textview.setText(string);

Button button = (Button) findViewById(R.id.button1);

/* 监听button的事件信息 */

button.setOnClickListener(new Button.OnClickListener() {

public void onClick(View v)

{

DisplayToast("短信内容在这里显示");

}

});

   }


/* 显示Toast  */

public void DisplayToast(String str)

{

Toast.makeText(this, str, Toast.LENGTH_SHORT).show();

}

}




SMSReceiver:

package com.yarin.android.Examples_04_05;


import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.os.Bundle;

import android.telephony.SmsMessage;

import android.widget.Toast;


public class SMSReceiver extends BroadcastReceiver

{

/*当收到短信时,就会触发此方法*/

public void onReceive(Context context, Intent intent)

{

Bundle bundle = intent.getExtras();

Object messages[] = (Object[]) bundle.get("pdus");

SmsMessage smsMessage[] = new SmsMessage[messages.length];

for (int n = 0; n < messages.length; n++)

{

smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);

}

//产生一个Toast

Toast toast = Toast.makeText(context, "短信内容: " + smsMessage[0].getMessageBody(), Toast.LENGTH_LONG);

//设置toast显示的位置

//toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 200);

//显示该Toast

toast.show();

}

}