您的位置:首页 > 其它

收到短信了,我该做点什么?

2011-03-08 16:12 357 查看
转载时请注明转自:http://blog.csdn.net/sam_zhang1984

交流可加新浪微博:Android开发人

转自:http://dev.10086.cn/cmdn/bbs/viewthread.php?tid=22235&highlight=

本文为《Android/OPhone开发完全讲义》一书的内容连载。转载请注明出处

短信是手机中经常使用到的一种服务。然而,当手机接收到短信时,也会向系统发送广播。如果我们的应用程序要在手机接收到短信后做点什么,那就需要接收这个系统广播。

接收系统广播的步骤我们已经熟悉了,下面就按步就班地来完成这两个步骤。

1.

编写一个
SMSReceiver类来接收系统广播。

package net.blogjava.mobile.sms;
02
03	import android.content.BroadcastReceiver;
04	import android.content.Context;
05	import android.content.Intent;
06	import android.os.Bundle;
07	import android.telephony.gsm.SmsMessage;
08	import android.widget.Toast;
09
10	public class SMSReceiver extends BroadcastReceiver
11	{
12	    @Override
13	    public void onReceive(Context context, Intent intent)
14	    {
15	        //  判断接收到的广播是否为收到短信的Broadcast Action
16	        if ("android.provider.Telephony.SMS_RECEIVED".equals(intent.getAction()))
17	        {
18	            StringBuilder sb = new StringBuilder();
19	            // 接收由SMS传过来的数据
20	            Bundle bundle = intent.getExtras();
21	            // 判断是否有数据
22	            if (bundle != null)
23	            {
24	                //  通过pdus可以获得接收到的所有短信消息
25	                Object[] objArray = (Object[]) bundle.get("pdus");
26	                //  构建短信对象array,并依据收到的对象长度来创建array的大小
27	                SmsMessage[] messages = new SmsMessage[objArray.length];
28	                for (int i = 0; i < objArray.length; i++)
29	                {
30	                    messages[i] = SmsMessage.createFromPdu((byte[]) objArray[i]);
31	                }
32	                //  将送来的短信合并自定义信息于StringBuilder当中
33	                for (SmsMessage currentMessage : messages)
34	                {
35	                    sb.append("短信来源:");
36	                    // 获得接收短信的电话号码
37	                    sb.append(currentMessage.getDisplayOriginatingAddress());
38	                    sb.append("/n------短信内容------/n");
39	                    // 获得短信的内容
40	                    sb.append(currentMessage.getDisplayMessageBody());
41	                }
42	            }
43	            Intent mainIntent = new Intent(context, Main.class);
44	            mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
45	            context.startActivity(mainIntent);
46	            //  使用Toast信息提示框显示接收到的短信内容
47	            Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();
48	        }
49	    }
50	}


在编写
SMSReceiver类时需要注意如下
4点:

接收短信的Broadcast Action是android.provider.Telephony.SMS_RECEIVED,因此,要在onReceiver方法的开始部分判断接收到的是否是接收短信的Broadcast Action。

需要通过Bundle.get("pdus")来获得接收到的短信消息。这个方法返回了一个表示短信内容的数组。每一个数组元素表示一条短信。这就意味着通过Bundle.get("pdus")可以返回多条系统接收到的短信内容。

通过Bundle.get("pdus")返回的数组一般不能直接使用,需要使用SmsMessage.createFromPdu方法将这些数组元素转换成SmsMessage对象才可以使用。每一个SmsMessage对象表示一条短信。

通过SmsMessage类的getDisplayOriginatingAddress方法可以获得发送短信的电话号码。通过getDisplayMessageBody方法可以获得短信的内容。

2.


AndroidManifest.xml文件中配置
SMSReceiver类,代码如下:

1	<receiver android:name="SMSReceiver">
2	    <intent-filter>
3	        <!--  指定SMSReceiver可以接收的Broadcast Action  -->
4	        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
5	    </intent-filter>
6	</receiver>


为了使应用程序可以成功地接收
SMS_RECEIVED广播,还需要使用
<uses-permission>标签为应用程序打开接收短信的权限,代码如下:

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


现在启动应用程序,界面上会显示“等待接收短信
...”的信息。那么这里还有一个问题。如果我们在模拟器上测试这个程序呢?

解决这个问题并不难,
Android模拟器不仅可以模拟程序的运行,还可以模拟手机的很多动作,例如,发短信就是其中之一。要模拟手机的动作,仍然要求助于
DDMS透视图。在
DDMS透视图中有一个【
Emulator Control】视图(如果
DDMS中没有这个视图,请读者通过
Eclipse的【
Window】
>【
Show View】菜单项来显示这个视图)。在【
Telephone Actions】分组框,选中
SMS选项框,并在【
Incomingnumber】文本框中输入一个电话号,然后在【
Message】文本框中输入要发送的短信内容,最后单击【
Send】按钮来模拟发送短信。输入相应信息后的【
Emulator Control】视图如图1
所示。当单击【
Send】按钮后,手机模拟器就会接收到短信,不管接收短信的应用程序是否启动,都会显示如图
2所示的显示短信内容的
Toast信息提示框。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐