Android监听系统短信数据库变化-提取短信内容
由于监听系统短信广播受到权限的限制,所以很多手机可能使用这种方式没法监听广播,从而没办法获取到系统短信,所以又重新开辟一条路。
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监听系统短信数据库变化-提取短信内容的更多相关文章
- Android短信监听实现,及Android4.4之后短信机制变更
前阵子公司有一个项目,简单的监听短信应用,功能只有如下两个: 1.监听短信并获取短信内容上传服务器: 2.从服务器获取短信内容,发送出去 按照传统的思路,监听短信我们有两种方式:第一种是使用广播 ...
- android 监听短信并发送到服务器
1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. 2. 应用观察者模式,监听短信数据库,操作短信内容. 实例如下: SystemE ...
- 黎活明8天快速掌握android视频教程--21_监听ContentProvider中数据的变化
采用ContentProvider除了可以让其他应用访问当前的app的数据之外,还有可以实现当app的数据发送变化的时候,通知注册了数据变化通知的调用者 其他所有的代码都和第20讲的一样,不同的地方看 ...
- Android 监听 Android中监听系统网络连接打开或者关闭的实现代码
本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...
- Android 监听网络变化
Android 监听网络变化
- Android监听手机网络变化
Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...
- 广播小案例-监听系统网络状态 --Android开发
本例通过广播实现简单的监听系统网络状态改变的小案例. 1.案例效果演示 当手机连网后,系统提示“已连接网络”, 当手机断网后,系统提示“当前网络不可用”. 2.案例实现 在主活动中动态注册广播,然后写 ...
- Android 监听ContentProvider的数据改变
今天介绍一下怎么监听ContentProvider的数据改变,主要的方法是:getContext().getContentResolver().notifyChange(uri,null),这行代码是 ...
- Android监听自身卸载,弹出用户反馈调查
1,情景分析 在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底.这篇博客,我将讲述一下一个各 ...
随机推荐
- html5 炫酷的字幕雨
<!DOCTYPE html> <html> <head> <script src="http://tj.gamee456.com/jquery.1 ...
- 纯jQuery-添加/修改/删除 标签,属性
<h1>通过学习<精彩绝伦的jQuery>与W3C,大致了解JQuery的一些方法.</h1> PS:需要有一些前置条件,比如JQuery源代码,比如html就要有 ...
- [译]MVC网站教程(一):多语言网站框架
本文简介 本博文介绍了 Visual Studio 工具生成的 ASP.NET MVC3 站点的基本框架:怎样实现网站的语言的国际化与本地化功能,从零开始实现用户身份认证机制,从零开始实现用户注册机制 ...
- 自己动手写一个简单的MVC框架(第一版)
一.MVC概念回顾 路由(Route).控制器(Controller).行为(Action).模型(Model).视图(View) 用一句简单地话来描述以上关键点: 路由(Route)就相当于一个公司 ...
- 表格搞定 Asp.net Web 状态管理
最近在网上搜罗了 ASP.NET WEB 状态管理方面的一些内容,终于把这些内容整合总结了一下. 1. 希望自己通过整理,能够掌握一些,为自己投资. 2. 以便自己忘记,又要浪费时间搜罗. 3. 希望 ...
- 七天学会ASP.NET MVC (六)——线程问题、异常处理、自定义URL
本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系列文章 七天学会ASP.NET MVC ...
- C# 的 Dictionary 寫入前應注意事項
一個已上線.用戶龐大的系統,幾個月來第一次出現這個系統錯誤訊息 : 「已經加入含有相同索引鍵的項目」「已添加了具有相同键的项」An item with the same key has already ...
- C语言 · 打印1-200之间的素数
素数定义:除了1和本身再无其他整数可被其本身整除的数称为素数,也称质数. 举一例子打印出1-200之间所有的素数: #include<stdio.h> #include<math.h ...
- Qt5中的信号槽
Qt4中的信号槽 Qt4中的信号槽是通过SIGNAL,SLOT两个宏,将参数转换成字符串.Qt编译前,会从源码的头文件中提取由signal和slot声明的信号和槽的函数, 将其组成一张信号和槽对应的字 ...
- Objective-C 观察者模式--简单介绍和使用
观察者模式(有时又被称为发布-订阅模式) 在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知. 这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来实 ...