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. 9天快速入门java

    Java入门教程[9天快速入门JAVA] §1.3.简单的Java程序 下面我们先介绍两个简单的Java程序,并对其进行分析. 例1.1. public class HelloWorldApp{//a ...

  2. Windows Azure 安全最佳实践 - 第 7 部分:提示、工具和编码最佳实践

    在撰写这一系列文章的过程中,我总结出了很多最佳实践.在这篇文章中,我介绍了在保护您的WindowsAzure应用程序时需要考虑的更多事项. 下面是一些工具和编码提示与最佳实践: · 在操作系统上运行 ...

  3. 基于visual Studio2013解决C语言竞赛题之1004平均值

     题目 解决代码及点评 /************************************************************************/ /* 4. 编一个程序, ...

  4. Perl 面向对象编程的两种实现和比较:

    <pre name="code" class="html">https://www.ibm.com/developerworks/cn/linux/ ...

  5. linux-0.11抠代码-bootsect

    //bootfun.s .global asm_message .global asm_memmove .global asm_readsector .global asm_checkLBA .cod ...

  6. iOS &quot;The sandbox is not in sync with the Podfile.lock&quot;解决方式

    更新Cocoapod之后出现故障: diff: /../Podfile.lock: No such file or directory diff: Manifest.lock: No such fil ...

  7. ubuntu下使用charles代理

    charles 最新的版本是3.10,但是这个版本还没有license可以用,所以使用3.9.2版本. 解压缩包就可以用了. 如果只是代理http请求,只要设置: Proxy -> Proxy ...

  8. 初入Android--Activate生命周期

    Activate的主要生命周期 (注意:这只是主要的生命周期,而不是完整的生命周期方法,其中的两个周期之间可能还执行了其他的一些方法) 每个时刻在屏幕上的状态 进入onCreate方法:Activat ...

  9. 【linux】 Makefile之make menuconfig /uImage

      欢迎转载,转载时请保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http: ...

  10. 基于jquery-easyui的仓库管理系统

    使用jQuery EasyUI创建的仓库管理系统包括系统管理.数据维护.业务单据管理等,有兴趣可以对其进行修改扩展. 数据库采用MYSQL, 帐号/密码:root/root,演示登录帐号/密码:adm ...