短信 sms
文件 /data/data/com.android.providers.telephony/databases/mmssms.db
这个数据库有13张表,sms表存了短信信息。

sms表的uri是
Java代码
public static final Uri CONTENT_URI =
Uri.parse("content://sms");

表项含义,我猜的
0 _id
1 thread_id 在短信界面里显示在第几组( 相同联系人的短信在同意行),英文名叫话题。
2 address 电话好吗
3 person ? 存在电话簿里的名字 。 可能吧
4 date 日期
5 protocol ?..
6 read ? 1- 已读 0-未读
7 status ?
8 type ? 2 我发送
9 reply_path_present ?
10 subject
11 body 短信内容
12 service_center ...

好没信息量。。。。

把源码补上。
在frameworks/base/core/java/android/provider/Telephony.java

Java代码
/**
* The thread ID of the message
* <P>Type: INTEGER</P>
*/
public static final String THREAD_ID = "thread_id";

/**
* The address of the other party
* <P>Type: TEXT</P>
*/
public static final String ADDRESS = "address";

/**
* The person ID of the sender
* <P>Type: INTEGER (long)</P>
*/
public static final String PERSON_ID = "person";

/**
* The date the message was sent
* <P>Type: INTEGER (long)</P>
*/
public static final String DATE = "date";

/**
* The protocol identifier code
* <P>Type: INTEGER</P>
*/
public static final String PROTOCOL = "protocol";

/**
* Has the message been read
* <P>Type: INTEGER (boolean)</P>
*/
public static final String READ = "read";


/**
* The TP-Status value for the message, or -1 if no status has
* been received
*/
public static final String STATUS = "status";
us 举例:
public static final int STATUS_NONE = -1;
public static final int STATUS_COMPLETE = 0;
public static final int STATUS_PENDING = 64;
public static final int STATUS_FAILED = 128;

/**
* The type of the message
* <P>Type: INTEGER</P>
*/
public static final String TYPE = "type";
举例
public static final int MESSAGE_TYPE_ALL = 0;
public static final int MESSAGE_TYPE_INBOX = 1;
public static final int MESSAGE_TYPE_SENT = 2;
public static final int MESSAGE_TYPE_DRAFT = 3;
public static final int MESSAGE_TYPE_OUTBOX = 4;
public static final int MESSAGE_TYPE_FAILED = 5; // for failed outgoing messages
public static final int MESSAGE_TYPE_QUEUED = 6; // for messages to send later


/**
* Whether the <code>TP-Reply-Path</code> bit was set on this message
* <P>Type: BOOLEAN</P>
*/
public static final String REPLY_PATH_PRESENT = "reply_path_present";

/**
* The subject of the message, if present
* <P>Type: TEXT</P>
*/
public static final String SUBJECT = "subject";


/**
* The body of the message
* <P>Type: TEXT</P>
*/
public static final String BODY = "body";


/**
* The service center (SC) through which to send the message, if present
* <P>Type: TEXT</P>
*/
public static final String SERVICE_CENTER = "service_center";



/**
* Has the message been locked?
* <P>Type: INTEGER (boolean)</P>
*/
public static final String LOCKED = "locked";

**
* The id of the sender of the conversation, if present
* <P>Type: INTEGER (reference to item in content://contacts/people)</P>
*/
public static final String PERSON = "person";




彩信。

1、pdu表
mmssms.db库中的pdu表存储了彩信标题、彩信接收时间和彩信ID等信息,其中“_id”是主键,唯一标识了一个条彩信。

pdu 表源码
Java代码
/**
* Base columns for tables that contain MMSs.
*/
public interface BaseMmsColumns extends BaseColumns {

public static final int MESSAGE_BOX_ALL = 0;
public static final int MESSAGE_BOX_INBOX = 1;
public static final int MESSAGE_BOX_SENT = 2;
public static final int MESSAGE_BOX_DRAFTS = 3;
public static final int MESSAGE_BOX_OUTBOX = 4;

/**
* The date the message was sent.
* <P>Type: INTEGER (long)</P>
*/
public static final String DATE = "date";

/**
* The box which the message belong to, for example, MESSAGE_BOX_INBOX.
* <P>Type: INTEGER</P>
*/
public static final String MESSAGE_BOX = "msg_box";

/**
* Has the message been read.
* <P>Type: INTEGER (boolean)</P>
*/
public static final String READ = "read";

/**
* The Message-ID of the message.
* <P>Type: TEXT</P>
*/
public static final String MESSAGE_ID = "m_id";

/**
* The subject of the message, if present.
* <P>Type: TEXT</P>
*/
public static final String SUBJECT = "sub";

/**
* The character set of the subject, if present.
* <P>Type: INTEGER</P>
*/
public static final String SUBJECT_CHARSET = "sub_cs";

/**
* The Content-Type of the message.
* <P>Type: TEXT</P>
*/
public static final String CONTENT_TYPE = "ct_t";

/**
* The Content-Location of the message.
* <P>Type: TEXT</P>
*/
public static final String CONTENT_LOCATION = "ct_l";

/**
* The address of the sender.
* <P>Type: TEXT</P>
*/
public static final String FROM = "from";

/**
* The address of the recipients.
* <P>Type: TEXT</P>
*/
public static final String TO = "to";

/**
* The address of the cc. recipients.
* <P>Type: TEXT</P>
*/
public static final String CC = "cc";

/**
* The address of the bcc. recipients.
* <P>Type: TEXT</P>
*/
public static final String BCC = "bcc";

/**
* The expiry time of the message.
* <P>Type: INTEGER</P>
*/
public static final String EXPIRY = "exp";

/**
* The class of the message.
* <P>Type: TEXT</P>
*/
public static final String MESSAGE_CLASS = "m_cls";

/**
* The type of the message defined by MMS spec.
* <P>Type: INTEGER</P>
*/
public static final String MESSAGE_TYPE = "m_type";

/**
* The version of specification that this message conform.
* <P>Type: INTEGER</P>
*/
public static final String MMS_VERSION = "v";

/**
* The size of the message.
* <P>Type: INTEGER</P>
*/
public static final String MESSAGE_SIZE = "m_size";

/**
* The priority of the message.
* <P>Type: TEXT</P>
*/
public static final String PRIORITY = "pri";

/**
* The read-report of the message.
* <P>Type: TEXT</P>
*/
public static final String READ_REPORT = "rr";

/**
* Whether the report is allowed.
* <P>Type: TEXT</P>
*/
public static final String REPORT_ALLOWED = "rpt_a";

/**
* The response-status of the message.
* <P>Type: INTEGER</P>
*/
public static final String RESPONSE_STATUS = "resp_st";

/**
* The status of the message.
* <P>Type: INTEGER</P>
*/
public static final String STATUS = "st";

/**
* The transaction-id of the message.
* <P>Type: TEXT</P>
*/
public static final String TRANSACTION_ID = "tr_id";

/**
* The retrieve-status of the message.
* <P>Type: INTEGER</P>
*/
public static final String RETRIEVE_STATUS = "retr_st";

/**
* The retrieve-text of the message.
* <P>Type: TEXT</P>
*/
public static final String RETRIEVE_TEXT = "retr_txt";

/**
* The character set of the retrieve-text.
* <P>Type: TEXT</P>
*/
public static final String RETRIEVE_TEXT_CHARSET = "retr_txt_cs";

/**
* The read-status of the message.
* <P>Type: INTEGER</P>
*/
public static final String READ_STATUS = "read_status";

/**
* The content-class of the message.
* <P>Type: INTEGER</P>
*/
public static final String CONTENT_CLASS = "ct_cls";

/**
* The delivery-report of the message.
* <P>Type: INTEGER</P>
*/
public static final String DELIVERY_REPORT = "d_rpt";

/**
* The delivery-time-token of the message.
* <P>Type: INTEGER</P>
*/
public static final String DELIVERY_TIME_TOKEN = "d_tm_tok";

/**
* The delivery-time of the message.
* <P>Type: INTEGER</P>
*/
public static final String DELIVERY_TIME = "d_tm";

/**
* The response-text of the message.
* <P>Type: TEXT</P>
*/
public static final String RESPONSE_TEXT = "resp_txt";

/**
* The sender-visibility of the message.
* <P>Type: TEXT</P>
*/
public static final String SENDER_VISIBILITY = "s_vis";

/**
* The reply-charging of the message.
* <P>Type: INTEGER</P>
*/
public static final String REPLY_CHARGING = "r_chg";

/**
* The reply-charging-deadline-token of the message.
* <P>Type: INTEGER</P>
*/
public static final String REPLY_CHARGING_DEADLINE_TOKEN = "r_chg_dl_tok";

/**
* The reply-charging-deadline of the message.
* <P>Type: INTEGER</P>
*/
public static final String REPLY_CHARGING_DEADLINE = "r_chg_dl";

/**
* The reply-charging-id of the message.
* <P>Type: TEXT</P>
*/
public static final String REPLY_CHARGING_ID = "r_chg_id";

/**
* The reply-charging-size of the message.
* <P>Type: INTEGER</P>
*/
public static final String REPLY_CHARGING_SIZE = "r_chg_sz";

/**
* The previously-sent-by of the message.
* <P>Type: TEXT</P>
*/
public static final String PREVIOUSLY_SENT_BY = "p_s_by";

/**
* The previously-sent-date of the message.
* <P>Type: INTEGER</P>
*/
public static final String PREVIOUSLY_SENT_DATE = "p_s_d";

/**
* The store of the message.
* <P>Type: TEXT</P>
*/
public static final String STORE = "store";

/**
* The mm-state of the message.
* <P>Type: INTEGER</P>
*/
public static final String MM_STATE = "mm_st";

/**
* The mm-flags-token of the message.
* <P>Type: INTEGER</P>
*/
public static final String MM_FLAGS_TOKEN = "mm_flg_tok";

/**
* The mm-flags of the message.
* <P>Type: TEXT</P>
*/
public static final String MM_FLAGS = "mm_flg";

/**
* The store-status of the message.
* <P>Type: TEXT</P>
*/
public static final String STORE_STATUS = "store_st";

/**
* The store-status-text of the message.
* <P>Type: TEXT</P>
*/
public static final String STORE_STATUS_TEXT = "store_st_txt";

/**
* The stored of the message.
* <P>Type: TEXT</P>
*/
public static final String STORED = "stored";

/**
* The totals of the message.
* <P>Type: TEXT</P>
*/
public static final String TOTALS = "totals";

/**
* The mbox-totals of the message.
* <P>Type: TEXT</P>
*/
public static final String MBOX_TOTALS = "mb_t";

/**
* The mbox-totals-token of the message.
* <P>Type: INTEGER</P>
*/
public static final String MBOX_TOTALS_TOKEN = "mb_t_tok";

/**
* The quotas of the message.
* <P>Type: TEXT</P>
*/
public static final String QUOTAS = "qt";

/**
* The mbox-quotas of the message.
* <P>Type: TEXT</P>
*/
public static final String MBOX_QUOTAS = "mb_qt";

/**
* The mbox-quotas-token of the message.
* <P>Type: INTEGER</P>
*/
public static final String MBOX_QUOTAS_TOKEN = "mb_qt_tok";

/**
* The message-count of the message.
* <P>Type: INTEGER</P>
*/
public static final String MESSAGE_COUNT = "m_cnt";

/**
* The start of the message.
* <P>Type: INTEGER</P>
*/
public static final String START = "start";

/**
* The distribution-indicator of the message.
* <P>Type: TEXT</P>
*/
public static final String DISTRIBUTION_INDICATOR = "d_ind";

/**
* The element-descriptor of the message.
* <P>Type: TEXT</P>
*/
public static final String ELEMENT_DESCRIPTOR = "e_des";

/**
* The limit of the message.
* <P>Type: INTEGER</P>
*/
public static final String LIMIT = "limit";

/**
* The recommended-retrieval-mode of the message.
* <P>Type: INTEGER</P>
*/
public static final String RECOMMENDED_RETRIEVAL_MODE = "r_r_mod";

/**
* The recommended-retrieval-mode-text of the message.
* <P>Type: TEXT</P>
*/
public static final String RECOMMENDED_RETRIEVAL_MODE_TEXT = "r_r_mod_txt";

/**
* The status-text of the message.
* <P>Type: TEXT</P>
*/
public static final String STATUS_TEXT = "st_txt";

/**
* The applic-id of the message.
* <P>Type: TEXT</P>
*/
public static final String APPLIC_ID = "apl_id";

/**
* The reply-applic-id of the message.
* <P>Type: TEXT</P>
*/
public static final String REPLY_APPLIC_ID = "r_apl_id";

/**
* The aux-applic-id of the message.
* <P>Type: TEXT</P>
*/
public static final String AUX_APPLIC_ID = "aux_apl_id";

/**
* The drm-content of the message.
* <P>Type: TEXT</P>
*/
public static final String DRM_CONTENT = "drm_c";

/**
* The adaptation-allowed of the message.
* <P>Type: TEXT</P>
*/
public static final String ADAPTATION_ALLOWED = "adp_a";

/**
* The replace-id of the message.
* <P>Type: TEXT</P>
*/
public static final String REPLACE_ID = "repl_id";

/**
* The cancel-id of the message.
* <P>Type: TEXT</P>
*/
public static final String CANCEL_ID = "cl_id";

/**
* The cancel-status of the message.
* <P>Type: INTEGER</P>
*/
public static final String CANCEL_STATUS = "cl_st";

/**
* The thread ID of the message
* <P>Type: INTEGER</P>
*/
public static final String THREAD_ID = "thread_id";

/**
* Has the message been locked?
* <P>Type: INTEGER (boolean)</P>
*/
public static final String LOCKED = "locked";
}


2、part表
mmssms.db库中的part表存储了彩信内容(文本、音乐、图象)的文件名(即上面将的app_parts下面的文件名)、文件类型信息。
其中“mid”对应着pdu表中的“_id”,“ct”是文件类型,“_data”是存储路径。

3 。 彩信文件读取

彩信附件文件的地址存储在mmssms.db的part表的_data字段,形如“/data/data/com.android.providers.telephony/app_parts/PART_1262693697763”,但在应用中读取彩信附件时,这个字段基本没什么用,因为不能直接读取这个文件。读取同样要通过ContentProvider,URI为“content://mms/part”,该URI就是对应着part表。可以使用下列代码段来读取文件:
String selection = new String("mid='" + key + "'");//这个key就是pdu里面的_id。
Cursor cur = getContentResolver().query(Uri.parse("content://mms/part"), null, selection, null, null);

if (cur.moveToFirst())
do {
int _partID = cur.getInt(cur.getColumnIndex("_id"));
String partID = String.valueOf(_partID);
Uri partURI = Uri.parse("content://mms/part/" + partID);

ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = null;

try {
is = getContentResolver().openInputStream(partURI);
byte[] buffer = new byte[256];
int len = is.read(buffer);
while (len >= 0)
{
baos.write(buffer, 0, len);
len = is.read(buffer);
}
} catch (IOException e) {
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {

}
}
}
}
这里得到的baos,就是附件文件。

更多相关文章

  1. Bugly Android自动上传符号表
  2. DEX 方法超过64K限制和gradle编译OOM问题解决
  3. 友盟多渠道获取渠道名 附赠多渠道打包文件
  4. Selector的用法
  5. MapView的apiKey
  6. android sp文件一个键值保存多条信息
  7. 如何给android studio加速(加快gradle build)
  8. android数据持久化总结
  9. Android(安卓)3.1 r1 中文API文档 (121) ―― ResourceCursorTre

随机推荐

  1. Android之完美退出方法(2.1-2.2-2.3SDK版
  2. 2018年6月份Android上海找工作经历
  3. 谈谈Android中文短信的实现
  4. 中华万年历官方V2.0.0 Android最好用的日
  5. android高亮引导页
  6. android 开发规范好工具----Android(安卓
  7. Android实现仿360手机卫士悬浮窗效果
  8. 基于Android的闹钟的软件
  9. Android(安卓)实现水波纹
  10. Android笔记(一):Android工程目录介绍