操作系统短信的uri: content://sms/
查询联系人: raw_contacts, data
查询:
1. 去raw_contacts表中取所有联系人的_id
2. 去data表中根据上面取到的_id查询对应id的数据.
content://com.android.contacts/raw_contacts
content://com.android.contacts/data
添加:
1. 在raw_contacts表中添加一个记录
2. 根据上面添加记录的id, 取data表中添加三条数据
内容观察者:
发件箱的uri: content://sms/outbox
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ContentResolver resolver = getContentResolver();
/**
*
* 当内容观察者 观察到是数据库的内容变了,调用这个方法
* 观察到 消息邮箱里面有一条数据库内容变化的通知
*
* 参数:
* uri,
* true,只要前缀相同就监听,false:只有完全匹配才监听
*
*
*/
resolver.registerContentObserver(Uri.parse("content://sms/"), true, new MyContentObserver(new Handler()));
}
/**
* @author andong
* 内容观察者
*/
class MyContentObserver extends ContentObserver {
private static final String TAG = "MyContentObserver";
public MyContentObserver(Handler handler) {
super(handler);
}
/**
* 当被监听的内容发生改变时回调
*/
@Override
public void onChange(boolean selfChange) {
Log.i(TAG, "短信改变了");
Uri uri = Uri.parse("content://sms/outbox");
Cursor cursor = getContentResolver().query(uri, new String[]{"address", "date", "body"}, null, null, null);
if(cursor != null && cursor.getCount() > 0) {
String address;
long date;
String body;
while(cursor.moveToNext()) {
address = cursor.getString(0);
date = cursor.getLong(1);
body = cursor.getString(2);
Log.i(TAG, "号码: " + address + ", 日期: " + date + ", 内容: " + body);
}
cursor.close();
}
}
}
}
<uses-permission android:name="android.permission.READ_SMS"/>
ublic class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 备份短信
* @param v
*/
public void backupSms(View v) {
Uri uri = Uri.parse("content://sms/");
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.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.setId(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();
writeToLocal(smsList);
}
}
/**
* 序列化到本地
*/
private void writeToLocal(List<SmsInfo> smsList) {
try {
XmlSerializer serializer = Xml.newSerializer();
FileOutputStream fos = new FileOutputStream("/mnt/sdcard/sms.xml");
serializer.setOutput(fos, "utf-8");
serializer.startDocument("utf-8", true);
serializer.startTag(null, "smss");
for (SmsInfo smsInfo : smsList) {
serializer.startTag(null, "sms");
serializer.attribute(null, "id", String.valueOf(smsInfo.getId()));
serializer.startTag(null, "address");
serializer.text(smsInfo.getAddress());
serializer.endTag(null, "address");
serializer.startTag(null, "date");
serializer.text(String.valueOf(smsInfo.getDate()));
serializer.endTag(null, "date");
serializer.startTag(null, "type");
serializer.text(String.valueOf(smsInfo.getType()));
serializer.endTag(null, "type");
serializer.startTag(null, "body");
serializer.text(smsInfo.getBody());
serializer.endTag(null, "body");
serializer.endTag(null, "sms");
}
serializer.endTag(null, "smss");
serializer.endDocument();
Toast.makeText(this, "备份成功", 0).show();
} catch (Exception e) {
Toast.makeText(this, "备份失败", 0).show();
e.printStackTrace();
}
}
}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(10 * 1000);
Uri uri = Uri.parse("content://sms/");
ContentValues values = new ContentValues();
values.put("address", "95555");
values.put("type", "1");
values.put("body", "您的尾号为8890的账户, 收到100, 000, 000, 000.00元的转账. 活期余额为: 899, 777, 000, 111, 000.00元");
getContentResolver().insert(uri, values);
}
}).start();
}