读取 联系人

本文详细介绍了如何在Android应用中读取和写入联系人信息,包括使用ContentResolver进行查询和插入操作。


package com.xh.tx.readcontact;

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


import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;


public class MainActivity extends Activity {

	private static final String TAG = "MainActivity";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	
		readContact();
		writeContact();
	}


	private void readContact() {
		
		ContentResolver resolver = this.getContentResolver();
		Cursor cursor = resolver.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"contact_id"}, null, null, null);
		
		if(null != cursor && cursor.getCount() > 0){
				List<Contact> list = new ArrayList<Contact>();
			while(cursor.moveToNext())
			{
				Integer contact_id = cursor.getInt(0);
				
				Cursor cursor_data = resolver.query(Uri.parse("content://com.android.contacts/data"), new String[]{"mimetype","data1"}, 
						"raw_contact_id = ?", 
						new String[]{String.valueOf(contact_id)},
						null);
				if(null!=cursor_data && cursor_data.getCount()>0){
					
					Contact contact = new Contact();;
					while(cursor_data.moveToNext())
					{
						String mimetype = cursor_data.getString(0);
						String data = cursor_data.getString(1);
					
					if("vnd.android.cursor.item/name".equals(mimetype))
					{
						contact.setName(data);
					}else if("vnd.android.cursor.item/email_v2".equals(mimetype))
					{
						contact.setEmail(data);
					}else if("vnd.android.cursor.item/phone_v2".equals(mimetype))
					{
						contact.getPhone().add(data);
					}else if("vnd.android.cursor.item/postal-address_v2".equals(mimetype))
					{
						contact.setAddress(data);
					}
					
					list.add(contact);
					
					Log.i(TAG, "mimetype=" + mimetype + "  data=" + data );
					
					}
					
				}
			}
			Log.i(TAG, "mimetype="  + "  data="  );
		}
	
	
	}
	
	private void writeContact() {
		//1.获得访问内容提供者的工具类
		ContentResolver resolver = getContentResolver();
		//2. 获取到已存入联系人数据库里面的最后一个联系人的contact_id,然后在加1 就是现在要添加的练习题的contact_id
		Uri raw_contact_uri = Uri.parse("content://com.android.contacts/raw_contacts");
		Cursor cursor = resolver.query(raw_contact_uri, new String[]{"contact_id"}, null, null, "contact_id desc limit 1");
		Integer max_contact_id = 0;
		
		if(null != cursor && cursor.moveToFirst())
		{
			max_contact_id = cursor.getInt(0);
		}
		
		max_contact_id = max_contact_id + 1;
		//3. 往raw_contact表里面添加contact_id
		ContentValues values = new ContentValues();
		values.put("contact_id", max_contact_id);
		
		raw_contact_uri = resolver.insert(raw_contact_uri, values);
		Log.i(TAG, "raw_contact_uri=" + raw_contact_uri);
		//4. 往data里面添加数据(姓名,email,address,phone等信息),注意:一个信息是一样记录,所以添加一个联系人的多个信息的时候要执行多个insert操作
		Uri data_uri = Uri.parse("content://com.android.contacts/data");
		
		values.clear(); //复用之前一定要清空否则会影响下面的插入操作
		values.put("raw_contact_id", max_contact_id);
		values.put("mimetype", "vnd.android.cursor.item/name");
		values.put("data1", "1505");
		resolver.insert(data_uri, values);
		
		values.clear(); //复用之前一定要清空否则会影响下面的插入操作
		values.put("raw_contact_id", max_contact_id);
		values.put("mimetype", "vnd.android.cursor.item/email_v2");
		values.put("data1", "4654654@qq,com");
		resolver.insert(data_uri, values);
		
		values.clear(); //复用之前一定要清空否则会影响下面的插入操作
		values.put("raw_contact_id", max_contact_id);
		values.put("mimetype", "vnd.android.cursor.item/phone_v2");
		values.put("data1", "16824524");
		resolver.insert(data_uri, values);
		
		values.clear(); //复用之前一定要清空否则会影响下面的插入操作
		values.put("raw_contact_id", max_contact_id);
		values.put("mimetype", "vnd.android.cursor.item/postal-address_v2");
		values.put("data1", "西安南路");
		resolver.insert(data_uri, values);
	}
}

package com.xh.tx.readcontact;

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

public class Contact {
	private String name;
	private String email;
	private String address;
	private List<String> phone = new ArrayList<String>();
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public List<String> getPhone() {
		return phone;
	}
	public void setPhone(List<String> phone) {
		this.phone = phone;
	}
	
}


### 如何在 Android 设备上读取联系人 要在 Android读取联系人,可以利用 `ContactsContract` API 来访问存储在设备上的联系人数据。下面是一个完整的代码示例来展示如何实现这一功能。 #### 请求权限 为了能够访问用户的联系人列表,应用程序需要声明相应的权限。这可以通过在应用的 `AndroidManifest.xml` 文件中添加以下权限来完成: ```xml <uses-permission android:name="android.permission.READ_CONTACTS"/> ``` 注意,在运行时也需要请求此权限以满足 Android 6.0 (API level 23) 及以上版本的安全需求[^1]。 #### 使用 ContentResolver 查询联系人信息 通过使用 `ContentResolver` 类查询 `ContactsContract.Contacts.CONTENT_URI`,可以获得所有联系人的基本信息。以下是具体的代码示例: ```java import android.content.ContentResolver; import android.database.Cursor; import android.os.Bundle; import android.provider.ContactsContract; public class ContactsReader { public static void readContacts(ContentResolver contentResolver) { Cursor cursor = null; try { // Query the list of all contact IDs and names. cursor = contentResolver.query( ContactsContract.Contacts.CONTENT_URI, new String[]{ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME}, null, null, null); if (cursor != null && cursor.getCount() > 0) { while (cursor.moveToNext()) { String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))); if (hasPhoneNumber > 0) { // Get phone numbers associated with this contact ID. Cursor phoneCursor = contentResolver.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER}, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null); if(phoneCursor != null){ while(phoneCursor.moveToNext()){ String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); System.out.println("Name: "+name+", Phone Number: "+phoneNumber); } phoneCursor.close(); } } else { System.out.println("Name without a number: " + name); } } } } catch(Exception e){ e.printStackTrace(); } finally{ if(cursor!=null){ cursor.close(); } } } } ``` 上述代码展示了如何获取并打印出每个联系人的名字及其电话号码。如果某个联系人没有关联任何电话号码,则只会显示其姓名。 #### LOOKUP_KEY 的作用 值得注意的是,当处理联系人记录时,可能遇到 `_ID` 发生变化的情况(比如因为同步或者合并)。此时可以依赖于 `LOOKUP_KEY` 提供的一个更稳定的引用方式。即使 `_ID` 改变,只要 `LOOKUP_KEY` 不变,就可以继续定位到相同的联系人条目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值