MainActivity例如以下:

package cc.testsmslistener;

import cc.testsmslistener.SMSContentObserver.MessageListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
import android.app.Activity;
/**
* Demo描写叙述:
* 利用ContentObserver实现短信监听
*
* 注意权限:
* <uses-permission android:name="android.permission.READ_SMS" />
*
* 參考资料:
* http://blog.csdn.net/peijiangping1989/article/details/7368178
* Thank you very much
*
*/
public class MainActivity extends Activity {
private TextView mTextView;
//全部短信
public static final String URI = "content://sms/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
} private void init() {
mTextView=(TextView) findViewById(R.id.textView); //注冊内容观察者
SMSContentObserver smsContentObserver =
new SMSContentObserver(new Handler(),this); this.getContentResolver().registerContentObserver
(Uri.parse(URI), true, smsContentObserver); //回调
smsContentObserver.setOnReceivedMessageListener(new MessageListener() {
@Override
public void OnReceived(String message) {
mTextView.setText(message);
}
});
} }

SMSContentObserver例如以下:

package cc.testsmslistener;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
public class SMSContentObserver extends ContentObserver {
//全部短信
public static final String SMS_URI_ALL = "content://sms/";
//收件箱短信
public static final String SMS_URI_INBOX = "content://sms/inbox";
//发件箱短信
public static final String SMS_URI_SEND = "content://sms/sent";
//草稿箱短信
public static final String SMS_URI_DRAFT = "content://sms/draft";
private Activity mActivity;
private List<SmsInfo> mSmsInfoList;
private MessageListener mMessageListener; public SMSContentObserver(Handler handler, Activity activity) {
super(handler);
this.mActivity = activity;
} @Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Uri uri = Uri.parse(SMS_URI_INBOX);
mSmsInfoList = this.getSmsInfo(uri,mActivity);
mMessageListener.OnReceived(mSmsInfoList.get(0).getSmsbody());
System.out.println("Message content is:"+mSmsInfoList.get(0).getSmsbody());
System.out.println("Message info is:"+mSmsInfoList.get(0));
} /**
* 注意:
* 该处仅仅用依照时间降序取出第一条就可以
* 这条当然是最新收到的消息
*/
private List<SmsInfo> getSmsInfo(Uri uri,Activity activity){
List<SmsInfo> smsInfoList=new ArrayList<SmsInfo>();
String[] projection = new String[] { "_id", "address", "person","body", "date", "type" };
Cursor cusor = activity.managedQuery(uri, projection, null, null,"date desc limit 1");
int nameColumn = cusor.getColumnIndex("person");
int phoneNumberColumn = cusor.getColumnIndex("address");
int smsbodyColumn = cusor.getColumnIndex("body");
int dateColumn = cusor.getColumnIndex("date");
int typeColumn = cusor.getColumnIndex("type");
if (cusor != null) {
while (cusor.moveToNext()) {
SmsInfo smsinfo = new SmsInfo();
smsinfo.setName(cusor.getString(nameColumn));
smsinfo.setDate(cusor.getString(dateColumn));
smsinfo.setPhoneNumber(cusor.getString(phoneNumberColumn));
smsinfo.setSmsbody(cusor.getString(smsbodyColumn));
smsinfo.setType(cusor.getString(typeColumn));
smsInfoList.add(smsinfo);
}
cusor.close();
}
System.out.println("smsInfoList.size()="+smsInfoList.size());
return smsInfoList;
} // 回调接口
public interface MessageListener {
public void OnReceived(String message);
} public void setOnReceivedMessageListener(
MessageListener messageListener) {
this.mMessageListener=messageListener;
}
}

SmsInfo例如以下:

package cc.testsmslistener;
public class SmsInfo {
//短信内容
private String smsbody;
//发送短信的电话号码
private String phoneNumber;
//发送短信时间
private String date;
//发送短信人的姓名
private String name;
//短信类型1是接收到的,2是已发出
private String type; public String getSmsbody() {
return smsbody;
} public void setSmsbody(String smsbody) {
this.smsbody = smsbody;
} public String getPhoneNumber() {
return phoneNumber;
} public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
} public String getDate() {
return date;
} public void setDate(String date) {
this.date = date;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getType() {
return type;
} public void setType(String type) {
this.type = type;
} @Override
public String toString() {
return "SmsInfo [smsbody=" + smsbody + ", phoneNumber=" + phoneNumber
+ ", date=" + date + ", name=" + name + ", type=" + type + "]";
} }

main.xml例如以下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
> <TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"
android:layout_centerInParent="true"
/> </RelativeLayout>

Android短信监听(二)——利用ContentObserver实现短信监听的更多相关文章

  1. Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等

    本文属于原创,转载请著名出处:http://flysnow.iteye.com/blog/906770 写道 在我们开发一些如短消息.应用商店等应用时,会考虑在短消息的图标上加上未读短信的数量,在应用 ...

  2. Android service 服务的应用之电话监听器以及短信监听器

    首先建立一个项目工程文件,如下图所示:

  3. WebView使用详解(二)——WebViewClient与常用事件监听

      登录|注册     关闭 启舰 当乌龟有了梦想……       目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书      免费直播:AI时代,机器学习如何入门?      程序员8 ...

  4. android模拟器用命令和DDMS模拟来电和短信

    以下方法均测试成功 一.用命令模拟 (一).模拟来电 1.打开命令行cmd,输入telnet 回车.   2.然后输入 o localhost 5554 回车,连到Emulator上.    3.输入 ...

  5. 【Android开发VR实战】二.播放360&#176;全景视频

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53924006 本文出自[DylanAndroid的博客] [Android开发 ...

  6. 二维码及二维码接合短URL的应用

    二维码 1.什么是二维码? 二维条形码,最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0 ...

  7. Android系统--输入系统(二)必备Linux知识_实现inotify_epoll.c

    Android系统--输入系统(二)必备Linux知识_实现inotify_epoll.c 课后作业 1. 编写 inotify_epoll.c, 用它来监测tmp/目录: 有文件被创建/删除, 有文 ...

  8. Android之自定义生成彩色二维码

    先导个zxing.jar包 下面是xml布局 activity_main.xml <RelativeLayout xmlns:android="http://schemas.andro ...

  9. VB短信猫开发包,支持超长短信

    一.短信猫开发包(长短信/异步调用)说明:   短信猫开发包以OCX控件的形式提供,支持Windows平台下常用的开发工具:如VB.VB.net.VC++.Power Builder.C#.DELPH ...

随机推荐

  1. 手机访问php环境移动端静态页面

    痛点 在做一个移动端H5页面,手机要调试访问,不方便.就想说能不能手机连接电脑的php项目,进行调试修改. 需要 手机要跟电脑同处在同个局域网中,公司的话一般是局域网,实在没有的话花个20块买个随身W ...

  2. 浅析SSH核心原理(二)

    Hibernate是一个开放源代码的ORM(对象-关系映射)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任 ...

  3. 【Unity 3D】使用 2DToolkit 插件 制作2D精灵动画

    话说博客传图也太麻烦了吧,一个一个文件一个一个传....为什么不能直接粘贴了,自动上传呢... 刚直接粘贴了,结果一张图没有,又重新截一次图,在传了一次...真是太**了 好了,吐槽完了,开始博客吧 ...

  4. QString与中文,QString与std::wstring的相互转换(使用fromStdWString和u8关键字)

    Qt版本:5.5.1 Qt的QString功能丰富,对非英语语言的支持也不是问题,但支持得不够直接.例如,像 ? 1 QString str("死亡使者赛维"); 这样直接用带中文 ...

  5. [免费活动通知]RAD Studio XE8 技术研讨会(上海、成都)

     活动类型:免费研讨会 报名链接: http://forms.embarcadero.com/AP15Q3CNRADStudioDeepDiveSeminar 上海 2015 年 8 月 13 日 ...

  6. 微软Ajax--UpdatePanel控件

    今天用做日历显示本月的考勤记录,用到了UpdatePanel控件,才发现对这个控件并不太了解,所以找了点儿资料,整理了一下给大家发上来! 一.UpdatePanel的结构 <asp:Script ...

  7. Axure RP中线条的设置

    文章来源与网络 来自:非原型不设计

  8. codility上的问题(15) Xi 2012

    进入2012年的题 codility上的题目开始变难,变得有意思起来.给定两个长度在[1..300000]的只包含0和1的串S和T,它们是2进制表示的,S表示的数A不大于T表示的数B,即A<=B ...

  9. Rationnal Rose2003安装并破解

    1.安装Rational Rose2003时,在需选择安装项的时候,只选择Rational Rose EnterPrise Edition即可,不需选择其他项,之后选择“DeskTop Install ...

  10. vue.js+boostrap

    vue.js+boostrap最佳实践 一.为什么要写这篇文章 最近忙里偷闲学了一下vue.js,同时也复习了一下boostrap,发现这两种东西如果同时运用到一起,可以发挥很强大的作用,boostr ...