您的位置:首页 > 移动开发 > Android开发

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

2015-08-12 16:40 471 查看
这是本人的第一篇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()来显示短信内容(主要是为了省事

), 有其他需求的请自行修改。






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息