android读取联系人的两种方式

随着android开发的升入,虽然代码功力提升了不少,但是我们却忘记了在以后的android开发中为了开发的方便却一直引用别人的框架,虽然可以省去很多调试的BUG,但是我个人觉得一步一个脚印,慢慢的提升自己。

那直接进入主题,我们知道读取联系人需要权限:

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" /> 

读取联系人信息都是从手机数据库中加载获取信息。方法是查询数据库表中的三个字段raw_contacts, data, mimetypes来获取联系人信息,下面是通过两种方法获取联系人信息:

方法一:

1. 先从raw_contacts中读取联系人的contact_id
2. 根据contact_id,从data中查出联系人相关信息
        3. 根据mimetype_id, 查询mimetype表,得到信息类型(名称,号码)

代码如下:

private ArrayList<HashMap<String, String>> readContact(){
		// raw_contacts, data, mimetypes
		// 1. 先从raw_contacts中读取联系人的contact_id
		// 2. 根据contact_id,从data中查出联系人相关信息
		// 3. 根据mimetype_id, 查询mimetype表,得到信息类型(名称,号码)	
		Cursor rawContactCursor = getContentResolver().query(
				Uri.parse("content://com.android.contacts/raw_contacts"),
				new String[] { "contact_id" }, null, null, null);
		
		ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();// 所有联系人集合
		while(rawContactCursor.moveToNext()){// 遍历所有联系人
			contactId = rawContactCursor.getString(0);
	
		// 系统查询的不是data这个表,而是view_data这个视图,视图是多个表的整合, data+mimetypes
		Cursor dataCursor = getContentResolver().query(
				Uri.parse("content://com.android.contacts/data"),
				new String[] { "data1", "mimetype" }, "raw_contact_id=?",
				new String[] { contactId }, null);
		HashMap<String, String> map = new HashMap<String, String>();// 保存某个联系人的信息
		while (dataCursor.moveToNext()) {// 遍历单个联系人所有字段信息
			String data = dataCursor.getString(0);
			String type = dataCursor.getString(1);

			if ("vnd.android.cursor.item/phone_v2".equals(type)) {
				// 电话号码
				map.put("phone", data);
			} else if ("vnd.android.cursor.item/name".equals(type)) {
				// 名称
				map.put("name", data);
			}
		}
		dataCursor.close();
		// 脏数据, 过滤掉
		if (!TextUtils.isEmpty(map.get("name"))
				&& !TextUtils.isEmpty(map.get("phone"))) {
			list.add(map);
		}
	}
	rawContactCursor.close();
	return list;
	}
}
方法二:

最近在研究android源码,个人觉得源码才是android最基础,而且是精髓;通过查询源码我又得到了另外一种方法,而且很简单快捷,我是通过按键点击显示一个dialog的方式把联系人信息显示在dialog的内容框中。代码如下:

<span style="font-size:14px;">private String contactId;
	private Cursor cursor;
	String[] projection = new String[] {
             ContactsContract.Contacts._ID,
             ContactsContract.Contacts.DISPLAY_NAME,
             ContactsContract.Contacts.SEND_TO_VOICEMAIL
     };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        new Thread(new Runnable() {

		@Override
		public void run() {
			cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
                        projection, null, null, null);
			}
		}).start();
    }
    
    public void click(View view){
    	AlertDialog.Builder builder = new Builder(this);
    	builder.setTitle("联系人列表");
    	
    	builder.setMultiChoiceItems(cursor, ContactsContract.Contacts.SEND_TO_VOICEMAIL,
    		ContactsContract.Contacts.DISPLAY_NAME,</span>
<span style="font-size:14px;"><span style="white-space: pre;">		</span>new OnMultiChoiceClickListener() {
		<span style="white-space: pre;">	</span>@Override
			public void onClick(DialogInterface dialog, int which, boolean isChecked) {
				Toast.makeText(getApplicationContext(), "选择:"+which, 1).show();
					}
				});
    	builder.setPositiveButton("确定", new OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
			}
		});
    	builder.setNegativeButton("取消", null);
    	builder.create().show();	
    }</span>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值