获取当前短信内容或部分匹配内容

这是本人的第一篇csdn的博客,之前在新浪弄过一些,写的不好,望海涵!!!

转载请注明出处:http://blog.csdn.net/daogepiqian/article/details/47447065

对于理论知识,网上一搜一大堆,这里本人只介绍简单的实现和本人做的小demo。


方式一:通过广播监听短信消息

(注意:这种方式只对新收到的短消息有效,运行代码,并不会读取收件箱中已读或未读的消息,只有当收到新来的短消息时,才会执行onChange方法)


注册一个广播:


  1. <receiver android:name=".SmsReciver" >  
  2.            <intent-filter android:priority="999">  
  3.                <action android:name="android.provider.Telephony.SMS_RECEIVED" />  
  4.            </intent-filter>  
  5.        </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


  1. public class SmsReciver extends BroadcastReceiver {  
  2.   
  3.     @Override  
  4.     public void onReceive(Context context, Intent intent) {  
  5.         Bundle bundle = intent.getExtras();  
  6.         SmsMessage msg = null;  
  7.         if (null != bundle) {  
  8.             Object[] smsObj = (Object[]) bundle.get("pdus");  
  9.             for (Object object : smsObj) {  
  10.                 msg = SmsMessage.createFromPdu((byte[]) object);  
  11.             Date date = new Date(msg.getTimestampMillis());//时间  
  12.                 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  13.                 String receiveTime = format.format(date);  
  14.                 System.out.println("number:" + msg.getOriginatingAddress()  
  15.                 + "   body:" + msg.getDisplayMessageBody() + "  time:"  
  16.                         + msg.getTimestampMillis());  
  17.                   
  18.                 //在这里写自己的逻辑  
  19.                 if (msg.getOriginatingAddress().equals("10086")) {  
  20.                     //TODO  
  21.                       
  22.                 }  
  23.                   
  24.             }  
  25.         }  
  26.     }  
  27.   
  28. }  
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()来显示短信内容(主要是为了省事偷笑), 有其他需求的请自行修改。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值