免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1345 | 回复: 0
打印 上一主题 下一主题

[Android] Android接收短信 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-27 14:21 |只看该作者 |倒序浏览
Android收到短信时会广播android.provider.Telephony.SMS_RECEIVED消息,因此只要定义一个Receiver,收听该消息,就能接收短信。
  1. <receiver android:name=".smsReceiver" >
  2.     <intent-filter>  
  3.         <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  4.     </intent-filter>
  5. </receiver>
复制代码
还可以为intent-filter加上一个优先级:
  1. <intent-filter android:priority="100">
复制代码
这样,由于优先级较高,应用将先于系统接收到android.provider.Telephony.SMS_RECEIVED消息。

Java文件:
  1. package com.hzhi.smsReceiver;

  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;

  4. import android.content.BroadcastReceiver;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.os.Bundle;
  8. import android.telephony.SmsMessage;
  9. import android.util.Log;

  10. public class smsReceiver extends BroadcastReceiver {
  11.     @Override
  12.     public void onReceive(Context context, Intent intent) {
  13.           // 短信内容
  14.      StringBuilder strBody = new StringBuilder();
  15.          // 短信时间
  16.      String strTime = new String();
  17.          // 短信发件人
  18.      StringBuilder number = new StringBuilder();
  19.      SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  20.      Bundle bundle = intent.getExtras();
  21.      if (bundle != null) {
  22.          Object[] _pdus = (Object[]) bundle.get("pdus");
  23.          SmsMessage[] message = new SmsMessage[_pdus.length];
  24.          for (int i = 0; i < _pdus.length; i++) {
  25.              message[i] = SmsMessage.createFromPdu((byte[]) _pdus[i]);
  26.           }
  27.          for (SmsMessage currentMessage : message) {
  28.              strBody.append(currentMessage.getDisplayMessageBody());
  29.              number.append(currentMessage.getDisplayOriginatingAddress());
  30.              strTime = formatter.format(new Date(currentMessage.getTimestampMillis()));
  31.          }
  32.          String smsBody = strBody.toString();
  33.          String smsNumber = number.toString();
  34.          Log.v("NUMBER=", smsNumber);
  35.          Log.v("TIME=", strTime);
  36.          Log.v("BODY=", smsBody);
  37.          // 取消消息
  38.          this.abortBroadcast();
  39.         }
  40.     }     
  41. }
复制代码
接收到消息后,通过Intent.getExtras()方法获得Intent的Extras(Bundle变量),再使用Bundle.get("pdus")得到短信数组。为什么是短信数组呢?这是因为有些短信内容比较长,所以需要一个数组来存储。对数组中的每一个元素,再分别取出短信内容、短信来源号码、短信时间。其中,这些元素的短信来源号码和短信时间都是一样的,短信内容不一样,需要拼接起来,构成一条完整的短信的内容。

最后,this.abortBroadcast()取消android.provider.Telephony.SMS_RECEIVED消息。如果为intent-filter设置了较高的优先级,应用先于系统接收到android.provider.Telephony.SMS_RECEIVED消息,然后再将该消息丢弃,这样,系统就不会收到android.provider.Telephony.SMS_RECEIVED消息,也不会发出短信的提示音、震动等。如果没有设置优先级,系统将首先收到android.provider.Telephony.SMS_RECEIVED消息,发出短信的提示音、震动等,然后应用再收到短信。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP