灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3138回复:0

Android 短信应用——短信信息实时获取

楼主#
更多 发布于:2012-09-06 13:44

我们知道,只需通过代码就可以读到收件箱中的短信,发件箱中的短信;但是却没办法在短信发来的瞬间获取;如果我们在短信发来的一瞬间能得到相应的信息内容,那么我们就可以依次来展开很多应用了——也就是通过短信去远程操作一部手机

如果想实时获取,就需要调用receiver了,写一个监听类,这样我们就可以实时获取短息信息了。
  
预览图:





还是来看看代码吧。


首先,我们需要创建一个监听类SMSBroadcastReceiver,让他去继承BroadcastReceiver。

再来初始化一个常量ACTION,并赋短信相关参数值。
[java] Android.provider.Telephony.SMS_RECEIVED
Android.provider.Telephony.SMS_RECEIVED

接着创建onReceive方法。

然后用getAction去监听手机短信相关动态,利用StringBuffer来保存短信信息。

再然后主要代码了。
[java] @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(ACTION)) {
            StringBuffer SMSAddress = new StringBuffer();
            StringBuffer SMSContent = new StringBuffer();
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Object[] pdusObjects = (Object[]) bundle.get("pdus");
                SmsMessage[] messages = new SmsMessage[pdusObjects.length];
                for (int i = 0; i < pdusObjects.length; i++) {
                    messages = SmsMessage
                            .createFromPdu((byte[]) pdusObjects);
                }
                for (SmsMessage message : messages) {
                    SMSAddress.append(message.getDisplayOriginatingAddress());
                    SMSContent.append(message.getDisplayMessageBody());
                }
            }
        }
    }
@Override
public void onReceive(Context context, Intent intent) {
  if (intent.getAction().equals(ACTION)) {
   StringBuffer SMSAddress = new StringBuffer();
   StringBuffer SMSContent = new StringBuffer();
   Bundle bundle = intent.getExtras();
   if (bundle != null) {
    Object[] pdusObjects = (Object[]) bundle.get("pdus");
    SmsMessage[] messages = new SmsMessage[pdusObjects.length];
    for (int i = 0; i < pdusObjects.length; i++) {
     messages = SmsMessage
       .createFromPdu((byte[]) pdusObjects);
    }
    for (SmsMessage message : messages) {
     SMSAddress.append(message.getDisplayOriginatingAddress());
     SMSContent.append(message.getDisplayMessageBody());
    }
   }
  }
}
代码中的SMSAddress为发送短信的号码,SMSContent为短信内容。

要想看到是否成功获取,最简单的方法就是把这两个参数打印出来。
[html] System.out.println("发送号码:" + SMSAddress + "n" + "短信内容:"
                            + SMSContent);
System.out.println("发送号码:" + SMSAddress + "n" + "短信内容:"
       + SMSContent);

不过要把他们加入for循环中,因为当新信息发来时,SMSAddress和SMSContent将被替换。
因此如果要是做应用时,也是在for循环中判断的。

最后要记得在Manifest.xml中注册监听器。
[java] <receiver Android:name="cn.etzmico.SMSBroadcastReceiver">
        <intent-filter>
            <action Android:name="Android.provider.Telephony.SMS_RECEIVED"></action>
        </intent-filter>
    </receiver>
<receiver Android:name="cn.etzmico.SMSBroadcastReceiver">
   <intent-filter>
    <action Android:name="Android.provider.Telephony.SMS_RECEIVED"></action>
   </intent-filter>
  </receiver>
同时要加上权限。
[html] <uses-permission Android:name="Android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission Android:name="Android.permission.RECEIVE_SMS"></uses-permission>

这样,我们运行程序后,只要有短信接收,SMSAddress和SMSContent就会被赋值。


这里顺便补充一个知识点,关于Eclipse程序的。
相信很多初学者不知道,Eclipse自带一个发短信插件,可以实现给虚拟机发送短信。这样,我们在做短信应用的时候,就不用同时启动多台虚拟机了……
如何操作呢?方法如下。
1.点击菜单栏中的 Window 窗口。
2.找到哦啊其中的 Show View 目录。
3. 选择 Other...。
  



然后我们发现会弹出一个窗口。
  



4,为了便于操作,我们在弹出的窗口的搜索栏中,直接输入 Emulator Control。
  



5.点击列表中的 Emulator Control,再点OK;或者直接双击。

这样就出现了一个窗口,其中有很多参数。
其他的以后有机会再做介绍,我们这次至用到其中4个。
  




如图所示,我们只需要输入对应的参数,选择需要的类型,最后点发送就可以了。

PS:有的人奇怪为什么灰色,没法输入,没法选择,那是因为你没有选中模拟器。这个插件只能同时给一个模拟器发送消息。关于模拟器的选择,和调用Emulator Control的方法差不多,区别只是在输入Emulator Control的时候输入 Devices 就可以了。你当前选中哪个模拟器了,就会给哪个模拟器发送消息,不需要输入模拟器号码。


喜欢0 评分0
游客

返回顶部