ContentProvider是android四大组件中的一中,平时我们可以通过ContentProvider来获取手机的一些内容,比如:手机联系人,短息,多媒体信息等,今天我学习了ContentProvider获取手机联系人,现在这里分享一下学习的一些心得体会
首先我们可以通过getContentResolver()来获取一个ContentResolver对象,这样我们就可以对contentProvider进行操作
ContentResolver cr=getContentResolver();
我们先来看一下,读取联系人如何操作
cr.query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder);解释一下这里面的几个参数,通过 uri 可以确定你要选择的是ContentProvider什么类型的数据,是联系人或者短息或者其他的, projection 代表了你要获取那些内容比如联系人姓名、电话。。。, selectionArgs 表示选择的条件,通过这个条件来筛选, sortOrder 是对返回的结果进行排序,cr.query()返回的是一个Cursor对象;
例:Cursor cs=cr.query(Contacts.CONTENT_URI, new String[]{Contacts._ID,Contacts.DISPLAY_NAME}, null, null, null);
之后的操作就很简单了,就是操作Cursor来获取你想要的信息,这里只是将手机联系人打印了出来
if (cs!=null) {
while (cs.moveToNext()) {
//先获取联系人的id
int id=cs.getInt(cs.getColumnIndex(Contacts._ID));
String name=cs.getString(cs.getColumnIndex(Contacts.DISPLAY_NAME));
System.out.println("id="+id);
System.out.println("name="+name);
//通过联系人的id来获取联系人的号码和邮箱,通过条件Phone.CONTACT_ID+"="+id来获取对应的联系人
Cursor cs2=cr.query(Phone.CONTENT_URI, new String[]{Phone.NUMBER,Phone.TYPE}, Phone.CONTACT_ID+"="+id, null, null);
if (cs2!=null) {
while (cs2.moveToNext()) {
int type=cs2.getInt(cs2.getColumnIndex(Phone.TYPE));
if (type==Phone.TYPE_HOME) {
System.out.println("家庭电话:"+cs2.getString(cs2.getColumnIndex(Phone.NUMBER)));
}else if (type==Phone.TYPE_MOBILE) {
System.out.println("手机电话:"+cs2.getString(cs2.getColumnIndex(Phone.NUMBER)));
}
}
cs2.close();
}
Cursor cs3=cr.query(Email.CONTENT_URI, new String[]{Email.DATA}, Email.CONTACT_ID+"="+id, null, null);
if (cs3!=null) {
while (cs3.moveToNext()) {
System.out.println("邮箱地址:"+cs3.getString(cs3.getColumnIndex(Email.DATA)));
}
//注意要释放cursor对象
cs3.close();
}
}
//注意要释放cursor对象
cs.close();
}
接下来,往手机通讯录里添加一条联系人的信息,添加信息,需要用到Contentvalues来存放要插入的信息
同样,先获取ContentResolver cr=getContentResolver();
ContentValues values=new ContentValues();
//先给联系人插入一个序列号之类的东西,insert方法返回的不再是一个Cursor对象, 而是一个URi对象
Uri uri=cr.insert(RawContacts.CONTENT_URI, values);
要插入数据,首先我们要获取到要插入联系人的序列号,通过
long row_id=ContentUris.parseId(uri);//返回的就是要插入联系人的行id,后面插入其他的信息,都是通过这个来插入的
比如插入姓名和类型
values.clear();//这里还使用上面的ContentValues ,clear一下就行了
//插入联系人姓名
values.put(StructuredName.RAW_CONTACT_ID, row_id);
values.put(StructuredName.DISPLAY_NAME, "张三");
values.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
uri=cr.insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
//插入联系人号码
values.clear();
values.put(Phone.RAW_CONTACT_ID, row_id);
values.put(Phone.NUMBER, "13134613145");
values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
uri=cr.insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
执行完上面的代码,就可以插入一条只有号码的联系人