Android开发之监听发出的短信
执行效果图:
预备知识:
为了监听指定的ContentProvider的数据的改变,须要通过ContentResolver向指定Uri注冊CotentObserver监听器。ContentResolver提供了例如以下方法来注冊监听器:
publicfinal void registerContentObserver(Uriuri, boolean notifyForDescendents, ContentObserver observer)
參数:uri :该监听器所监听的ContentProvider的Uri。
notifyForDescendents :为false 表示精确匹配。即仅仅匹配该Uri,为true 表示能够同一时候匹配其派生的Uri。
observer:ContentObserver派生的监听器实例。
取消注冊监听器:
public finalvoid unregisterContentObserver(ContentObserver observer)
功能:取消对给定Uri的观察
參数: observer ContentObserver的派生类实例。
ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些对应的处理,它类似于数据库技术中的触发器(Trigger)。当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器。对应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有
关的。
ContentObserver类介绍:
接收回调的更改内容。
必须由被加入到一个ContentObservable对象实现。
构造方法:
|
Public Constructors |
|
|
ContentObserver(Handler handler) onChange() will happen on the provider Handler. |
|
说明:全部 ContentObserver的派生类都须要调用该构造方法
參数:handler Handler对象。能够是主线程Handler(这时候能够更新UI 了),也能够是不论什么Handler对象。
经常用法:
|
Public Methods |
|
|
boolean |
deliverSelfNotifications() Returns true if this observer is interested in notifications for changes made through the cursor the observer is registered with. |
|
final void |
dispatchChange(boolean selfChange) |
|
void |
onChange(boolean selfChange) This method is called when a change occurs to the cursor that is being observed. |
说明:
void onChange(booleanselfChange)
功能:当观察到的Uri发生变化时,回调该方法去处理。全部ContentObserver的派生类都须要重载该方法去处理逻辑。
參数:selfChange 回调后。其值一般为false,该參数意义不大(我也不懂。理解方法最重要)。
观察特定Uri的过程例如以下:
1、 创建我们特定的ContentObserver派生类。必须重载父类构造方法。必须重载onChange()方法去处理回调后的功能实现
2、 利用context.getContentResolover()获得ContentResolove对象。接着调用registerContentObserver()方法去注冊内容观察者
如://为content://sms的数据改变注冊监听器getContentResolver().registerContentObserver(Uri.parse
("content://sms"), true,
new SmsObserver(new Handler()));
3、 因为ContentObserver的生命周期不同步于Activity和Service等。因此,在不须要时,须要手动的调用unregisterContentObserver()去取消注冊。
短信相关权限:
<!-- 发送消息-->
<uses-permission android:name="android.permission.SEND_SMS"/>
<!-- 阅读消息-->
<uses-permission android:name="android.permission.READ_SMS"/>
<!-- 写入消息-->
<uses-permission android:name="android.permission.WRITE_SMS" />
<!-- 接收消息 -->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
相关的协议:
content://sms/inbox 收件箱
content://sms/sent 已发送
content://sms/draft 草稿
content://sms/outbox 发件箱
content://sms/failed 发送失败
content://sms/queued 待发送列表
数据库中sms相关的字段及说明:
|
字段 |
说明 |
|
_id |
短信序号,如100 |
|
thread_id |
对话的序号,如100,与同一个手机号互发的短信。其序号是同样的 |
|
address |
发件人地址,即手机号。如+86138138000 |
|
person |
发件人,假设发件人在通讯录中则为详细姓名。陌生人为null |
|
date |
日期。long型,如1346988516。能够对日期显示格式进行设置 |
|
protocol |
协议0SMS_RPOTO短信,1MMS_PROTO彩信 |
|
read |
是否阅读0未读,1已读 |
|
status |
短信状态-1接收,0complete,64pending,128failed |
|
type |
短信类型1是接收到的,2是已发出 |
|
body |
短信详细内容 |
|
service_center |
短信服务中心号码编号。如+8613800755500 |
应用实例:
package com.jph.monitorsms;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
import android.widget.Toast;
import android.app.Activity;
import android.database.ContentObserver;
import android.database.Cursor;
/**
* Describe:</br>
* 获取用户正在发送的短信
* 本实例通过为content://sms的数据改变注冊监听器来
* 获取手机正在发送的消息。 * @author JPH
* Date:2014.07.20
* */
public class MonitorSms extends Activity {
TextView txtView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txtView=(TextView)findViewById(R.id.txtView);
//为content://sms的数据改变注冊监听器
getContentResolver().registerContentObserver(Uri.parse
("content://sms"), true, new SmsObserver(new Handler()));
}
//一个继承自ContentObserver的监听器类
class SmsObserver extends ContentObserver{ public SmsObserver(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
}
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
//查询发送向箱中的短信
Cursor cursor=getContentResolver().query(Uri.parse(
"content://sms/outbox"), null, null, null, null);
//遍历查询结果获取用户正在发送的短信
while (cursor.moveToNext()) {
StringBuffer sb=new StringBuffer();
//获取短信的发送地址
sb.append("发送地址:"+cursor.getString(cursor.getColumnIndex("address")));
//获取短信的标题
sb.append("\n标题:"+cursor.getString(cursor.getColumnIndex("subject")));
//获取短信的内容
sb.append("\n内容:"+cursor.getString(cursor.getColumnIndex("body")));
//获取短信的发送时间
Date date=new Date(cursor.getLong(cursor.getColumnIndex("date")));
//格式化以秒为单位的日期
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒");
sb.append("\n时间:"+sdf.format(date));
System.out.println("查询到的正在发送的短信:"+sb.toString());
Toast.makeText(MonitorSms.this, sb.toString(), Toast.LENGTH_LONG).show();
txtView.setText(sb.toString());
}
super.onChange(selfChange);
} } }
Android开发之监听发出的短信的更多相关文章
- Android开发-之监听button点击事件
一.实现button点击事件的方法 实现button点击事件的监听方法有很多种,这里总结了常用的四种方法: 1.匿名内部类 2.外部类(独立类) 3.实现OnClickListener接口 4.添加X ...
- Android开发14——监听内容提供者ContentProvider的数据变化
一.提出需求 有A,B,C三个应用,B中的数据需要被共享,所以B中定义了内容提供者ContentProvider:A应用修改了B应用的数据,插入了一条数据.有这样一个需求,此时C应用需要得到数据被修改 ...
- android开发事件监听
第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适, ...
- delphi xe5 android 开发实现手机打电话和发短信
转载自 http://www.raysoftware.cn/ 其实都可以通过intent和URI调用系统功能.Windows程序员可以理解成是ShellExecute.这个是万金油.可以有调用各种功 ...
- XE5 Android 开发实现手机打电话和发短信 [转]
其实都可以通过intent和URI调用系统功能.Windows程序员可以理解成是ShellExecute.这个是万金油.可以有调用各种功能.后面会介绍. 1.短信息.很简单 方法a.不使用Intent ...
- android开发学习:打电话和发短信
1.新建一个android项目 File--New--Other--android application project 填写application name(就是应用的名字.比方:天天酷跑) 填写 ...
- adnroid 监听收到的短信并根据短信内容进行回复短信
定义一个广播接收器 public class SMSReceiver extends BroadcastReceiver { private SmsManager smsManager; @Overr ...
- 【Android开发】监听图库数据库的变化
步骤一: 保存图片或者删除之前,初始化ContentObserver ScreenshotContentObserver mScreenObserver = new ScreenshotContent ...
- android 开发,视频群聊引发短信异常
说到 NDK 开发,其实是为了有些时候为了项目需求需要调用底层的一些 C/C++ 的一些东西:另外就是为了效率更加高些. 但是很多时候能不用就不用:这个是啥原因?个人感觉有些时候是觉得麻烦,首先要配置 ...
随机推荐
- Problem E: 可变长数组
Problem E: 可变长数组 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 472 Solved: 368[Submit][Status][Web ...
- java面试题及答案
JAVA相关基础知识1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时 ...
- nodeCZBK-笔记1
[TOC] ****************************** day01 node简介 Node.js是一个让JavaScript运行在服务器端的开发平台. node就是一个js的执行环境 ...
- centos7安装python3和Django后,ModuleNotFoundError: No module named '_sqlite3'
1.准备安装环境 yum groupinstall 'Development Tools' yum install zlib-devel bzip2-devel openssl-devel ncurs ...
- vue 2 仿IOS 滚轮选择器 从入门到精通 (一)
大家好,由于最近从事的是微信公众号和APP内嵌 H5开发,避免不了开发一些和native相同的操作功能,就如接下来说的 仿IOS滚轮选择器. 先来个截图: 接下来具体介绍如何实现的.能力有限避免不了错 ...
- 史上最强学生管理系统之ArrayList版
其实不管是网上或者培训班,都会有学生管理系统的最基础版本,本人也不过是照猫画虎,在某些细节方面进行了一些渲染,使这个最基本的小程序更加人性化和便于利于操作一点,个人愚见,大牛勿喷,欢迎转载(请注明出处 ...
- ajax异步传送数据的方法
1, 此方法为ajax异步发送后台数据的方法 var payment_id=$(this).attr("name"); alert(payment_id); $('.label') ...
- iOS 远程推送消息解析及逻辑处理
关于远程推送的相关配置网上已经有足够多的教程,这里就不复述了.这里讲述当客户端收到推送消息后,应怎样对其进行相应的逻辑处理. 工程的AppDelegate.m文件里提供了如下方法: //当应用程序启动 ...
- iOS设置圆角的方法及指定圆角的位置
在iOS开发中,我们经常会遇到设置圆角的问题, 以下是几种设置圆角的方法: 第一种方法: 通过设置layer的属性 代码: UIImageView *imageView = [[UIImageView ...
- 盘点一下立过的flag并立几个flag
暑假前说了,要学opencv3,要看完冰火,要健身,要家教挣钱. 好样的,全都没落下. opencv3几乎是把80%的demo码了一遍. 冰火看完,还顺带学了一波知识,收获颇丰,搞到了马丁老爷子的几本 ...
