这是本人的第一篇csdn的博客,之前在新浪弄过一些,写的不好,望海涵!!!
转载请注明出处:http://blog.csdn.net/daogepiqian/article/details/47447065
对于理论知识,网上一搜一大堆,这里本人只介绍简单的实现和本人做的小demo。
方式一:通过广播监听短信消息
(注意:这种方式只对新收到的短消息有效,运行代码,并不会读取收件箱中已读或未读的消息,只有当收到新来的短消息时,才会执行onChange方法)
注册一个广播:
- <receiver android:name=".SmsReciver" >
- <intent-filter android:priority="999">
- <action android:name="android.provider.Telephony.SMS_RECEIVED" />
- </intent-filter>
- </receiver>
<receiver android:name="com.dbjtech.acbxt.waiqin.SmsReciver" >
<intent-filter android:priority="999">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
SmsReceiver.java
- public class SmsReciver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- Bundle bundle = intent.getExtras();
- SmsMessage msg = null;
- if (null != bundle) {
- Object[] smsObj = (Object[]) bundle.get("pdus");
- for (Object object : smsObj) {
- msg = SmsMessage.createFromPdu((byte[]) object);
- Date date = new Date(msg.getTimestampMillis());//时间
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String receiveTime = format.format(date);
- System.out.println("number:" + msg.getOriginatingAddress()
- + " body:" + msg.getDisplayMessageBody() + " time:"
- + msg.getTimestampMillis());
- //在这里写自己的逻辑
- if (msg.getOriginatingAddress().equals("10086")) {
- //TODO
- }
- }
- }
- }
- }
public class SmsReciver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage msg = null;
if (null != bundle) {
Object[] smsObj = (Object[]) bundle.get("pdus");
for (Object object : smsObj) {
msg = SmsMessage.createFromPdu((byte[]) object);
Date date = new Date(msg.getTimestampMillis());//时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String receiveTime = format.format(date);
System.out.println("number:" + msg.getOriginatingAddress()
+ " body:" + msg.getDisplayMessageBody() + " time:"
+ msg.getTimestampMillis());
//在这里写自己的逻辑
if (msg.getOriginatingAddress().equals("10086")) {
//TODO
}
}
}
}
}
系统的这个广播是有序广播,就是当别的程序先获取到了这个广播再传递给你,当然它也可以干掉这个广播,让你接收不到,这样你的程序肯定是接收不到这个广播的了。我们发现,通过设置priority的数值,其实有时是不管用的,现在在一些定制的系统或是有安全软件的情况下,往往短消息都被截取到,并被干掉。
那么,我们只能使用方法二,监听短信数据库的变化,这种方式比方法一稍微复杂一些,不过使用起来也很方便,不受其它程序干扰~
方式二:通过短信数据库获取短信内容
1.要获取短信内容,首先需要用到ContentObserver这个类;顾名思义就是一个内容的观察者,当有内容变化是就会触发。
2.改写onchange方法,添加需要做的动作,就是当收到短信后的动作。
Pattern就是要判断的内容,也就是正则表达式。参考:http://blog.csdn.net/gf771115/article/details/6210652
Matcher就是查找是否匹配,matcher.find是查找时候含有要判断的内容。Matcher.match是完全匹配。
3.注册监听:
Uri smsUri = Uri.parse("content://sms");
this.getContentResolver().registerContentObserver(smsUri, true, observer);
4、 getColumnIndex(“body”)是获取短信的内容。
5.还有就是记得修改AndroidManifest.xml的权限:
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
代码如下:
public class SMSContentObserver extends ContentObserver {
public SMSContentObserver(Context context,Handler handler) {
super(handler);
this.mContext =context;
this.mHandler = handler;
// TODO Auto-generated constructor stub
}
private Context mContext;
private Handler mHandler;
private Cursor c = null;
@Override
public boolean deliverSelfNotifications() {
return true;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
findFirst();
}
public boolean isMySMS(String sms) {
sms = sms.trim();
Pattern p = Pattern.compile(targetToFind);
Matcher m = p.matcher(sms);
return m.find();
}
public void findFirst(){
Uri inBoxUri = Uri.parse("content://sms/");
c = mContext.getContentResolver().query(inBoxUri, null, null, null, "date desc");
if (c != null){
StringBuffer sb = new StringBuffer();
//查找第一个短信内容
while(c.moveToNext()){
//获取短信内容
sb.append(c.getString(c.getColumnIndex("body")));//
faild = sb.toString();
if (!TextUtils.isEmpty(sb.toString())){
break;
}
}
c.close();
if (isMySMS(sb.toString())){
Message msg = new Message();
msg.what = 011;
mHandler.sendMessage(msg);
}
else
{
Message msg = new Message();
msg.what = 012;
mHandler.sendMessage(msg);
}
}
else
Log.i(tag,"c is null");
}
}
转载请注明出处:http://blog.csdn.net/daogepiqian/article/details/47447065
demo下载 http://download.csdn.net/detail/daogepiqian/8996631
提示:注册监听没有加入demo,需要监听短信变化的在代码中加入
Uri smsUri = Uri.parse("content://sms");
this.getContentResolver().registerContentObserver(smsUri, true, observer);
就可以了,请根据需要自行修改!!!
本文的demo在已经收到短信后调用findFirst()来显示短信内容(主要是为了省事), 有其他需求的请自行修改。