`
aizhimin
  • 浏览: 25182 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

android 短信管理

阅读更多
转载:
http://blog.csdn.net/li_guotao/archive/2011/02/20/6196800.aspx

先贴出相关的协议:       
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还是有所控制的


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/li_guotao/archive/2011/02/20/6196800.aspx
分享到:
评论

相关推荐

    简易的android短信管理器代码

    以上就是实现一个简易的Android短信管理器涉及的主要技术点,涵盖了Android的权限管理、广播机制、SMSManager、UI设计以及数据库操作等多个方面。通过学习和实践这些知识点,开发者可以构建出功能完善的短信应用。

    Android代码-安卓短信管理

    接下来,我们将深入探讨Android短信管理的相关知识点。 首先,我们要了解Android系统的权限管理。在Android 6.0(API级别23)及更高版本中,应用需要在运行时请求敏感权限,如读取和写入短信的权限。这需要在`...

    基于Android短信管理设计与实现.docx

    基于Android短信管理设计与实现.docx

    android手机短信管理系统论文 完整版

    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短信管理软件APP设计与实现.docx

    基于Android短信管理软件APP设计与实现.docx

    Android智能短信管理器

    在Android平台上,智能短信管理器是一款非常实用的应用程序,它为用户提供了全面的短信管理和组织功能,极大地提升了处理日常通信的效率。以下是该应用的主要特点和相关知识点的详细解释: 1. **对话形式展示**:...

    Android获取手机短信

    在Android平台上,获取手机短信是一项常见的功能,尤其在开发与通信相关的应用时。本文将深入讲解如何通过Android SDK来实现这...这是一个很好的学习和实践平台,可以让你更好地理解和掌握Android短信管理的相关技术。

    android 信息(短信)管理器源码

    本源码库提供了一个学习和理解Android短信管理器功能的实例,适合Android开发者进行深入研究。以下是关于Android信息管理器的一些核心知识点: 1. **SMSManager类**:在Android SDK中,`SMSManager`类是处理短信...

    abc.zip_android 源码_android 短信

    综上,这个压缩包提供了一个深入了解Android短信管理的实例,适合Android开发者,尤其是对短信功能有特定需求或想要学习相关开发技术的人。通过分析源码,可以学习到如何集成短信API、处理短信事件、设计用户界面、...

    android短信管理器SmsManager实例详解

    "android短信管理器SmsManager实例详解" Android 短信管理器 SmsManager 是 Android 系统中用于管理短信的核心组件。通过 SmsManager,我们可以实现发送短信、接收短信、查询短信状态等功能。在本文中,我们将详细...

    Sms.zip_android sms_android 短信_sms_安卓_安卓短信拦截

    在Android系统中,短信服务是核心功能之一,它允许用户接收、发送和管理短信。而“Sms.zip”这个压缩包文件可能包含了关于Android短信拦截和转发...对于开发者来说,了解这些概念有助于构建自己的Android短信管理应用。

    基于android手机短信管理系统设计

    ### 基于Android手机短信管理系统设计 #### 一、课题背景与研究意义 随着智能手机在日常生活中的普及,其已成为获取信息的重要工具。本研究针对当前市场上流行的多种移动操作系统(如Symbian、Windows Mobile、Mac...

    基于android短信平台的管理

    【基于Android短信平台的管理】是一项技术性较强的毕业设计项目,主要关注于在Android操作系统上构建一个能够高效管理和处理短信的应用。在这个系统中,开发者可能实现了以下关键知识点: 1. **Android SDK**: 项目...

    Android管理手机短信

    首先,显示未读短信是Android短信应用的基础。这需要访问Android系统的SMS Provider,这是一个SQLite数据库,存储着手机上的所有短信。通过ContentResolver和Uri类,我们可以查询这个数据库,获取未读短信的内容、发...

    android 联系人和短信

    二、Android短信管理 1. **SMS Provider**:短信同样通过Content Provider来管理,`Telephony.Sms`提供了短信的URI。可以读取收件箱、发件箱、草稿箱和已发送的短信。 2. **读取短信**:使用`ContentResolver....

    android手机短信管理客户端

    在Android操作系统中,短信管理是移动应用开发的重要组成部分。"android手机短信管理客户端"这个标题表明我们要探讨的是一个专门用于管理手机短信的应用程序。这款应用可能包含一系列功能,如接收、发送短信,以及对...

    Android SMSNotify Android 短信通知源码

    【Android SMSNotify】是一款专为Android...通过对`SMSNotify`源码的学习和理解,开发者不仅可以掌握Android短信通知的实现方式,还能深入了解Android系统的组件交互、权限管理、数据存储以及性能优化等多方面知识。

Global site tag (gtag.js) - Google Analytics