`

android短彩信查询以及MMS表结构

 
阅读更多
android短信的数据库的Uri是不公开的, 读取起来时灰常不方便的, 这里做了下总结. 
用adb指令将mmssms.db从/data/data/com.android.providers.telephony/databases中pull出来
经常使用到的表有
canonical_addresses, sms, threads三个表格
sms是存储着所有的短信, 主要的列有_id, thread_id, address, person, date, read, type, body
关于的sms的Uri有
发件箱 content://sms/outbox
收件箱 content://sms/inbox
草稿箱 content://sms/draft
conversations content://sms/conversations
threads表存储着每一个短信对话的线程. 主要列有_id, date, message_count, recipient_ids, snippet, read
recipient_ids 存放的是参与此次对话的person的id, 然而这个id不是通讯录里面的id, 而是canonical_addresses 的id. 这就是canonical_addresses 表格的作用
threads 表 uri: content://mms-sms/conversations?simple=true
canonical_addresses 表 uri content://mms-sms/canonical-addresses

一、需要实现一个同系统信息一样的功能

1)会话列表;

2)会话对话详情;

3)系统会话增加新信息或者删除信息等变化时做到同步;

二、实现思路

通过查询会话表显示会话界面,监听会话数据库实现与系统信息同步。通过会话id查询会话对应的具体聊天内容,比如短信或者彩信;

看下mmssms.db中的uri有好多个,可以根据自己的需求选择合适的uri,可以避免不必要的操作,提高效率。经过多次测试,实现以上功能需要用的信息表有:

1)会话表:content://mms-sms/conversations/

2)短信表:content://sms

3)彩信表:content://mms、content://mms/part

4)信息对应手机号码表:content://mms-sms/canonical-addresses

需要权限:<uses-permission android:name="android.permission.READ_SMS" />





首先:显示会话列表

public static final Uri THREADS_URI = Uri.parse("content://mms-sms/conversations?simple=true");


threads字段:

_id
date
ct_t:区分彩信还是短信:application/vnd.wap.multipart.related是彩信,否则是短信
snippet:最新的一条会话信息。彩信为彩信的主题,短信时短信的body
recipient_ids:信息对应手机号码表(content://mms-sms/canonical-addresses)中的id,查询对应的手机号码


message_count:详细对话条数


read


snippet_cs:snippet的编码方式,彩信:106(utf-8),短信:0

……

根据threads表中的date,snippet,messagecount基本可以显示会话列表了。




另外:

1:通过4)信息对应手机号码表:content://mms-sms/canonical-addresses获取了手机号之后获取联系人姓名以及头像使用:ContactsContract.CommonDataKinds.Phone.CONTENT_URI

2:当会话为彩信时,snippet显示的是彩信的主题,编码方式为utf-8。显示为乱码。

解决:snippet_mms = new String(snippet.getBytes("ISO8859_1"), "utf-8");




其次,获取会话具体对话内容

具体对话的格式有ssm或者mms,通过content://mms-sms/conversations/threadid,可以查询与某联系人的所有聊天记录的id,这个id对应短信或者彩信表中的id。如果具体会话是短信,则去sms表中查询具体内容,如果是彩信则去mms表中查询。通过字段ct_t 区分信息类别。

具体实现:

1)获取sms


[java] view plaincopyprint?String selection = "_id = "+id; 
Uri uri = Uri.parse("content://sms"); 
Cursor cursor = contentResolver.query(uri, null, selection, null, null); 
String phone = cursor.getString(cursor.getColumnIndex("address")); 
int type = cursor.getInt(cursor.getColumnIndex("type"));// 2 = sent, etc.  
String date = cursor.getString(cursor.getColumnIndex("date")); 
String body = cursor.getString(cursor.getColumnIndex("body")); 

String selection = "_id = "+id;
Uri uri = Uri.parse("content://sms");
Cursor cursor = contentResolver.query(uri, null, selection, null, null);
String phone = cursor.getString(cursor.getColumnIndex("address"));
int type = cursor.getInt(cursor.getColumnIndex("type"));// 2 = sent, etc.
String date = cursor.getString(cursor.getColumnIndex("date"));
String body = cursor.getString(cursor.getColumnIndex("body"));
2)获取mms

彩信表:content://mms

彩信附件:content://mms/part/


get text content from MMS:
[java] view plaincopyprint?String selectionPart = "mid=" + mmsId; 
Uri uri = Uri.parse("content://mms/part"); 
Cursor cursor = getContentResolver().query(uri, null, 
    selectionPart, null, null); 
if (cursor.moveToFirst()) { 
    do { 
        String partId = cursor.getString(cursor.getColumnIndex("_id")); 
        String type = cursor.getString(cursor.getColumnIndex("ct")); 
        if ("text/plain".equals(type)) { 
            String data = cursor.getString(cPart.getColumnIndex("_data")); 
            String body; 
            if (data != null) { 
                // implementation of this method below  
                body = getMmsText(partId); 
            } else { 
                body = cursor.getString(cursor.getColumnIndex("text")); 
            } 
        } 
    } while (cursor.moveToNext()); 


String selectionPart = "mid=" + mmsId;
Uri uri = Uri.parse("content://mms/part");
Cursor cursor = getContentResolver().query(uri, null,
    selectionPart, null, null);
if (cursor.moveToFirst()) {
    do {
        String partId = cursor.getString(cursor.getColumnIndex("_id"));
        String type = cursor.getString(cursor.getColumnIndex("ct"));
        if ("text/plain".equals(type)) {
            String data = cursor.getString(cPart.getColumnIndex("_data"));
            String body;
            if (data != null) {
                // implementation of this method below
                body = getMmsText(partId);
            } else {
                body = cursor.getString(cursor.getColumnIndex("text"));
            }
        }
    } while (cursor.moveToNext());
}


[java] view plaincopyprint?private String getMmsText(String id) { 
    Uri partURI = Uri.parse("content://mms/part/" + id); 
    InputStream is = null; 
    StringBuilder sb = new StringBuilder(); 
    try { 
        is = getContentResolver().openInputStream(partURI); 
        if (is != null) { 
            InputStreamReader isr = new InputStreamReader(is, "UTF-8"); 
            BufferedReader reader = new BufferedReader(isr); 
            String temp = reader.readLine(); 
            while (temp != null) { 
                sb.append(temp); 
                temp = reader.readLine(); 
            } 
        } 
    } catch (IOException e) {} 
    finally { 
        if (is != null) { 
            try { 
                is.close(); 
            } catch (IOException e) {} 
        } 
    } 
    return sb.toString(); 


private String getMmsText(String id) {
    Uri partURI = Uri.parse("content://mms/part/" + id);
    InputStream is = null;
    StringBuilder sb = new StringBuilder();
    try {
        is = getContentResolver().openInputStream(partURI);
        if (is != null) {
            InputStreamReader isr = new InputStreamReader(is, "UTF-8");
            BufferedReader reader = new BufferedReader(isr);
            String temp = reader.readLine();
            while (temp != null) {
                sb.append(temp);
                temp = reader.readLine();
            }
        }
    } catch (IOException e) {}
    finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {}
        }
    }
    return sb.toString();
}

获取彩信中图片:


[java] view plaincopyprint?String selectionPart = "mid=" + mmsId; 
Uri uri = Uri.parse("content://mms/part"); 
Cursor cPart = getContentResolver().query(uri, null, 
    selectionPart, null, null); 
if (cPart.moveToFirst()) { 
    do { 
        String partId = cPart.getString(cPart.getColumnIndex("_id")); 
        String type = cPart.getString(cPart.getColumnIndex("ct")); 
        if ("image/jpeg".equals(type) || "image/bmp".equals(type) || 
                "image/gif".equals(type) || "image/jpg".equals(type) || 
                "image/png".equals(type)) { 
            Bitmap bitmap = getMmsImage(partId); 
        } 
    } while (cPart.moveToNext()); 


String selectionPart = "mid=" + mmsId;
Uri uri = Uri.parse("content://mms/part");
Cursor cPart = getContentResolver().query(uri, null,
    selectionPart, null, null);
if (cPart.moveToFirst()) {
    do {
        String partId = cPart.getString(cPart.getColumnIndex("_id"));
        String type = cPart.getString(cPart.getColumnIndex("ct"));
        if ("image/jpeg".equals(type) || "image/bmp".equals(type) ||
                "image/gif".equals(type) || "image/jpg".equals(type) ||
                "image/png".equals(type)) {
            Bitmap bitmap = getMmsImage(partId);
        }
    } while (cPart.moveToNext());
}
[java] view plaincopyprint?private Bitmap getMmsImage(String _id) { 
    Uri partURI = Uri.parse("content://mms/part/" + _id); 
    InputStream is = null; 
    Bitmap bitmap = null; 
    try { 
        is = getContentResolver().openInputStream(partURI); 
        bitmap = BitmapFactory.decodeStream(is); 
    } catch (IOException e) {} 
    finally { 
        if (is != null) { 
            try { 
                is.close(); 
            } catch (IOException e) {} 
        } 
    } 
    return bitmap; 


private Bitmap getMmsImage(String _id) {
    Uri partURI = Uri.parse("content://mms/part/" + _id);
    InputStream is = null;
    Bitmap bitmap = null;
    try {
        is = getContentResolver().openInputStream(partURI);
        bitmap = BitmapFactory.decodeStream(is);
    } catch (IOException e) {}
    finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {}
        }
    }
    return bitmap;
}
测试结果:








最后,我的会话界面与系统的实时同步

监听系统的会话数据表即可:

public static final Uri THREADS_URI = Uri
.parse("content://mms-sms/conversations?simple=true");


getContentResolver().registerContentObserver(THREADS_URI ,true, sysCallLogObserver);




另外:

我只写了自己用的表字段,如果想字段别的可以自己打印下:

cursor.getColumnNames();
========================================
数据库中sms相关的字段如下:   



_id                         primary key     integer                  与words表内的source_id关联

thread_id              会话id,一个联系人的会话一个id,与threads表内的_id关联      integer

address                 对方号码          text

person                  联系人id           integer            

date                      发件日期           integer

protocol               通信协议,判断是短信还是彩信     integer       0:SMS_RPOTO, 1:MMS_PROTO

read                      是否阅读           integer       default 0             0:未读, 1:已读 

status                   状态                  integer       default-1           -1:接收,

                                                                                                   0:complete,

                                                                                                 64: pending,

                                                                                                128: failed

type                     短信类型           integer                                   1:inbox

                                                                                                    2:sent

                                                                                                    3:draft56

                                                                                                    4:outbox

                                                                                                    5:failed

                                                                                                    6:queued           

body                      内容

service_center      服务中心号码

subject                  主题

reply_path_present

locked

error_code

seen
分享到:
评论

相关推荐

    短彩信数据表结构

    短彩信数据表结构是数据库设计的一部分,用于存储和管理短信和彩信的相关信息。以下是对Android MMS模块数据存储的详细解释: 首先,MMS模块包含了17张数据表,每张表都有特定的用途。例如,`addr`表存储地址信息,...

    Android截取彩信总结

    MMS 表结构 - **inbox**: 存储接收到的彩信信息 - **outbox**: 存储发送的彩信信息 - **pdu**: 存储彩信标题、彩信接收时间和彩信ID等信息 - **part**: 存储彩信内容的文件名、文件类型等信息 #### 三、拦截与...

    MMs_document

    9. **短彩信数据库.doc**:这部分内容可能讨论了Android系统中存储短信和彩信的数据库结构,包括表的设计、数据操作和优化,对于理解如何访问和管理用户的消息记录至关重要。 通过对这些文档的深入学习,开发者能够...

    TestMMS.rar

    - 使用`ContentResolver`查询`Mms`和`Part`表来获取MMS信息。例如,`Uri.parse("content://mms")`可以用来获取所有MMS,而`Uri.parse("content://mms/part")`用于获取MMS的各个Part。 - 查询条件可以包括`thread_...

    安卓Android源码——一个短信.zip

    下面,我们将深入探讨Android系统中的短信功能及其源码结构。 1. **Android消息传递框架**:在Android中,短信服务是通过Telephony框架实现的,它包含了一系列用于处理电话、短信和彩信的组件。短信服务的核心组件...

    安卓Android源码——sms1.rar

    本文将深入探讨 Android 源码中的短信实现,主要关注 SMS 相关的组件、数据存储以及 API 使用。 1. **短信服务组件**: - **TelephonyManager**: 这是 Android SDK 提供的接口,用于获取与电话相关的各种信息,...

    Android Mms之:深入理解对话列表管理

    此外,文章还提到了其他与Android MMS开发相关的主题,如发送和接收彩信(MMS)、短信流程、草稿管理、联系人管理、PDU使用等,这些都是构建MMS功能不可或缺的部分。理解并熟练运用这些知识点对于Android MMS应用的...

    基于Android手机平台的多媒体短信系统的研究.pdf

    在Android平台上开发多媒体短信系统,可以利用Android系统对多媒体文件的良好支持,以及3G和WiFi网络的高速传输能力,实现高效、便捷的信息传递。 【JSON 数据传输】 JSON(JavaScript Object Notation)是一种轻量...

    Android 开发技巧

    2、ANDROID应用程序结构 11 2.1、ACTIVITY 12 2.1.1、概述 12 2.1.2、Activity的生命周期 15 2.1.3、Activity 的创建 16 2.1.4、Activity 的跳转(含Bundle传值) 17 2.1.5.Actvity 堆栈 18 2.1.6、Intent对象调用...

    短信数据库表名

    在Android系统中,短信数据存储在SQLite数据库中,主要涉及两个核心表格:Threads表和...通过查询和分析这些表格,开发者可以实现各种功能,如统计未读短信、查找特定会话、显示联系人信息以及处理发送失败的情况等。

    NOKIA手机软件测试

    2. 消息功能:测试发送、接收、删除、编辑短信,支持MMS、彩信的功能测试。 3. 电话本:测试联系人添加、删除、查找、同步,以及导入导出功能。 4. 增值服务:如彩铃、游戏、应用下载等,需验证其安装、使用和计费的...

    JAVA上百实例源码以及开源项目源代码

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

Global site tag (gtag.js) - Google Analytics