由于监听系统短信广播受到权限的限制,所以很多手机可能使用这种方式没法监听广播,从而没办法获取到系统短信,所以又重新开辟一条路。

Android监听系统短信数据库内容变化使用场景:

1、监听短信数据库的变化,添加删除修改,变化的时候会回调onChange方法

2、提取刚刚变化的那条短信的内容

备注:

1、这种方式虽然一开始能够监听到数据变化,但是要判断是刚刚接手到的短信,还需要做一些处理,具体看代码

2、这种方式需要从数据库里面去读取刚刚加入的那条短信,所以需要读取数据库权限,会弹出系统的权限申请框,所以注意使用时机

import android.content.ContentResolver;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.text.TextUtils; /**
* 数据库观察者
*/
public class SmsDatabaseChaneObserver extends ContentObserver {
// 只检查收件箱
public static final Uri MMSSMS_ALL_MESSAGE_URI = Uri.parse("content://sms/inbox");
public static final String SORT_FIELD_STRING = "_id asc"; // 排序
public static final String DB_FIELD_ID = "_id";
public static final String DB_FIELD_ADDRESS = "address";
public static final String DB_FIELD_PERSON = "person";
public static final String DB_FIELD_BODY = "body";
public static final String DB_FIELD_DATE = "date";
public static final String DB_FIELD_TYPE = "type";
public static final String DB_FIELD_THREAD_ID = "thread_id";
public static final String[] ALL_DB_FIELD_NAME = {
DB_FIELD_ID, DB_FIELD_ADDRESS, DB_FIELD_PERSON, DB_FIELD_BODY,
DB_FIELD_DATE, DB_FIELD_TYPE, DB_FIELD_THREAD_ID };
public static int mMessageCount = -1; private static final long DELTA_TIME = 60 * 1000;
private ContentResolver mResolver; public SmsDatabaseChaneObserver(ContentResolver resolver, Handler handler) {
super(handler);
mResolver = resolver;
} @Override
public void onChange(boolean selfChange) {
onReceiveSms();
}
private void onReceiveSms() {
Cursor cursor = null;
// 添加异常捕捉
try {
cursor = mResolver.query(MMSSMS_ALL_MESSAGE_URI, ALL_DB_FIELD_NAME,
null, null, SORT_FIELD_STRING);
final int count = cursor.getCount();
if (count <= mMessageCount) {
mMessageCount = count;
return;
}
// 发现收件箱的短信总数目比之前大就认为是刚接收到新短信---如果出现意外,请神保佑
// 同时认为id最大的那条记录为刚刚新加入的短信的id---这个大多数是这样的,发现不一样的情况的时候可能也要求神保佑了
mMessageCount = count;
if (cursor != null) {
cursor.moveToLast();
final long smsdate = Long.parseLong(cursor.getString(cursor.getColumnIndex(DB_FIELD_DATE)));
final long nowdate = System.currentTimeMillis();
// 如果当前时间和短信时间间隔超过60秒,认为这条短信无效
if (nowdate - smsdate > DELTA_TIME) {
return;
}
final String strAddress = cursor.getString(cursor.getColumnIndex(DB_FIELD_ADDRESS)); // 短信号码
final String strbody = cursor.getString(cursor.getColumnIndex(DB_FIELD_BODY)); // 在这里获取短信信息
final int smsid = cursor.getInt(cursor.getColumnIndex(DB_FIELD_ID));
if (TextUtils.isEmpty(strAddress) || TextUtils.isEmpty(strbody)) {
return;
}
// 得到短信号码和内容之后进行相关处理
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
try { // 有可能cursor都没有创建成功
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}

下面是对数据库观察者的注册,使用方式与广播类似,生命周期也需要自己控制,结合自己使用的Activity或者Service的生命周期来进行控制。

public static final Uri SMS_MESSAGE_URI = Uri.parse("content://sms");
private static SmsDatabaseChaneObserver mSmsDBChangeObserver;
private static void registerSmsDatabaseChangeObserver(ContextWrapper contextWrapper) {
//因为,某些机型修改rom导致没有getContentResolver
try {
SmsDatabaseChaneObserver = new SmsDatabaseChaneObserver(contextWrapper.getContentResolver(), new Handler());
contextWrapper.getContentResolver().registerContentObserver(SMS_MESSAGE_URI, true, mSmsDBChangeObserver);
} catch (Throwable b) {
}
} private static void unregisterSmsDatabaseChangeObserver(ContextWrapper contextWrapper) {
try {
contextWrapper.getContentResolver().unregisterContentObserver(SmsDatabaseChaneObserver);
} catch (Exception e) {
e.printStackTrace();
}
}

监听一般放在Service中,所以需要在Service时创建时注册监听,Service销毁时取消监听

Android监听系统短信数据库变化-提取短信内容的更多相关文章

  1. Android短信监听实现,及Android4.4之后短信机制变更

    前阵子公司有一个项目,简单的监听短信应用,功能只有如下两个: 1.监听短信并获取短信内容上传服务器: 2.从服务器获取短信内容,发送出去    按照传统的思路,监听短信我们有两种方式:第一种是使用广播 ...

  2. android 监听短信并发送到服务器

    1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. 2. 应用观察者模式,监听短信数据库,操作短信内容.   实例如下: SystemE ...

  3. 黎活明8天快速掌握android视频教程--21_监听ContentProvider中数据的变化

    采用ContentProvider除了可以让其他应用访问当前的app的数据之外,还有可以实现当app的数据发送变化的时候,通知注册了数据变化通知的调用者 其他所有的代码都和第20讲的一样,不同的地方看 ...

  4. Android 监听 Android中监听系统网络连接打开或者关闭的实现代码

    本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...

  5. Android 监听网络变化

    Android 监听网络变化

  6. Android监听手机网络变化

    Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...

  7. 广播小案例-监听系统网络状态 --Android开发

    本例通过广播实现简单的监听系统网络状态改变的小案例. 1.案例效果演示 当手机连网后,系统提示“已连接网络”, 当手机断网后,系统提示“当前网络不可用”. 2.案例实现 在主活动中动态注册广播,然后写 ...

  8. Android 监听ContentProvider的数据改变

    今天介绍一下怎么监听ContentProvider的数据改变,主要的方法是:getContext().getContentResolver().notifyChange(uri,null),这行代码是 ...

  9. Android监听自身卸载,弹出用户反馈调查

    1,情景分析 在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底.这篇博客,我将讲述一下一个各 ...

随机推荐

  1. html 5 实现拖放效果

    在html5中要实现拖放操作,相对于以前通过鼠标操作实现,要简单得多,数据安全性也更有保障.只需要以下几步即可. 给被拖拽元素添加draggable属性,如果是文件拖放. 在拖拽元素的dragstar ...

  2. 开始研究unreal4了

    最后一个周末了,昨天去做了许多事,算是对最近的一些整理和了结吧.早上广州下雨了,9点起来吃了早餐之后又睡了1个小时.中午吃了泡面,幸福感max.晚上煎了菜脯蛋和肉卷,拖着拉着把<旋风十一人> ...

  3. perl 删除过期文件

    #!/usr/bin/perl `find /bak/ >list.txt`; open LIST,"/root/list.txt"; while (<LIST> ...

  4. 解读ASP.NET 5 & MVC6系列(6):Middleware详解

    在第1章项目结构分析中,我们提到Startup.cs作为整个程序的入口点,等同于传统的Global.asax文件,即:用于初始化系统级的信息(例如,MVC中的路由配置).本章我们就来一一分析,在这里如 ...

  5. Python黑帽编程 3.3 MAC洪水攻击

    Python灰帽编程 3.3 MAC洪水 传统的交换机(我只对我目前使用的交互机做过测试,按照常识只能这样表述)在数据转发过程中依靠对CAM表的查询来确定正确的转发接口,一旦在查询过程中无法找到相关目 ...

  6. angularjs 指令详解 - template, restrict, replace

    通过指令机制,angularjs 提供了一个强大的扩展系统,我们可以通过自定义指令来扩展自己的指令系统. 怎样定义自己的指令呢? 我们通过 Bootstrap UI来学习吧.这个项目使用 angula ...

  7. 探索C#之布隆过滤器(Bloom filter)

    阅读目录: 背景介绍 算法原理 误判率 BF改进 总结 背景介绍 Bloom filter(后面简称BF)是Bloom在1970年提出的二进制向量数据结构.通俗来说就是在大数据集合下高效判断某个成员是 ...

  8. 【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信

    在工控测试系统中,经常需要使用到各类程控仪器,这些程控仪器通常具有GPIB.LAN.USB等硬件接口,计算机通过这些接口能够与其通信,从而实现自动测量.数据采集.数据分析和数据处理等操作.本文主要介绍 ...

  9. JQuery学习思维导图版

    常用UI资源 参考资料:Jquery教程 dataTables:教程  中文教程 Wizard:教程 Jquery UI demos:教程 selectmenu:教程 jquery-slider:教程 ...

  10. Android开发学习之路-Handler消息派发机制源码分析

    注:这里只是说一下sendmessage的一个过程,post就类似的 如果我们需要发送消息,会调用sendMessage方法 public final boolean sendMessage(Mess ...