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. javascript笔记整理(对象的继承顺序、分类)

    Object.prototype.say=function(){ alert("我是顶层的方法"); } children.prototype=new parent(); pare ...

  2. 三种java 去掉字符串中的重复字符函数

    三种java 去掉字符串中的重复字符函数 public static void main(string[] args) { system.out.println(removerepeatedchar( ...

  3. 金额的计算BigDecimal类

    金额的计算BigDecimal类 double d = 9.84; double d2 = 1.22; //注意需要使用BigDecimal(String val)构造方法 BigDecimal bi ...

  4. Can't call commit when autocommit=true(转)

    java.sql.SQLException: Can't call commit when autocommit=true at com.mysql.jdbc.SQLError.createSQLEx ...

  5. attachEvent和addEventListener详解

    attachEvent方法可以动态的为网页内的元素添加一个事件.通常你想为某个按扭添加一个单击事件时.你都会在按扭内写上onclick=事件名称.使用attachEvent则不必这样做.你把写好的事件 ...

  6. HDU 4882 ZCC Loves Codefires(贪心)

     ZCC Loves Codefires Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  7. MVC简单分页

    对Car汽车表分页 实现简单分页,放在这里方便查看回顾,自定义每页几条有点问题,有待完善······ 1.新建mvc项目 2.添加linq to sql 数据库连接 3.添加CarBF类 using ...

  8. 高性能JavaScript模板引擎原理解析

    随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC ...

  9. Mac 10.10 下安装jdk 1.7 以上

    mac 会默认的给用户安装1.6,1.6 以上的版本安装的时候就总是会提示错误问题 根据网上的安装方法,这里也总结下 首先确定挂载在mac上了 然后输入命令 (目前使用的jdk1.7Update67) ...

  10. 腾讯公司数据分析岗位的hadoop工作 线性回归 k-means算法 朴素贝叶斯算法 SpringMVC组件 某公司的广告投放系统 KNN算法 社交网络模型 SpringMVC注解方式

    腾讯公司数据分析岗位的hadoop工作 线性回归 k-means算法 朴素贝叶斯算法 SpringMVC组件 某公司的广告投放系统 KNN算法 社交网络模型 SpringMVC注解方式 某移动公司实时 ...