- 浏览: 650044 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (142)
- Android (38)
- hibernate (12)
- java基础 (18)
- spring (5)
- struts1.x (8)
- struts2.x (7)
- web开发 (11)
- tomact (1)
- jbpm3.2 (2)
- jpa (2)
- strutstest (1)
- js (3)
- WebWork (2)
- 数据库 (5)
- mysql (6)
- myeclipse和eclipse (8)
- java与办公 (2)
- linux (10)
- 性能调优 (2)
- 搜索引擎 (1)
- urlrewritefilter (1)
- Git (3)
- Dos (1)
- Chrome (1)
- PLMN (1)
最新评论
-
3xxx:
你这个靠谱。谢谢。
git push用法和常见问题分析 -
lord_is_layuping:
mark
git push用法和常见问题分析 -
calatustela:
@Resource是名字优先注入,可以用来注入Map之类的常量 ...
spring 注解@Resource 和 @Autowired -
Mr.Cheney:
repo sync 下载耗时太久了, 有没有国内的站可下编译环 ...
使用repo下载google 的android4.4 源码,和编译.运行 -
北极光之吻:
kslinabc 写道请问楼主,4.4下载下来有多大,为啥我这 ...
使用repo下载google 的android4.4 源码,和编译.运行
为了看代码方便,一边在网上google资料,一边看Android java 源代码。
偶然发现了一个类MmsSmsDatabaseHelper.java,原来android将所有的短信信息都存入了mmssms.db中。
公开的SDK中没有这个类,不能直接使用。于是自己写了一个SQLiteOpenHelper,但是查询的时候发生SQL异常。
看来不能为所欲为了,不过据网上资料介绍可以拷贝db文件来实现短信数据备份。
既然每个db跟package名相关,建立了一个package为com.android.providers.telephony的工程去试一试,看看能不能成功。
结果输出Please execute 'adb uninstall com.android.providers.telephony' in a shell,android的安全做得很强大啊。
不能直接访问数据库,只能通过协议来访问数据库了,
先贴出相关的协议:
content://sms/inbox 收件箱
content://sms/sent 已发送
content://sms/draft 草稿
content://sms/outbox 发件箱
content://sms/failed 发送失败
content://sms/queued 待发送列表
在模拟器上Outbox没有查询到数据,在模拟器上找了老半天也没找到发件箱,很郁闷。
数据库中sms相关的字段如下:
_id 一个自增字段,从1开始
thread_id 序号,同一发信人的id相同
address 发件人手机号码
person 联系人列表里的序号,陌生人为null
date 发件日期
protocol 协议,分为: 0 SMS_RPOTO, 1 MMS_PROTO
read 是否阅读 0未读, 1已读
status 状态 -1接收,0 complete, 64 pending, 128 failed
type
ALL = 0;
INBOX = 1;
SENT = 2;
DRAFT = 3;
OUTBOX = 4;
FAILED = 5;
QUEUED = 6;
body 短信内容
service_center 短信服务中心号码编号
subject 短信的主题
reply_path_present TP-Reply-Path
locked
检索数据方法很简单:
Uri uri = Uri.parse("content://sms/inbox");
Cursor cur = this.managedQuery(uri, null, null, null, null);
if (cur.moveToFirst()) {
do{
for(int j = 0; j < cur.getColumnCount(); j++){
info = "name:" + cur.getColumnName(j) + "=" + cur.getString(j);
Log.i("====>", info);
}
}while(cur.moveToNext());
}
managedQuery最终也要将参数转换为SQL语句向SQLite发送消息,因此参数跟SQL语句很类似,所以可以在查询字段中加入SQL函数,
比如new String[] projection = new String[]{"count(*) as count"}等等。
managedQuery中的参数依次为uri,
查询字段 查询字段数组,也可以将所有需要查询的字段放入一个字符内
比如new projection[]{"_id", "thread_id"}和new projection[]{"_id,thread_id"}是一致的。
跟SQL一样,字段名不区分大小写
条件 不带Where的SQL 条件字符,如果有参数则用?替代,比如"_id=? And thread_id = ? Or type = '1'"
条件中的参数 参数字符数组,跟上述的条件一一对应
排序 不带Order by排序字符串,比如_id desc, type
如果参数为null,SQL中查询字段为“*”,相关的条件为空白
还可以用getContentResolver()获得一个ContentResolver,
getContentResolver().query()同样返回一个Cursor对象,参数跟managedQuery一致。
不过用ContentResolver对象去更新、删除和插入一条数据时报SecurityException。看来没有权限,在Manifest.xml中加入权限:
<uses-permission android:name="android.permission.WRITE_SMS"></uses-permission>
然后删除短信:
this.getContentResolver().delete(Uri.parse("content://sms"), "_id=?", new String[]{"3"});
删除成功。
Url中content://sms 替换成content://sms/ 也成功,但是其它url时程序报错,比如content://sms/inbox
看了一下android的源代码,sms支持的协议有:
sURLMatcher.addURI("sms", null, SMS_ALL);
sURLMatcher.addURI("sms", "#", SMS_ALL_ID);
sURLMatcher.addURI("sms", "inbox", SMS_INBOX);
sURLMatcher.addURI("sms", "inbox/#", SMS_INBOX_ID);
sURLMatcher.addURI("sms", "sent", SMS_SENT);
sURLMatcher.addURI("sms", "sent/#", SMS_SENT_ID);
sURLMatcher.addURI("sms", "draft", SMS_DRAFT);
sURLMatcher.addURI("sms", "draft/#", SMS_DRAFT_ID);
sURLMatcher.addURI("sms", "outbox", SMS_OUTBOX);
sURLMatcher.addURI("sms", "outbox/#", SMS_OUTBOX_ID);
sURLMatcher.addURI("sms", "undelivered", SMS_UNDELIVERED);
sURLMatcher.addURI("sms", "failed", SMS_FAILED);
sURLMatcher.addURI("sms", "failed/#", SMS_FAILED_ID);
sURLMatcher.addURI("sms", "queued", SMS_QUEUED);
sURLMatcher.addURI("sms", "conversations", SMS_CONVERSATIONS);
sURLMatcher.addURI("sms", "conversations/*", SMS_CONVERSATIONS_ID);
sURLMatcher.addURI("sms", "raw", SMS_RAW_MESSAGE);
sURLMatcher.addURI("sms", "attachments", SMS_ATTACHMENT);
sURLMatcher.addURI("sms", "attachments/#", SMS_ATTACHMENT_ID);
sURLMatcher.addURI("sms", "threadID", SMS_NEW_THREAD_ID);
sURLMatcher.addURI("sms", "threadID/*", SMS_QUERY_THREAD_ID);
sURLMatcher.addURI("sms", "status/#", SMS_STATUS_ID);
sURLMatcher.addURI("sms", "sr_pending", SMS_STATUS_PENDING);
sURLMatcher.addURI("sms", "sim", SMS_ALL_SIM);
sURLMatcher.addURI("sms", "sim/#", SMS_SIM);
其中,delete方法中支持的协议为:
SMS_ALL 根据参数中的条件删除sms表数据
SMS_ALL_ID 根据_id删除sms表数据
SMS_CONVERSATIONS_ID 根据thread_id删除sms表数据,可以带其它条件
SMS_RAW_MESSAGE 根据参数中的条件删除 raw表
SMS_STATUS_PENDING 根据参数中的条件删除 sr_pending表
SMS_SIM 从Sim卡上删除数据
试一下SMS_CONVERSATIONS_ID:"content://sms/conversations/3 ",删除thread_id="3", _id="5"的数据
在eclipse中的Emulator Control中,以13800给模拟器发送三条数据,然后以13900发送一条
this.getContentResolver().delete(Uri.parse("content://sms/conversations/3"), "_id=?", new String[]{"5"});
成功删除一条数据。
在数据库中每个发送者的thread_id虽然一样,但不是固定的,如果把一个发送者的全部数据删除掉,
然后换一个新号码发送短信时,thread_id是以数据库中最大的id+1赋值的。
update支持的协议有很多:
SMS_RAW_MESSAGE
SMS_STATUS_PENDING
SMS_ALL
SMS_FAILED
SMS_QUEUED
SMS_INBOX
SMS_SENT
SMS_DRAFT
SMS_OUTBOX
SMS_CONVERSATIONS
SMS_ALL_ID
SMS_INBOX_ID
SMS_FAILED_ID
SMS_SENT_ID
SMS_DRAFT_ID
SMS_OUTBOX_ID
SMS_CONVERSATIONS_ID
SMS_STATUS_ID
以SMS_INBOX_ID测试一下:
ContentValues cv = new ContentValues();
cv.put("thread_id", "2");
cv.put("address", "00000");
cv.put("person", "11");
cv.put("date", "11111111");
this.getContentResolver().update(Uri.parse("content://sms/inbox/4"), cv, null, null);
太强了,连thread_id都可以修改。
insert支持的协议:
SMS_ALL
SMS_INBOX
SMS_FAILED
SMS_QUEUED
SMS_SENT
SMS_DRAFT
SMS_OUTBOX
SMS_RAW_MESSAGE
SMS_STATUS_PENDING
SMS_ATTACHMENT
SMS_NEW_THREAD_ID
向sms表插入数据时,type是根据协议来自动设置,
如果传入的数据中没有设置date时,自动设置为当前系统时间;非SMS_INBOX协议时,read标志设置为1
SMS_INBOX协议时,系统会自动查询并设置PERSON
threadId为null或者0时,系统也会自动设置
一直为造不了"发送失败"的邮件而发愁,现在来做一个:
content://sms/failed
ContentValues cv = new ContentValues();
cv.put("_id", "99");
cv.put("thread_id", "0");
cv.put("address", "9999");
cv.put("person", "888");
cv.put("date", "9999");
cv.put("protocol", "0");
cv.put("read", "1");
cv.put("status", "-1");
//cv.put("type", "0");
cv.put("body", "@@@@@@@@@");
this.getContentResolver().insert(Uri.parse("content://sms/failed"), cv);
type被设置成了5,thread_id设置为1
系统连最起码的数据校验都没有做啊,google对程序员也太仁慈了。
看看能不能再挖掘一下sms的功能。先来做一个错误的查询:
getContentResolver().query( Uri.parse("content://sms/") , new String[]{"a"}, "b", null, null);
log输出错误的SQL语句:
SELECT a FROM sms WHERE (b) ORDER BY date DESC
query方法中没有Group by,如果想对短信做统计,对Cursor进行遍历再统计也太慢了。
在SQL语言中group by在Where后面,那就在条件参数中想想办法:
Android组织SQL语句时将条件两端加(),那就拼一个group by出来吧:
getContentResolver().query( Uri.parse("content://sms/") , new String[]{"count(*) as count, thread_id"}, "1=1) group by (thread_id", null, null);
那么输出的SQL= SELECT count(*) as count, thread_id FROM sms WHERE ( 1=1) group by (thread_id ) ORDER BY date DESC
如果想查询URI没有对应的表怎么办呢,比如想知道 mmssms.db数据库中有哪些表,
查询的表是URI定的,再在条件参数中拼凑肯定是不行。
那我们把目光往前移,看看在字段参数中能不能凑出来。
要查询其它表,关键要去掉系统固定添加的FROM sms,
用用SQL中的注释吧,
getContentResolver().query(Uri.parse("content://sms/"), new String[]{" * from sqlite_master WHERE type = 'table' -- "}, null, null, null);
那么输出的SQL=SELECT * from sqlite_master WHERE type = 'table' -- FROM sms ORDER BY date DESC
居然能够运行。
得寸进尺,再进一步,如果加入“;”也能运行的话,哈哈,那么建表、删除表、更新表也能为所欲为咯。
getContentResolver().query(Uri.parse("content://sms/"), new String[]{" * from sms;select * from thrreads;-- "}, null, null, null);
很可惜,只运行了第一条SQL语句,看来在关键问题上,android还是有所控制的。
不过支持--也很不错了,这样可以查询数据库中所有的表,而且还可以多表联查
作者:GangWang
出处:http://www.cnblogs.com/GnagWang/
发表评论
-
如何实现Android 布局背景模糊化处理
2015-03-25 10:09 20823在模仿 IOS 密码输入页面的时候发现其背景有模糊处理,于是 ... -
Android中内容观察者的使用---- ContentObserver类详解 (转)
2014-10-27 15:27 1449http://www.cnblogs.com/slider ... -
监听未接来电
2014-10-27 14:41 2898这里主要是总结一下如何监听有未接来电的问题 1.1 ... -
Android 4.4 Settings 应用初步分析
2014-10-17 17:19 8286一次偶然要在设置里面增加一个菜单,需要修改到sett ... -
Android 使用 AndroidTestCase 的步骤
2014-10-17 15:23 2498Android 使用 AndroidTestCase 的步骤 ... -
property_get/property_set
2014-08-12 16:37 2247每个属性都有一个名称和值,他们都是字符串格式。属性被大量使 ... -
Android设置RadioButton在文字的右边
2014-03-11 09:52 2804<?xml version=&quo ... -
android 常见错误
2014-03-11 09:10 1073问题1:android.view.WindowM ... -
android 4.3之后使用ccache提供编译速度
2014-03-06 21:32 10126ccache(“compiler cache”的缩写)是一个 ... -
修改vid 导致adb 找不到手机
2014-03-05 21:51 1231修改vid 导致adb 找不到手机 linux下面的方法 ... -
android adb配置
2014-02-23 19:39 844linux ubuntu12 1. 配置环境变量 sud ... -
Android 类似未读短信图标显示数字效果的分析
2014-01-07 13:36 13421之前一直以为是 ... -
Android 中dp 和px 转换及原理分析
2014-01-07 12:15 5090具体的转换方法如下,网上都是有的,但是自己看了之后感觉 ... -
eclispe 更新sdk Connection to https://dl-ssl.google.com refused
2013-12-26 14:46 4769解决办法是:将https://修改为http://修改方法 ... -
使用repo下载google 的android4.4 源码,和编译.运行
2013-12-20 14:44 70779使用repo下载google 的android4.4 源码 ... -
Android中gravity与layout_gravity的区别, Padding 与 margin 区别
2013-12-03 09:03 1686原文: http://hi.baidu.com/doyee ... -
android ViewFlipper的使用
2013-10-10 09:36 2547http://blog.sina.com.cn/s/blo ... -
Android 中 PopupWindow 响应返回键并关闭的问题
2013-09-24 16:16 1647PopupWindow 跟我们的 Activity 不一样 ... -
android.view.WindowManager$BadTokenException: Unable to add window -- token null
2013-06-26 22:42 3320今天在创建一个窗口的时候老是报错,很少郁闷。 引起错误的 ... -
Android处理Home键方法小结
2013-06-18 10:06 23419昨天需要处理一个问 ...
相关推荐
以上就是实现一个简易的Android短信管理器涉及的主要技术点,涵盖了Android的权限管理、广播机制、SMSManager、UI设计以及数据库操作等多个方面。通过学习和实践这些知识点,开发者可以构建出功能完善的短信应用。
在Android平台上,智能短信管理器是一款非常实用的应用程序,它为用户提供了全面的短信管理和组织功能,极大地提升了处理日常通信的效率。以下是该应用的主要特点和相关知识点的详细解释: 1. **对话形式展示**:...
4.2 短信管理软件程序中各类组件 21 4.2.1 Package Explorer中的组件 22 4.2.2 应用程序的资源 22 4.2.3 布局文件main.xml 22 4.2.4 AndroidManifest.xml 23 4.3 手机短信软件设计实现 24 4.3.1 系统主界面的实现 24...
接下来,我们将深入探讨Android短信管理的相关知识点。 首先,我们要了解Android系统的权限管理。在Android 6.0(API级别23)及更高版本中,应用需要在运行时请求敏感权限,如读取和写入短信的权限。这需要在`...
### 基于Android手机短信管理系统设计 #### 一、课题背景与研究意义 随着智能手机在日常生活中的普及,其已成为获取信息的重要工具。本研究针对当前市场上流行的多种移动操作系统(如Symbian、Windows Mobile、Mac...
这里我们将深入探讨Android短信管理的相关知识点。 首先,Android为开发者提供了`SmsManager`类,它是进行短信操作的核心接口。通过这个类,我们可以实现发送短信、接收短信以及管理短信存储等功能。例如,要发送一...
【基于Android短信平台的管理】是一项技术性较强的毕业设计项目,主要关注于在Android操作系统上构建一个能够高效管理和处理短信的应用。在这个系统中,开发者可能实现了以下关键知识点: 1. **Android SDK**: 项目...
首先,显示未读短信是Android短信应用的基础。这需要访问Android系统的SMS Provider,这是一个SQLite数据库,存储着手机上的所有短信。通过ContentResolver和Uri类,我们可以查询这个数据库,获取未读短信的内容、发...
【Android SMSNotify】是一款专为Android...通过对`SMSNotify`源码的学习和理解,开发者不仅可以掌握Android短信通知的实现方式,还能深入了解Android系统的组件交互、权限管理、数据存储以及性能优化等多方面知识。
通过这些知识点,你可以构建一个简单的短信管理或验证码接收应用。在实际开发中,你还需要考虑更多的细节,如错误处理、用户体验优化等。同时,随着Android系统的更新,相关API和权限管理也会有所调整,开发者需要...
在Android操作系统中,短信管理是移动应用开发的重要组成部分。"android手机短信管理客户端"这个标题表明我们要探讨的是一个专门用于管理手机短信的应用程序。这款应用可能包含一系列功能,如接收、发送短信,以及对...
本文将深入探讨“Android短信UI工程文件”所涵盖的关键知识点,包括UI设计原则、布局管理器、控件使用以及Android的Intent机制。 首先,Android UI设计遵循Material Design指南,这是一种统一的视觉语言,旨在提供...
【Android短信应用源码解析】 在Android开发中,构建一个短信应用涉及到许多核心技术和组件的使用。本项目源码提供了一个完整的短信应用实例,通过它我们可以深入理解Android平台上的消息处理、用户界面设计以及与...
【Android短信程序源码解析】 Android短信程序是一个用于在移动设备上发送和接收短信的应用,其核心功能包括自定义编辑短信、短信分类以及收藏功能。这个"短信小窝"源码提供了一个完整的实现,让我们来深入探讨其中...
总的来说,Android短信发送涉及权限管理、SmsManager的使用以及用户交互设计。通过实践这个实例,开发者可以掌握如何在Android应用中集成基本的短信发送功能,并为进一步扩展通信功能打下基础。
本源码库提供了一个学习和理解Android短信管理器功能的实例,适合Android开发者进行深入研究。以下是关于Android信息管理器的一些核心知识点: 1. **SMSManager类**:在Android SDK中,`SMSManager`类是处理短信...
总结来说,创建一个Android短信发送程序涉及Android的权限管理、UI设计、Intent使用、SmsManager类的操作以及可能的事件监听。理解这些知识点对于Android开发者来说至关重要,因为它们构成了构建功能丰富的移动应用...
【Android 发短信Demo详解】 在Android开发中,创建一个类似于“爱短信”的应用程序涉及到多个关键知识点,主要包括系统级API的使用、用户界面设计以及数据管理。这个Demo旨在提供一种发送短信、拨打电话、显示短信...
短信管理涉及`SmsManager`类和`Telephony.Sms`表。获取短信需请求`READ_SMS`权限。 - 权限申请:在AndroidManifest.xml中声明`READ_SMS`权限。 - 查询短信:使用`ContentResolver.query()`,指定`Telephony.Sms....