Android 中管理短信

为了看代码方便,一边在网上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中查询字段为“*”,相关的条件为空白

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyggdz.html