读取通讯录

本文介绍了一种在Android应用中异步查询通讯录的方法,并提供了详细的代码实现。通过使用AsyncQueryHandler,文章展示了如何获取联系人姓名及电话号码等信息。

准备做个通话录音的东西,下面是异步查询通讯录的代码

	private static final String TAG = "ContractChoseActivity";
	
	private int sdkVersion = 4;
	private String mColumnName = null;

	
	private ListView mListView;
	
	private MyAdapter mAdapter;
	private ListQueryHandler mQueryHandler;
	
	public void onCreate(Bundle bundle){
		super.onCreate(bundle);
		
		setContentView(R.layout.contract);
		mListView = (ListView) this.findViewById(R.id.contract_list);
		
		mQueryHandler = new ListQueryHandler(getContentResolver());
		queryList(mQueryHandler);
	}
	
	
	private void queryList(AsyncQueryHandler async) {
		if (async != null) {
			
			try {
				sdkVersion = Integer.parseInt(android.os.Build.VERSION.SDK.trim());
			} catch (Exception e) {
				sdkVersion = 3;
			}
			
            Uri personUri = null;
            if(sdkVersion > 4){//2.x,sdk版本
                personUri = Uri.parse("content://com.android.contacts/contacts");
                mColumnName = "display_name";
            }else{//1.6以下SDK
                personUri = Contacts.People.CONTENT_URI;
                mColumnName = Contacts.People.NAME;
            }
            //开始异步查询
			async.startQuery(0, null, personUri, null, null, null, null);
		}
	}
	
	
	class MyAdapter extends CursorAdapter {

		private LayoutInflater mInflater;

		public MyAdapter(Context context, Cursor c) {
			super(context, c);
			mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}

		public int getListLength() {
			int ret = 0;
			if (getCursor() != null)
				ret = getCount();
			return ret;

		}

		
		@Override
		public void bindView(View view, Context context, Cursor cursor) {
			ItemStruct struct = (ItemStruct) view.getTag();
			
			if(cursor != null){
				try{
					struct.name.setText(cursor.getString(cursor.getColumnIndex(mColumnName)));
//					struct.number.setText(cursor.getString((cursor.getColumnIndex(Contacts.People.NUMBER))));
				}catch(Exception ex){
					Log.d(TAG, "exception>>"+ex.toString());
					ex.printStackTrace();
				}

			}
		}

		@Override
		public View newView(Context context, Cursor cursor, ViewGroup parent) {
			View convertView = null;
			convertView = mInflater.inflate(R.layout.contract_row, parent, false);
			ItemStruct struct = new ItemStruct();
			struct.checkbox = (CheckBox) convertView.findViewById(R.id.contract_checkbox);
			struct.name = (TextView) convertView.findViewById(R.id.contract_name);
			struct.number = (TextView) convertView.findViewById(R.id.contract_number);
			convertView.setTag(struct);
			return convertView;
		}

		private class ItemStruct {
			CheckBox checkbox;
			TextView name;
			TextView number;
		}

	}
	
	class ListQueryHandler extends AsyncQueryHandler {

		public ListQueryHandler(ContentResolver cr) {
			super(cr);
		}

		/**
		 * 异步查询结束时
		 */
		public void onQueryComplete(int token, Object cookie, Cursor cursor) {

			if (cursor != null) {
				
				if (mAdapter == null) {
					mAdapter = new MyAdapter(ContractChoseActivity.this, cursor);
					mListView.setAdapter(mAdapter);
				} else {
					mAdapter.changeCursor(cursor);

				}
			}

		}

	}
	
	

本来打算连电话号码一起显示的,后来发现不在同一张表中,google的通讯录不是简单的电话本,这张表中只有个字段是has_phone_number,然后可以还需要继续跟进id去匹配查询另外一张表才可以得到全部的电话号码(1个人可以有多个号码)。下面的代码具体有方式:


参考:http://topic.youkuaiyun.com/u/20101124/12/45aa763f-82ed-4c23-9877-64d725c6aed9.html

  1. Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);       
    2. while (cursor.moveToNext())     
    3. {        
    4.     String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));    
    5.     String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));    
    6.     if (Boolean.parseBoolean(hasPhone))     
    7.     {    
    8.         Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null);         
    9.         while (phones.moveToNext())     
   10.         {          
   11.             String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));        
   12.         }         
   13.         phones.close();        
   14.     }        
   15.     Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId,null, null);    
   16.     while (emails.moveToNext())     
   17.     {                     
   18.         String emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.CommonDataColumns.DATA));    
   19.     }        
   20.     emails.close();       
   21. }       
   22. cursor.close();   
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值