Android手机系统自带的短信应用,收发的短信都存储在data/data/com.android.providers.telephony/databases文件夹下的mmssms.db数据库中的sms表中。调用该系统短信应用的uri是:content://sms/
表中的_id是自增的主键、address列是收发的手机号、date列是收发时间的时间戳、type列标识是收还是发:1表示收,2表示发、body列是收发的短信内容。
备份短信到本地SD卡时,需要添加写SD卡的权限,以及读系统短信和写系统短信的权限。
/**
* 备份短信
*
* @param v
*/
public void backupSms(View v) {
// 1.从系统短信的内容提供者中获取所有短信
Uri uri = Uri.parse("content://sms/");
Cursor cursor = getContentResolver().query(uri,
new String[] { "_id", "address", "date", "type", "body" },
null, null, null);
if (cursor != null && cursor.getCount() > 0) {
List<SmsInfo> smsList = new ArrayList<SmsInfo>();
SmsInfo sms;
while (cursor.moveToNext()) {
sms = new SmsInfo();
sms.set_id(cursor.getInt(0));
sms.setAddress(cursor.getString(1));
sms.setDate(cursor.getLong(2));
sms.setType(cursor.getInt(3));
sms.setBody(cursor.getString(4));
smsList.add(sms);
}
cursor.close();
// 2.序列化到本地
writeToLocal(smsList);
}
}
休眠时用SystemClock.sleep(1000);不用抛异常。
开启子线程向系统短信的数据库中写一条短信(相亲神器):
// 停10秒钟, 向系统短信数据库中写一条短信
new Thread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(10 * 1000);//休眠10秒钟
Uri uri = Uri.parse("content://sms/"); // 操作sms表的uri
ContentValues values = new ContentValues();
values.put("address", "95558");
values.put("type", "1");
values.put("body", "您尾号是4633的中信卡账户, 收到RMB100, 000.00的转账,当前余额为: RMB899, 000.00【中信银行】");
getContentResolver().insert(uri, values);
}
}).start();
手机上的联系人存储在data/data/com.android.providers.contacts/databases目录下的contacts2.db数据库中的raw_contacts表和data表中。
查询联系人信息时:
1、查询raw_contacts表中所有联系人的_id
2、到data表中查询对应raw_contact_id=_id的data1列、mimetype列的数据信息。data1列的数据信息根据mimetype_id列的值的不同,保存的信息也不同。
操作这两个表的uri分别是:
content://com.android.contacts/raw_contacts
content://com.android.contacts/data
查询联系人要添加读联系人的权限。
添加联系人信息时:
1、在raw_contacts表中添加一条记录:本表中contact_id的值是等于_id的值的。
查询raw_contacts表中contact_id的最大值("contact_id desc limit 1"),加1添加到本表中。
2、根据添加的contact_id的值(即_id的值)到data表中根据mimetype值的不同添加data1列的记录,还要添加raw_contact_id的值,其值等于contact_id。
添加联系人要添加写联系人的权限。