Android短信监听(二)——利用ContentObserver实现短信监听
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实现短信监听的更多相关文章
- Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等
本文属于原创,转载请著名出处:http://flysnow.iteye.com/blog/906770 写道 在我们开发一些如短消息.应用商店等应用时,会考虑在短消息的图标上加上未读短信的数量,在应用 ...
- Android service 服务的应用之电话监听器以及短信监听器
首先建立一个项目工程文件,如下图所示:
- WebView使用详解(二)——WebViewClient与常用事件监听
登录|注册 关闭 启舰 当乌龟有了梦想…… 目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书 免费直播:AI时代,机器学习如何入门? 程序员8 ...
- android模拟器用命令和DDMS模拟来电和短信
以下方法均测试成功 一.用命令模拟 (一).模拟来电 1.打开命令行cmd,输入telnet 回车. 2.然后输入 o localhost 5554 回车,连到Emulator上. 3.输入 ...
- 【Android开发VR实战】二.播放360°全景视频
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53924006 本文出自[DylanAndroid的博客] [Android开发 ...
- 二维码及二维码接合短URL的应用
二维码 1.什么是二维码? 二维条形码,最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0 ...
- Android系统--输入系统(二)必备Linux知识_实现inotify_epoll.c
Android系统--输入系统(二)必备Linux知识_实现inotify_epoll.c 课后作业 1. 编写 inotify_epoll.c, 用它来监测tmp/目录: 有文件被创建/删除, 有文 ...
- Android之自定义生成彩色二维码
先导个zxing.jar包 下面是xml布局 activity_main.xml <RelativeLayout xmlns:android="http://schemas.andro ...
- VB短信猫开发包,支持超长短信
一.短信猫开发包(长短信/异步调用)说明: 短信猫开发包以OCX控件的形式提供,支持Windows平台下常用的开发工具:如VB.VB.net.VC++.Power Builder.C#.DELPH ...
随机推荐
- javascript笔记整理(对象的继承顺序、分类)
Object.prototype.say=function(){ alert("我是顶层的方法"); } children.prototype=new parent(); pare ...
- 三种java 去掉字符串中的重复字符函数
三种java 去掉字符串中的重复字符函数 public static void main(string[] args) { system.out.println(removerepeatedchar( ...
- 金额的计算BigDecimal类
金额的计算BigDecimal类 double d = 9.84; double d2 = 1.22; //注意需要使用BigDecimal(String val)构造方法 BigDecimal bi ...
- Can't call commit when autocommit=true(转)
java.sql.SQLException: Can't call commit when autocommit=true at com.mysql.jdbc.SQLError.createSQLEx ...
- attachEvent和addEventListener详解
attachEvent方法可以动态的为网页内的元素添加一个事件.通常你想为某个按扭添加一个单击事件时.你都会在按扭内写上onclick=事件名称.使用attachEvent则不必这样做.你把写好的事件 ...
- HDU 4882 ZCC Loves Codefires(贪心)
ZCC Loves Codefires Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- MVC简单分页
对Car汽车表分页 实现简单分页,放在这里方便查看回顾,自定义每页几条有点问题,有待完善······ 1.新建mvc项目 2.添加linq to sql 数据库连接 3.添加CarBF类 using ...
- 高性能JavaScript模板引擎原理解析
随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC ...
- Mac 10.10 下安装jdk 1.7 以上
mac 会默认的给用户安装1.6,1.6 以上的版本安装的时候就总是会提示错误问题 根据网上的安装方法,这里也总结下 首先确定挂载在mac上了 然后输入命令 (目前使用的jdk1.7Update67) ...
- 腾讯公司数据分析岗位的hadoop工作 线性回归 k-means算法 朴素贝叶斯算法 SpringMVC组件 某公司的广告投放系统 KNN算法 社交网络模型 SpringMVC注解方式
腾讯公司数据分析岗位的hadoop工作 线性回归 k-means算法 朴素贝叶斯算法 SpringMVC组件 某公司的广告投放系统 KNN算法 社交网络模型 SpringMVC注解方式 某移动公司实时 ...