[微信取消通讯录匹配]获取iPhone通讯录信息
[微信取消通讯录匹配]获取iPhone通讯录
信息
篇一 : 获取iPhone通讯录信息
iPhone中联系人的信息是存放在系统数据库中的。[)数据库
中的每一笔记录都是一个ABRecordRef实例。
通讯录主要存放两种记录:
1、联系人的信息:是ABPerson类型。主要包括联系人的姓名,
电话号码,地址信息。
2、分组信息:是ABGroup类型。用于将联系人分到不同的组
中。它只有一个属性,
示分组名称。
在viewDidLoad中添加下面代码,获取所有联系人和分组信
息:
ABAddressBookRef addressBook
=ABAddressBookCreate;CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople ;CFArrayRef allGroups =
ABAddressBookCopyArrayOfAllGroups;for allPeople)[self
logContact:person];for allGroups)[self logGroup:group];CFRelease;CFRelease;CFRelease;
使用ABAddressBookCreate创建一个AddressBook实例。
ABAddressBook CopyArrayOfAllPeople和ABAddressBook
CopyArrayOfAllGroups查询出所有的联系人和分组信息。通过循环,
使用logPerson和logGroup两个方法将信息输出到控制台上。
logPerson方法:
CFStringRef name = ABRecordCopyCompositeName;
ABRecordID recId = ABRecordGetRecordID;
NSLog;
logGroup方法:
CFStringRef name = ABRecordCopyValue;
ABRecordID recId = ABRecordGetRecordID;
NSLog;
前言:前阵子主要是记录了如何对联系人的一些操作,比如搜
索,全选、反选和删除等在实际开发中可能需要实现的功能,本篇博
客是小巫从一个别人开源的一个项目抽取出来的部分
,把它给简
化出来,可以让需要的朋友清楚知道如何对Android数据库操作,异
步查询数据库获取我们需要的内
容。 { return contactId; } public void setContactId { this.contactId = contactId; } public String getDesplayName { return desplayName; } public void setDesplayName { this.desplayName = desplayName; }
public String getPhoneNum { return phoneNum; }
public void setPhoneNum { this.phoneNum = phoneNum; } public String getSortKey { return sortKey; }
public void setSortKey { this.sortKey = sortKey; } public Long getPhotoId { return photoId; } public void setPhotoId { this.photoId = photoId; } public String getLookUpKey { return lookUpKey; } public void setLookUpKey { this.lookUpKey = lookUpKey; 扩
展:手机通讯录联系人恢复 / 微信通讯录删除联系人 / 微信通讯录
联系人消失
} public int getSelected { return selected; }
public void setSelected { this.selected = selected; }
public String getFormattedNumber { return formattedNumber; } public void setFormattedNumber { this.formattedNumber = formattedNumber; } public String getPinyin {
return pinyin; } public void setPinyin { thi
s.pinyin = pinyin; } }
/Contact_Demo/src/com/suntek/contact/adapter/ContactListAdapter.java
package com.suntek.contact.adapter; import java.io.InputStream; impo
rt java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.regex.Pattern; import android.content.ContentUris; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.provider.ContactsContract; import android.provider.ContactsContract.Contacts; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.QuickContactBadge; import android.widget.TextView; import com.suntek.contact.R; import com.suntek.contact.model.ContactBean; import com.suntek.contact.view.QuickAlphabeticBar; public class ContactListAdapter extends BaseAdapter { private LayoutInflater inflater; private List list; private HashMap alphaIndexer; // 字母索
引 private String[] sections; // 存储每个章
节 private Context ctx; // 上下
文 public ContactListAdapter { this.ctx = context;
this.inflater = LayoutInflater.from; this.list = list; this.alphaIndexer = new HashMap; this.sections = new String[list.size]; for ; i++) { // 得到字母 扩展:手机通讯
录联系人恢复 / 微信通讯录删除联系人 / 微信通讯录联系人消失
String name = getAlpha.getSortKey); if ) { alphaIndexer.put; } } Set sectionLetters = alphaIndexer.keySet; ArrayList sectionList = new ArrayList;
Collections.sort; // 根据首字母进行排
序 sections = new String[sectionList.size]; sectionList.toArray; alpha.setAlphaIndexer; } @Override
public int getCount { return list.size; } @Override
public Object getItem { return list.get; } @Override
public long getItemId { return position; } public void remove { list.remove; } @Override public View getView { ViewHolder holder; if {
convertView = inflater.inflate; holder = new ViewHolder;
holder.quickContactBadge = convertView .findViewById; holder.alpha = convertView.findViewById;
holder.name = convertView.findViewById; holder.number =
convertView.findViewById; convertView.setTag; } else { holder = convertView.getTag; }
ContactBean contact = list.get; String name = contact.getDesplayName; String number = contact.getPhoneNum; 扩展:手
机通讯录联系人恢复 / 微信通讯录删除联系人 / 微信通讯录联系人
消失
holder.name.setText; holder.number.setText; holder.quickContactBadge.assignContactUri, contact.getLookUpKey)); if ) { holder.quickContactBadge.setImageResource; }
else { Uri uri = ContentUris.withAppendedId);
InputStream input = ContactsContract.Contacts .openContactPhotoInputStream, uri); Bitmap contactPhoto = BitmapFactory.decodeStream; holder.quickContactBadge.setImageBitmap; } // 当前字
母 String currentStr = getAlpha); // 前面的字
母 String previewStr = >= 0 ? getAlpha.getSortKey) : ” ”;
if ) { holder.alpha.setVisibility; holder.alpha.setText; } else { holder.alpha.setVisibility; }
return convertView; } private static class ViewHolder { QuickContactBadge quickContactBadge; TextView alpha; TextView name; TextView number; }
/** * 获取首字
母 * * @param str * @return */ private String getAlpha { if { return ”#”; } if .l
ength == 0) { return ”#”; 扩展:手机通讯录联系人恢
复 / 微信通讯录删除联系人 / 微信通讯录联系人消失
} char c = str.trim.substring.charAt; // 正则
表达式匹
配 Pattern pattern = Pattern.compile; if .matches) {
return .toUpperCase; // 将小写字母转换为大
写 } else { return ”#”; } } }
/Contact_Demo/src/com/suntek/contact/ContactListActivity.java
package com.suntek.contact; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.AsyncQueryHandler; import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.view.View; import android.widget.ListView;
import com.suntek.contact.adapter.ContactListAdapter; import com.suntek.contact.model.ContactBean; import com.suntek.contact.view.QuickAlphabeticBar; /** * 联系人列
表 * * @author Administrator * */ public class ContactListActivity extends Activity { private ContactListAdapter adapter; private
ListView contactList; private List list; private AsyncQueryHandler asyncQueryHandler; // 异步查询数据库类对
象 private QuickAlphabeticBar alphabeticBar; // 快速索引
条 private Map contactIdMap = null; @Override protected void onCreate { super.onCreate; setContentView;
contactList = findViewById; alphabeticBar = findViewById; // 实例
化 asyncQueryHandler = new MyAsyncQueryHandler);
init; } /** * 初始化数据库查询参
数 */ private void init { Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; // 联系人Uri; // 查
询的字
段 String[] projection = { ContactsContract.CommonDataKinds.Phone._ID, 扩展:手机通讯录联系人恢复 / 微信通讯录删除联
系人 / 微信通讯录联系人消失
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.DATA1, ”sort_key”,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
ContactsContract.CommonDataKinds.Phone.PHOTO_ID,
ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY };
// 按照sort_key升序查
詢 asyncQueryHandler.startQuery; } /** *
* @author Administrator * */ private class MyAsyncQueryHandler extends AsyncQueryHandler { public MyAsyncQueryHandler { super; } @Override
protected void onQueryComplete { if > 0) {
contactIdMap = new HashMap; list = new ArrayList;
cursor.moveToFirst; // 游标移动到第一
项 for ; i++) { cursor.moveToPosition; String name = cursor.getString;
String number = cursor.getString; String sortKey = cursor.getString; int contactId = cursor.getInt;
Long photoId = cursor.getLong; String lookUpKey =
cursor.getString; if ) { // 无操作 扩展:手机通讯录联系人恢复 / 微信通讯录删除联系人
/ 微信通讯录联系人消失
} else { // 创建联系人对
象 ContactBean contact = new ContactBean;
contact.setDesplayName; contact.setPhoneNum; contact.setSortKey; contact.setPhotoId; contact.setLookUpKey;
list.add; contactIdMap.put;
} } if > 0) { setAdapter; } } super.onQueryComplete; } } private void setAdapter { adapter = new ContactListAdapter; contactList.setAdapter;
alphabeticBar.init; alphabeticBar.setListView; alphabeticBar.setHight); alphabeticBar.setVisibility; } }
自定义组件:
package com.suntek.contact.view; import android.content.Context; imp
ort android.util.AttributeSet; import android.view.MotionEvent; import android.widget.LinearLayout; public class SlidingLinearLayout extends
LinearLayout { public SlidingLinearLayout { super;
} @Override public boolean onInterceptTouchEvent {
return super.onInterceptTouchEvent; 扩展:手机通讯录联系
人恢复 / 微信通讯录删除联系人 / 微信通讯录联系人消失
} }
/Contact_Demo/src/com/suntek/contact/view/QuickAlphabeticBar.java
package com.suntek.contact.view; import java.util.HashMap; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Typeface; import android.os.Handler; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.ImageButton; import android.widget.ListView; import android.widget.TextView; import com.suntek.contact.R; /** * 字母索引
条 * * @author Administrator * */ public class QuickAlphabeticBar extends ImageButton { private TextView mDialogText; // 中间显示
字母的文本框 private Handler mHandler; // 处理UI的句
柄 private ListView mList; // 列表 private float mHight; // 高
度 // 字母列表索
引 private String[] letters = new String[] { ”#”, ”A”, ”B”, ”C”, ”D”,
”E”, “F”, ”G”, ”H”, ”I”, ”J”, ”K”, ”L”, ”M”, ”N”, ”O”, ”P”,
”Q”, ”R”, “S”, ”T”, ”U”, ”V”, ”W”, ”X”, ”Y”, ”Z” }; /
/ 字母索引哈希
表 private HashMap alphaIndexer; Paint paint = new Paint;
boolean showBkg = false; int choose = -1; public QuickAlphabeticBar { super; } public QuickAlphabeticBar {
super; } public QuickAlphabeticBar { super; }
// 初始
化 public void init { mDialogText = ctx.findViewById;
mDialogText.setVisibility; mHandler = new Handler; }
// 设置需要索引的列
表 public void setListView { this.mList = mList; }
// 设置字母索引哈希
表 public void setAlphaIndexer { 扩展:手机通讯录联系人恢
复 / 微信通讯录删除联系人 / 微信通讯录联系人消失
this.alphaIndexer = alphaIndexer; } // 设置字母索
引条的高
度 public void setHight { this.mHight = mHight; }
@Override public boolean onTouchEvent { int act = event.getAction; float y = event.getY; final int oldChoose = choose; // 计算手指位置,找到对应的段,让mList移动段开
头的位置上 int selectIndex = ); if { // 防止越
界 String key = letters[selectIndex]; if ) {
int pos = alphaIndexer.get; if > 0) { // 防止
ListView有标
栏,本例中没
有 this.mList.setSelectionFromTop, 0);
} else { this.mList.setSelectionFromTop;
} mDialogText.setText; } } switch { case MotionEvent.ACTION_DOWN:
showBkg = true; if { if {
choose = selectIndex; invalidate; }
} if { mHandler.post {
@Override 扩展:手机通讯录联系人恢复 / 微信通
讯录删除联系人 / 微信通讯录联系人消失
public void run { if == View.INVISIBLE) {
mDialogText.setVisibility; }
} }); } break; case MotionEvent.ACTION_MOVE: if { if {
choose = selectIndex; invalidate; }
} break; case MotionEvent.ACTION_UP: showBkg = false; choose = -1;
if { mHandler.post { @Override
public void run { if == View.VISIBLE) {
mDialogText.setVisibility; }
} }); } break; default: 扩展:手机通讯录联系人恢复 / 微信通讯录删除联系人 / 微
信通讯录联系人消失
break; } return super.onTouchEvent; } @Override protected void onDraw { super.onDraw;
int height = getHeight; int width = getWidth; int sigleHeight = height / letters.length; // 单个字母占的高
度 for { paint.setColor; paint.setTextSize; paint.setTypeface; paint.setAntiAlias;
if { paint.setColor); // 滑动时按下字母颜
色 paint.setFakeBoldText; } // 绘画的位
置 float xPos = width / 2 - paint.measureText / 2;
float yPos = sigleHeight * i + sigleHeight; canvas.drawText;
paint.reset; } } }
扩展:手机通讯录联系人恢复 / 微信通讯录删除联系人 / 微
信通讯录联系人消失
上一篇文章:[怀念我永远的家鑫哥哥]永远的
十八岁小哥哥——纪念廖有梁前辈
下一篇文章:[形容有学问的成语]形容有学问的成语