《Android/OPhone开发完全讲义》连载(8):收到短信了,我该做点什么?-阿里云开发者社区

开发者社区> 最美的回忆> 正文

《Android/OPhone开发完全讲义》连载(8):收到短信了,我该做点什么?

简介:
+关注继续查看
文为《Android/OPhone开发完全讲义》一书的内容连载。转载请注明出处

    短信是手机中经常使用到的一种服务。然而,当手机接收到短信时,也会向系统发送广播。如果我们的应用程序要在手机接收到短信后做点什么,那就需要接收这个系统广播。
接收系统广播的步骤我们已经熟悉了,下面就按步就班地来完成这两个步骤。
1.编写一个SMSReceiver类来接收系统广播。

package net.blogjava.mobile.sms;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.gsm.SmsMessage;
import android.widget.Toast;

public class SMSReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        //  判断接收到的广播是否为收到短信的Broadcast Action
        if ("android.provider.Telephony.SMS_RECEIVED".equals(intent.getAction()))
        {
            StringBuilder sb = new StringBuilder();
            // 接收由SMS传过来的数据
            Bundle bundle = intent.getExtras();
            // 判断是否有数据
            if (bundle != null)
            {
                //  通过pdus可以获得接收到的所有短信消息
                Object[] objArray = (Object[]) bundle.get("pdus");
                //  构建短信对象array,并依据收到的对象长度来创建array的大小
                SmsMessage[] messages = new SmsMessage[objArray.length];
                for (int i = 0; i < objArray.length; i++)
                {
                    messages = SmsMessage.createFromPdu((byte[]) objArray);
                }
                //  将送来的短信合并自定义信息于StringBuilder当中
                for (SmsMessage currentMessage : messages)
                {
                    sb.append("短信来源:");
                    // 获得接收短信的电话号码
                    sb.append(currentMessage.getDisplayOriginatingAddress());
                    sb.append("\n------短信内容------\n");
                    // 获得短信的内容
                    sb.append(currentMessage.getDisplayMessageBody());
                }
            }
            Intent mainIntent = new Intent(context, Main.class);
            mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            
            context.startActivity(mainIntent);
            //  使用Toast信息提示框显示接收到的短信内容
            Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();
        }
    }
}

在编写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类,代码如下:

<receiver android:name="SMSReceiver">            
    <intent-filter>
        <!--  指定SMSReceiver可以接收的Broadcast Action  -->
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</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信息提示框。




本文转自银河使者博客园博客,原文链接http://www.cnblogs.com/nokiaguy/archive/2010/09/14/1825902.html如需转载请自行联系原作者


银河使者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里大鱼短信发送接口开发
一、 API接口介绍 alibaba.aliqin.fc.sms.num.send (短信发送) 向指定手机号码发送模板短信,模板内可设置部分变量。使用前需要在阿里大于管理中心添加短信签名与短信模板。
10848 0
《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之71---BREW中语音与短信的开发
版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。
533 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4479 0
iOS开发中打电话发短信等功能的实现
原文:iOS开发中打电话发短信等功能的实现 在APP开发中,可能会涉及到打电话、发短信、发邮件等功能。比如说,通常一个产品的“关于”页面,会有开发者的联系方式,理想情况下,当用户点击该电话号码时,能够自动的帮用户拨出去,就涉及到了打电话的功能。
1115 0
【黑马Android】(01)android简介/工程目录结构/拨号器/四种点击事件/后台偷偷发短信
<p></p> <h2> <span style="font-family:黑体; font-size:16pt">通信技术</span><span style="font-family:黑体; font-size:16pt"></span> </h2> <p></p> <p>1G 模拟制式 只能进行语音通话<span style="font-family:Times New Rom
1716 0
androidstudio导入项目工程库及短信验证实现(SMSSDK)
androidstudio导入项目工程库及短信验证实现(SMSSDK) (这只是本人意见,如有不对还请各位小伙伴多多指教 。本人邮箱: 893239524@qq.com)
4908 0
2126
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载