通讯录访问测试X3

1. Android开发如何只获取手机上的联系人而不获取(U)SIM卡上的联系人, 或者使用ContactsContract.Contacts.CONTENT_URI(可同时获取手机与(U)SIM卡联系人)哪个标志为这个联系人是卡上的还是手机上的
2. 如何向卡上添加联系人
3. 我使用自定义的方法insertPhone(String name, String num1, String email), 其中内部使用了getContentResolver().insert可往手机上添加联系人, 但我发现如果调用两次即insertPhone("赵钱", "32421421", "aba@163.com");与insertPhone("赵钱a", "32421421", "aba@163.com");则在Android模拟器上显示的是赵钱a, 而进行编辑赵钱a发现里面又含有赵钱与赵钱a, 即两个联系人同时被整合到一个里面去了, 不知道是怎么回事, 下面是insertPhone的源码
// 通过正常方式添加一个号码
private boolean insertPhone(String name, String num1, String email) {

// 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
// 这时后面插入data表的依据,只有执行空值插入,才能使插入的联系人在通讯录里面可见
try{
ContentValues values = new ContentValues();
/*首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
* RawContacts.CONTENT_URI
* 源代码:
* public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "raw_contacts");
* AUTHORITY_URI:
* public static final String AUTHORITY = "com.android.contacts";
* public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);
*/


// values.put(RawContacts.ACCOUNT_TYPE, "");
// values.put(RawContacts.ACCOUNT_NAME, "");

Uri rawContactUri = getContentResolver().insert(
RawContacts.CONTENT_URI, values);
long rawContactId = ContentUris.parseId(rawContactUri);

// 往data表入姓名数据
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);// 内容类型
values.put(StructuredName.GIVEN_NAME, name);
getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values);

// 往data表入电话数据, 类型为TYPE_MOBILE
int numType1 = Phone.TYPE_MOBILE;
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, num1);
values.put(Phone.TYPE, numType1);
getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values);

// 往data表入Email数据, 类型为TYPE_WORK
int emailType = Email.TYPE_WORK;
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
values.put(Email.DATA, email);
values.put(Email.TYPE, emailType);
getContentResolver().insert(
android.provider.ContactsContract.Data.CONTENT_URI, values);

return true;
}catch(Exception e) {
String strInfo = "";
strInfo += e.toString();

return false;
}
}


package cn.djw.test;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.test.AndroidTestCase;
import android.util.Log;

public class AccessContactsTest extends AndroidTestCase {
private static final String TAG = "AccessContactsTest";

public void testReadContacts() throws Exception{
Uri uri = Uri.parse("content://com.android.contacts/contacts");
ContentResolver resolver = this.getContext().getContentResolver();

Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, null);
while(cursor.moveToNext()){
StringBuilder sb = new StringBuilder();
int contactid = cursor.getInt(0);
sb.append("contactid=").append(contactid);
Uri dataUri = Uri.parse("content://com.android.contacts/contacts/"+ contactid+ "/data");
Cursor datacursor = resolver.query(dataUri, null, null, null, null);
while(datacursor.moveToNext()){
String data = datacursor.getString(datacursor.getColumnIndex("data1"));
String type = datacursor.getString(datacursor.getColumnIndex("mimetype"));
if("vnd.android.cursor.item/phone_v2".equals(type)){
sb.append(", phone=").append(data);
}else if("vnd.android.cursor.item/email_v2".equals(type)){
sb.append(", email=").append(data);
}else if("vnd.android.cursor.item/name".equals(type)){
sb.append(", name=").append(data);
}
}
datacursor.close();
Log.i(TAG, sb.toString());
}
cursor.close();
}
//根据电话号码查找联系人
public void testContactByNumber() throws Exception{
String phone = "15134567890";
Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+ phone);
ContentResolver resolver = this.getContext().getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{"display_name"}, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(0);
Log.i(TAG, name);
}
cursor.close();
}

//添加联系人
public void testAddContact() throws Exception{
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentResolver resolver = this.getContext().getContentResolver();
ContentValues values = new ContentValues();
Uri insertUri = resolver.insert(uri, values);
long contactid = ContentUris.parseId(insertUri);
//添加姓名
uri = Uri.parse("content://com.android.contacts/data");
values.put("raw_contact_id", contactid);
values.put("data2", "李小龙");
values.put("mimetype", "vnd.android.cursor.item/name");
resolver.insert(uri, values);
//添加电话
values.clear();
values.put("raw_contact_id", contactid);
values.put("data1", "186010433454");
values.put("data2", "2");
values.put("mimetype", "vnd.android.cursor.item/phone_v2");
resolver.insert(uri, values);
//添加email
values.clear();
values.put("raw_contact_id", contactid);
values.put("data1", "fdf@sina.cn");
values.put("data2", "2");
values.put("mimetype", "vnd.android.cursor.item/email_v2");
resolver.insert(uri, values);
}

//添加联系人,可以确保几个操作在同一个事务执行
public void testAddContact2() throws Exception{
ArrayList<ContentProviderOperation> oprations = new ArrayList<ContentProviderOperation>();
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentProviderOperation op1 = ContentProviderOperation.newInsert(uri).withValue("account_name", null).build();
oprations.add(op1);
uri = Uri.parse("content://com.android.contacts/data");
ContentProviderOperation op2 = ContentProviderOperation.newInsert(uri)
.withValueBackReference("raw_contact_id", 0)
.withValue("data2", "张飞")
.withValue("mimetype", "vnd.android.cursor.item/name")
.build();
oprations.add(op2);

ContentProviderOperation op3 = ContentProviderOperation.newInsert(uri)
.withValueBackReference("raw_contact_id", 0)
.withValue("data1", "133676576077")
.withValue("data2", "2")
.withValue("mimetype", "vnd.android.cursor.item/phone_v2")
.build();
oprations.add(op3);

ContentProviderOperation op4 = ContentProviderOperation.newInsert(uri)
.withValueBackReference("raw_contact_id", 0)
.withValue("data1", "test@sohu.com")
.withValue("data2", "2")
.withValue("mimetype", "vnd.android.cursor.item/email_v2")
.build();
oprations.add(op4);
ContentResolver resolver = this.getContext().getContentResolver();
resolver.applyBatch("com.android.contacts", oprations);
}
}


Content Providers 作用是使得各个应用程序之间实现数据共享。
 
ContentResolver
 ContentResolver cr = getContentResolver();
URI
 
每个Content Providers都会对外提供一个公共的URI(包装成Uri对象),其他应用程序就可以通过Content Providers传入这个URI来对数据进行操作。
 
URI由3个部分组成:"content://",数据的路径,标识ID(可选)
 
系统的一些URI: content://media/internal/images(返回设备上存储的所有图片) content://contacts/people/5(联系人信息中ID为5的联系人记录) content://contacts/people/(返回设备上的所有联系人信息)
 
系统提供一些辅助类,以类变量形式给出的查询字符串 content://contacts/people/5 ->
 Uri person = ContentUris.withAppendedId(People.CONTENT_URI,5);
查询数据
 
使用ContentResolver.query()或者Activity.managedQuery()传入一个URI来确定当前要操作的数据 返回一个Cursor对象。
 //查询联系人信息中ID为5的联系人记录Uri person = ContentUris.withAppendedId(People.CONTENT_URI,5);Cursor cur = managedQuery(person,null,null,null);//取得联系人姓名,电话,并按名字的升序排列//每个Provider都有一个_id列,为每个记录保存一个数字ID值,//_COUNT返回记录数,对所有行都是相同的。String[] projection = new String[]{                        People._ID,                        People._COUNT,                        People.NAME,                        People.NUMBER                      };Uri contacts = People.CONTENT_URI;Cursor managedCursor = managedQuery(                       projection,//返回指定列的数据                       null,      //返回所有行的数据                       null,      //可选参数                       People.NAME+"ASC");//按名字的升序排列
修改数据
 private void updateRecord(int id,int num){   Uri uri = ContentUris.withAppendedId(People.CONTENT_URI,id);   ContentValues values = new ContentValues();   values.put(People.NUMBER,num);   getContentResolver().update(uri,values,null,null);}
添加数据
 //调用ContentResolver.insert()方法来添加一条记录//参数:记录目标的URI,新记录值的ContentValues(Map)对象,返回一个新记录的URI(包含记录号)ContentValues values = new ContentValues();values.put(People.NAME,"Abraham");values.put(People.STARRED,1);Uri uri = getContentResolver.insert(People.CONTENT_URI,values);
删除数据
 Uri uri = People.CONTENT_URI;getContentResolver().delete(uri,null,null);//指定where条件语句删除getContentResolver().delete(uri,"NAME='ABORT'",null);

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/allmycheers/archive/2011/01/24/6160394.aspx


  1. public void getContact(){
  2. //获得所有的联系人
  3. Cursor cur = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
  4. //循环遍历
  5. if (cur.moveToFirst()) {
  6. int idColumn = cur.getColumnIndex(ContactsContract.Contacts._ID);
  7. int displayNameColumn = cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
  8. do {
  9. //获得联系人的ID号
  10. String contactId = cur.getString(idColumn);
  11. //获得联系人姓名
  12. String disPlayName = cur.getString(displayNameColumn);
  13. //查看该联系人有多少个电话号码。如果没有这返回值为0
  14. int phoneCount = cur.getInt(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
  15. if(phoneCount>0){
  16. //获得联系人的电话号码
  17. Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ " = " + contactId, null, null);
  18. if(phones.moveToFirst()){
  19. do{
  20. //遍历所有的电话号码
  21. String phoneNumber= phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
  22. System.out.println(phoneNumber);
  23. }while(phones.moveToNext());
  24. }
  25. }
  26. } while (cur.moveToNext());
  27. }
  28. }
  29. 在联系人的电话号码中有很多种,如果只想获得手机号码。代码如下:
  30. Cursor phones = mContext.getContentResolver().query(
  31. ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
  32. null,
  33. ContactsContract.CommonDataKinds.Phone.CONTACT_ID
  34. + " = " + contactId +" and "+ContactsContract.CommonDataKinds.Phone.TYPE+"="+ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE, null, null);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值