获取当前短信内容或部分匹配内容
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>
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
}
}
}
}
}
系统的这个广播是有序广播,就是当别的程序先获取到了这个广播再传递给你,当然它也可以干掉这个广播,让你接收不到,这样你的程序肯定是接收不到这个广播的了。我们发现,通过设置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()来显示短信内容(主要是为了省事
), 有其他需求的请自行修改。
转载请注明出处: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()来显示短信内容(主要是为了省事
), 有其他需求的请自行修改。
相关文章推荐
- javascript demo 基本技巧
- csdn 批量接受好友邀请
- MSDN|CSDN|PUDN的意思
- csdn 博客的css样式 v3
- Python制作CSDN免积分下载器
- 基于 laravel 4.1 的简易博客实例
- lomox旧版 的一个demo集合,里面有界面demo源码
- spring传播特性解惑
- [新闻资讯]CSDN数据库被爆,已经报案,大家尽早修改密码
- [转]CSDN 2011程序员薪资调查报告全文发布
- DEMO Spring 2010 获奖产品
- pisa python xhtml2pdf demo
- 深入理解Java7笔记一
- java用JXL读取excle文件(demo)示例代码
- JSON案例
- SSO单点登录Spring-Security+CAS+使用手册.doc
- textmate开发一个blog
- Silverlight现有的一部分Demo
- Node.js学习笔记一
- 利用Sharepoint2010进行全文搜索的一个Demo