15921358397查询手机联系人名字反了

4663人阅读
android(65)
//根据分组查询联系人的projection zjm add
public static final String[] RAW_PROJECTION = new String[] { Data.RAW_CONTACT_ID, };
//根据分组查询联系人的selection zjm add
public static final String RAW_CONTACTS_WHERE = monDataKinds.GroupMembership.GROUP_ROW_ID
+ &=?&
+ & and &
+ Data.MIMETYPE
+ monDataKinds.GroupMembership.CONTENT_ITEM_TYPE
+ &'&;
//查询未分组联系人的过滤条件
public static final String RAW_CONTACTS_IN_NO_GROUP_SELECTION = &1=1) and &&
+ Data.RAW_CONTACT_ID&
+ & not in( select &&
+ Data.RAW_CONTACT_ID&
+ & from view_data_restricted where &&
+ Data.MIMETYPE&
+ &='&&
+ GroupMembership.CONTENT_ITEM_TYPE&
+ &') group by (&&
+ Data.RAW_CONTACT_ID;
//查询可显示且未删除的群组的过滤条件
public static final String VISIBLE_GROUP_SELECTION = ContactsContract.Groups.GROUP_VISIBLE&
+ &=1 and &
+ ContactsContract.Groups.DELETED&
+ &=0&;
* 获取所有未分组的联系人的rawId和name zjm add
private void getContactsNullCircles(){
List&ContactsBean& conBeanList = new ArrayList&ContactsBean&();
//查询未分组联系人的rawId 和 name
Cursor cursor = mContentResolver.query(
& & & & & & & & Data.CONTENT_URI,
& & & & & & & & null,
& & & & & & & & RAW_CONTACTS_IN_NO_GROUP_SELECTION,&
& & & & & & & & null, null);
int rawIdIndex = cursor.getColumnIndex(Data.RAW_CONTACT_ID);
while(cursor.moveToNext()){
long rawId = cursor.getLong(rawIdIndex);
String conName = getConDisplayNameByRawId(rawId);
Log.i(&raw id & name & num =&&, rawId + &&&& + conName + &&&& + i++);
* 获取各分组的联系人的rawId和name,及分组的id zjm add
private void getContactsInCircles(){
Cursor circleCursor = mContentResolver.query(Groups.CONTENT_URI, null,
VISIBLE_GROUP_SELECTION, null,
int circleIdIndex = circleCursor.getColumnIndex(Groups._ID);
//这里查询到的群组名字不是真正的显示名字,其实对应的应该是Group表中的display_title字段,
//但是貌似没有呢~表里有这个字段,但是api不提供这个字段的查询
int circleNameIndex = circleCursor.getColumnIndex(Groups.TITLE);
while (circleCursor.moveToNext()) {
long circleId = circleCursor.getLong(circleIdIndex);
String circleName = circleCursor.getString(circleNameIndex);
Log.i(&group id & name =&&, circleId + &&&& + circleName);
Cursor conRawIdCursor = mContentResolver.query(Data.CONTENT_URI, RAW_PROJECTION, &
& & & & &RAW_CONTACTS_WHERE, &&
& & & & &new String[]{&& + circleId}, &
& & & & &null);
//这里查询的是系统联系人data表中的RAW_CONTACT_ID字段,获取联系人的rawId
int rawIdIndex = conRawIdCursor.getColumnIndex(Data.RAW_CONTACT_ID);
while(conRawIdCursor.moveToNext()){
long conRawId = conRawIdCursor.getLong(rawIdIndex);
String conName = getConDisplayNameByRawId(conRawId);
Log.i(&####group id & name =&&, circleId + &&&& + circleName);
Log.i(&raw id & name & num =&&, conRawId + &&&& + conName + &&&& + i++);
* 根据联系人rawId获取displayName &zjm add
* @param rawId
private String getConDisplayNameByRawId(long rawId){
String[] name = getNameByRawId(rawId);
String displayName =
if (name[2] != null) {
displayName = name[2];
} else if (name[0] != null) {
displayName = name[0] + && + name[1];
} else if (name[1] != null) {
displayName = name[1];
return displayN
* 根据Id 得到 familyName 和 giveName [1,0]
public String[] getNameByRawId(long rawId) {
String name[] = new String[3];
Cursor cursor =
cursor = getContentResolver().query(Data.CONTENT_URI, null,
Data.RAW_CONTACT_ID + & = & + rawId + & and &
+ Data.MIMETYPE + & = '&
+ StructuredName.CONTENT_ITEM_TYPE + &'&, null,
if (cursor != null && cursor.getCount() & 0) {
cursor.moveToFirst();
name[0] = cursor.getString(cursor
.getColumnIndex(StructuredName.FAMILY_NAME));
if (name[0] == null) {
name[0] = &&;
name[1] = cursor.getString(cursor
.getColumnIndex(StructuredName.GIVEN_NAME));
if (name[1] == null) {
name[1] = &&;
name[2] = cursor.getString(cursor
.getColumnIndex(StructuredName.DISPLAY_NAME));
if (name[2] == null) {
name[2] = name[0] + name[1];
} catch (Exception e) {
} finally {
if (cursor != null && !cursor.isClosed()) {
cursor.close();
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:396373次
积分:4538
积分:4538
排名:第4237名
原创:66篇
转载:57篇
评论:99条
(1)(4)(16)(5)(6)(2)(6)(2)(1)(4)(3)(1)(2)(2)(3)(8)(2)(1)(3)(2)(3)(7)(7)(5)(3)(1)(1)(2)(2)(2)(8)(6)(3)[转载]android:获取联系人原理(姓名和电话)详解
原文地址:
最近在弄安卓联系人, 网上有很多资料,但是都很冗杂,经过自己的深层摸索,写下自己的学习心得:
1. android 里面的 联系人数据库 的存储 模式,对
联系人数据库的 字段介绍
2. 几种常用的查询联系人的 方式 直接给
android 里面的 联系人数据库 的存储 模式,对
联系人数据库的 字段介绍
Android中的联系人都保存在一个SQLite数据库中,有兴趣的可以使用adb直接push出来看一下里面的表和视图的结构,你也可以在网上下载Root
explorer 文件浏览器,在里面你可以直接打开
这个数据库文件,然后你对它的字段和结构一目了然,你帮助你升入了解有很大的帮助,建议你看看相关字段,然后你查询的时候
出现的字段就一目了然了!
它的路径为:/data/data/com.android.providers.
contacts/databases/contacts2.db
在联系人数据库中,保存的都是一些小的数据表,即与把所有数据保存成一个表不同,它会对联系人的资料模块化,然后分成多个表保存。
表与表之间使用id相关联起来,这样做的目的是尽量减小数据表的规模,提高数据检索的速度,因为我们检索的时候不是每次都需要读取所有的联系人资料的,这样可以更灵活的选择我们所关心的内容,提高检索速度,
虽然分开的保存数据,可以提高检索的速度,但是也给我们带来了一些不便,就是需要把这些分开的表再重新联合起来,组成我们所需要的完整的数据。好在这些,android已经替我们准备好了,它在数据库里面建了一些视图,呵呵,视图就是虚拟表。并且,android也提供了很多接口,通过ContentResolver().query方法,传入不同的URI即可访问相应的数据集。
在联系人数据库里面联系人和电话号码是分别存在两个表里面的,因为存在一个联系人拥有几个号码的情况,所以android为联系人和手机号码分别单独创建了相应的视图。
联系人信息的视图里面只保存与联系人相关的资料,例如姓名,是否有手机号码等。
而手机号码资料则是每一个电话号码为一条记录,如果有一个联系人有3个号码,则里面会出现3个该联系人的记录,号码分别为他的三个号码。
如果是需要读取联系人信息,传入的URI为:ContactsContract.Contacts.CONTENT_URI
如果是需要读取手机号码信息传入的URI为:monDataKinds.Phone.CONTENT_URI
一定不要忘记,读取联系人信息
不要忘记加 权限
& uses-permission
android:name=”android.permission.READ_CONTACTS” /&
& uses-permission
android:name=”android.permission.WRITE_CONTACTS” /&
下面再看看query函数的原型,只读取关心的字段,应该可以提高一点速度
(&uri,&&projection,&&selection,
&&selectionArgs,&&sortOrder)
projection:是需要读取的字段
selection:是数据检索的条件
selectionArgs:是数据检索条件的参数
sortOrder:是排序的字段
解释一下:假如一条sql语句如下:
select * &from
anyTable where var=’const’
那么anyTable就是uri,*就是projection,selection是“var=?”,selectionArgs写成这样:new
String[]{‘const‘}
至于最后一个就简单了,就是排序方式。
在android联系人表里面一个两个比较有意思的字体sort_key和sort_key_alt,它里面保存的是联系人名字的拼音字母,
例如联系人名字是“李明”,则sort_key保存的是“LI李MING明”,这样如果是按sort_key或sort_key_alt排序的话,就可以实现按汉字的拼音字母排序了
先去用Root explorer
文件浏览器打开contacts2.db 数据库,看看里面的字段有助于你理解现在查询是 输入的选择条件
2.几种常用的查询联系人的 方式
直接给 代码 &
&查询所有联系人(姓名+number
Cursor cursor =
getContentResolver().query(ContactsContract.
Contacts.CONTENT_URI,null,
while(cursor.moveToNext()){
String id =
cursor.getString(cursor.getColumnIndex(
ContactsContract.Contacts._ID));
String name =
cursor.getString(cursor.getColumnIndex(
ContactsContract.Contacts.DISPLAY_NAME));
Log.d("TAG" ,
"Name is : "+name);
int isHas =
Integer.parseInt(cursor.getString(cursor.
getColumnIndex(ContactsContract.Contacts.
HAS_PHONE_NUMBER)));
if(isHas&0){
Cursor c =
getContentResolver().query(ContactsContract.
CommonDataKinds.
Phone.CONTENT_URI,null,
monDataKinds.Phone.CONTACT_ID+
id,null,null);
while(c.moveToNext()){
String number =
c.getString(c.getColumnIndex(ContactsContract.
CommonDataKinds.Phone.NUMBER));
Log.d("TAG " ,
"Number is :
"+number);
c.close();
cursor.close();
(2). 根据关键字来模糊查询联系人(关键字)(
根据确定的姓名 或者电话号码来查询也是一样的)
String key =
String[] projection = {
ContactsContract.PhoneLookup.
DISPLAY_NAME,
monDataKinds.Phone.NUMBER
Cursor cursor
= this.getContentResolver().query(
monDataKinds.Phone.
CONTENT_URI,projection, // Which columns to return.
// 这是模糊查询
ContactsContract.PhoneLookup.DISPLAY_NAME+"
" '%"+key+"%'"
// WHERE clause.
//(如果你根据具体的条件来查询也可以这样写:)
monDataKinds.Phone.NUMBER + " = '"
//+ number + "'", // WHERE
clause.&&& //
这是根据电话号码来查询
// ContactsContract.Contacts.DISPLAY_NAME
//+ name+ "'", // WHERE
clause.&&& //
这是根据姓名来查询
// WHERE clause value
substitution
// Sort order.
if (cursor
== null) {
Log.v("tag",
"getPeople
Log.d("tag",
"getPeople cursor.getCount() =
cursor.getCount());
for (int i =
cursor.getCount(); i++) {
cursor.moveToPosition(i);
String uname =
cursor.getString(cursor.
getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
Log.v("TAG" ,
"Name is : "+uname);
String number =
cursor.getString(cursor.
monDataKinds.
Phone.NUMBER));
Log.v("TAG " ,
"Number is :
"+number);
cursor.close();
删除联系人&
context.getContentResolver().delete(Uri.
parse(ContactsContract.
RawContacts.CONTENT_URI.toString()
ContactsContract.CALLER_IS_SYNCADAPTER+"
ContactsContract.RawContacts._ID +
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。苹果证实从这个月开始,所有的中国区上架游戏都必须有出版批文(版号)才能通过审核,...
提高存储容量无疑会让新一代 iPhone 受到更多人的欢迎。
近日 ChinaJoy 主办方公布了 2016 年 SG着装管理规定。
也许苹果真的把宝押在了明年的十周年款iPhone身上,会不会太冒险了点。
每年苹果都会针对教育用户推出优惠活动,今年的最大赢家也许会出乎你的意料。
下半年越来越多智能手机加入战团了~
不知道iPhone 7发布当天的情况又会变得怎么样,你买过二手iPhone吗?
两家都是美国硅谷巨头,所以谁也占不到谁的便宜。
《精灵宝可梦GO》此前该作品已经在部分地区中分批上架了,而在今天新西兰区等地区也迎...
《神秘任务3(Arcane Quest 3)》是由 Marco Pravato推出的一款策略RPG游戏。游戏将冒...
《Procreate(大师级画板)》 是 iOS绘画应用中当之无愧的神器,它的 iPad 版曾获得 W...
近日,由著名导演斯皮尔伯格执导的电影《吹梦巨人(The BFG)》在北美地区上映了,而...
这款游戏正是以“天空之城”为主题,只不过游戏相比起前者的平和自然,逗趣和对战的戏...
在这里玩家要扮演一位冒险家,为了宝藏深入神秘的地牢和洞穴。
说到乐高公司,不少人最先想到的可能就是他们所推出的玩具,作为全球知名的玩具制造公...
买个麦克风一起录歌吧!
牵一发而动全身,取消3.5mm耳机插孔甚至会左右我们的手机使用习惯?
这款堪比 iPhone 4 的划时代产品,究竟怎么样。不妨由毫无航拍飞行经验的笔者来进行体...
这款 Razor Platinum 移动电源是 Mycharge 公司开发的首款支持 USB-C 数据线的产品。
有道云笔记是是网易旗下有道搜索推出的笔记类应用,通过云存储技术帮助用户建立一个可...
不知道在秋季发布会正式开始的时候,iPhone 7还能剩下多少秘密。
如果苹果下一代 iPhone 将不再使用传统的 3.5 毫米耳机插孔,那么配件厂商们就需要准...
如果iPhone 7真的取消了3.5mm接口,苹果看起来是不想给其它耳机厂商机会了。
用AIRDROP,为什么显示不是联系人的姓名呢?
注册时间 最后登录
在线时间98 小时 UID
主题帖子人气
青苹果, 积分 168, 距离下一级还需 32 积分
我和我老公两部手机,用AIRDROP传照 片的时候,他搜索到我手机显示是联系人姓名和头像,但我的手机搜索到他就显示的是IPAD,这个有没有什么解决办法啊??PS:我家所有苹果设备都用的同一个苹果ID
注册时间 最后登录
在线时间1819 小时 UID
主题帖子人气
本帖最后由 jy 于
19:19 编辑
昵称优先,没昵称的会显示机器关于里面的名称如果是同一个ID的话,你要新建一个联系人
将你所有的机器的联系方式都添加到你这个联系人里面,这样应该可以解决的了,还有siri里面可以定义你的机器的称呼的,尝试一下吧,联系人里也可以直接编辑
(265.86 KB, 下载次数: 16)
19:19 上传
注册时间 最后登录
在线时间98 小时 UID
主题帖子人气
请问是怎么设置的呢?
注册时间 最后登录
在线时间1819 小时 UID
主题帖子人气
请问是怎么设置的呢?
要看你具体是想每台机器的称呼不一样还是说想每台显示的都一样了
注册时间 最后登录
在线时间98 小时 UID
主题帖子人气
要看你具体是想每台机器的称呼不一样还是说想每台显示的都一样了
我就是想设置成 搜索到的手机,显示的是持有那个手机的联系人的姓名啊,不想显示都一样
注册时间 最后登录
在线时间1819 小时 UID
主题帖子人气
我就是想设置成 搜索到的手机,显示的是持有那个手机的联系人的姓名啊,不想显示都一样 ...
如果都是电话就很方便的,每一台的号码都新建一个联系人然后起名字起使用者的称呼就可以了
举例A电话号码是“000,那么你新建一个联系人电话选iphone,然后讲000填进去
B电话是111,同样设置,因为你所有机器用同一个id 他会直接显示的,插卡的ipad也可以这样解决
WiFi版ipad的话可以通过直接编辑设置-通用-关于里面的机器名称来解决,其实电话也可以这样解决的
注册时间 最后登录
在线时间1819 小时 UID
主题帖子人气
你还可以每个不同设备都用不同的头像来新建联系人,这样一看就知道了
注册时间 最后登录
在线时间1819 小时 UID
主题帖子人气
其实说实话,所有设备用一个ID的话,最痛苦的事情莫过于imessage会所有机器一起收到,我说的并不是私隐信息问题
如果iso8的话handoff你更痛苦
注册时间 最后登录
在线时间1819 小时 UID
主题帖子人气
靠,我这么热心起码一个回复给我来1分啦。。。。。。。。
<p id="rate_82770" onmouseover="showTip(this)" tip="不提忘了可以加分…-_-#&人气 + 1
" class="mtn mbn">
不提忘了可以加分…-_-#
注册时间 最后登录
在线时间98 小时 UID
主题帖子人气
不过刚拿到两部电话试过了,都互相是联系人,但是搜索出来都是显示某某iphone,始终不显示联系人姓名啊,头都想烂了…回5楼jy于半小时前发表的:
如果都是电话就很方便的,每一台的号码都新建一个联系人然后起名字起使用者的称呼就可以了
举例A电话号码是“000,那么你新建一个联系人电话选iphone,然后讲000填进去
B电话是111,同样设置,因为你所有机器......
威锋旗下产品
Hi~我是威威!
沪公网安备 29号 | 沪ICP备号-1
新三板上市公司威锋科技(836555)
增值电信业务经营许可证:
Powered by Discuz!1174人阅读
Android(13)
Java(14)
Android通讯录模糊查询搜索(号码,姓名,首字母简拼,全拼),批量选取联系人
&&公司最近的项目中遇到一个需求需要读取通讯录联系人,并需要支持对联系人的模糊查询及批量选取,网上找了好几个例子,模糊查询这块处理的都有点小瑕疵,最终自己在各位网友的辛勤贡献基础之上进行了优化,最终做出了联系人模糊查询.
支持以下功能:
号码 , 姓名 , 首字母简拼 , 全拼 模糊查询
2.支持[A-Z]快速导航
3.支持联系人按首字母分类
4.支持联系人批量选取.
最新代码详见,具体github地址:&&
ContactsActivity:
package com.xbc.utils.
import java.util.ArrayL
import java.util.C
import java.util.L
import java.util.L
import android.app.A
import android.content.ContentR
import android.database.C
import android.os.B
import android.monDataKinds.P
import android.text.E
import android.text.TextU
import android.text.TextW
import android.util.L
import android.view.V
import android.view.View.OnClickL
import android.widget.AdapterV
import android.widget.AdapterView.OnItemClickL
import android.widget.EditT
import android.widget.ImageV
import android.widget.ListV
import android.widget.TextV
import android.widget.T
import com.xbc.contacts.R;
import com.xbc.utils.activity.ContactsSortAdapter.ViewH
import com.xbc.utils.activity.SideBar.OnTouchingLetterChangedL
public class ContactsActivity extends Activity {
ListView mListV
EditText etS
ImageView ivClearT
private SideBar sideB
private TextV
private List&SortModel& mAllContactsL
private ContactsSortA
* 汉字转换成拼音的类
private CharacterParser characterP
* 根据拼音来排列ListView里面的数据类
private PinyinComparator pinyinC
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_contacts);
private void init() {
initView();
initListener();
loadContacts();
private void initListener() {
/**清除输入字符**/
ivClearText.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
etSearch.setText(&&);
etSearch.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
public void afterTextChanged(Editable e) {
String content = etSearch.getText().toString();
if (&&.equals(content)) {
ivClearText.setVisibility(View.INVISIBLE);
ivClearText.setVisibility(View.VISIBLE);
if (content.length() & 0) {
ArrayList&SortModel& fileterList = (ArrayList&SortModel&) search(content);
adapter.updateListView(fileterList);
//mAdapter.updateData(mContacts);
adapter.updateListView(mAllContactsList);
mListView.setSelection(0);
//设置右侧[A-Z]快速导航栏触摸监听
sideBar.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener() {
public void onTouchingLetterChanged(String s) {
//该字母首次出现的位置
int position = adapter.getPositionForSection(s.charAt(0));
if (position != -1) {
mListView.setSelection(position);
mListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView&?& adapterView, View view, int position, long arg3) {
ViewHolder viewHolder = (ViewHolder) view.getTag();
viewHolder.cbChecked.performClick();
adapter.toggleChecked(position);
private void initView() {
sideBar = (SideBar) findViewById(R.id.sidrbar);
dialog = (TextView) findViewById(R.id.dialog);
sideBar.setTextView(dialog);
ivClearText = (ImageView) findViewById(R.id.ivClearText);
etSearch = (EditText) findViewById(R.id.et_search);
mListView = (ListView) findViewById(R.id.lv_contacts);
/** 给ListView设置adapter **/
characterParser = CharacterParser.getInstance();
mAllContactsList = new ArrayList&SortModel&();
pinyinComparator = new PinyinComparator();
Collections.sort(mAllContactsList, pinyinComparator);// 根据a-z进行排序源数据
adapter = new ContactsSortAdapter(this, mAllContactsList);
mListView.setAdapter(adapter);
private void loadContacts() {
new Thread(new Runnable() {
public void run() {
ContentResolver resolver = getApplicationContext().getContentResolver();
Cursor phoneCursor = resolver.query(Phone.CONTENT_URI, new String[] { Phone.DISPLAY_NAME, Phone.NUMBER, &sort_key& }, null, null, &sort_key COLLATE LOCALIZED ASC&);
if (phoneCursor == null || phoneCursor.getCount() == 0) {
Toast.makeText(getApplicationContext(), &未获得读取联系人权限 或 未获得联系人数据&, Toast.LENGTH_SHORT).show();
int PHONES_NUMBER_INDEX = phoneCursor.getColumnIndex(Phone.NUMBER);
int PHONES_DISPLAY_NAME_INDEX = phoneCursor.getColumnIndex(Phone.DISPLAY_NAME);
int SORT_KEY_INDEX = phoneCursor.getColumnIndex(&sort_key&);
if (phoneCursor.getCount() & 0) {
mAllContactsList = new ArrayList&SortModel&();
while (phoneCursor.moveToNext()) {
String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);
if (TextUtils.isEmpty(phoneNumber))
String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX);
String sortKey = phoneCursor.getString(SORT_KEY_INDEX);
//System.out.println(sortKey);
SortModel sortModel = new SortModel(contactName, phoneNumber, sortKey);
//优先使用系统sortkey取,取不到再使用工具取
String sortLetters = getSortLetterBySortKey(sortKey);
if (sortLetters == null) {
sortLetters = getSortLetter(contactName);
sortModel.sortLetters = sortL
sortModel.sortToken = parseSortKey(sortKey);
mAllContactsList.add(sortModel);
phoneCursor.close();
runOnUiThread(new Runnable() {
public void run() {
Collections.sort(mAllContactsList, pinyinComparator);
adapter.updateListView(mAllContactsList);
} catch (Exception e) {
Log.e(&xbc&, e.getLocalizedMessage());
}).start();
* 名字转拼音,取首字母
* @param name
private String getSortLetter(String name) {
String letter = &#&;
if (name == null) {
//汉字转换成拼音
String pinyin = characterParser.getSelling(name);
String sortString = pinyin.substring(0, 1).toUpperCase(Locale.CHINESE);
// 正则表达式,判断首字母是否是英文字母
if (sortString.matches(&[A-Z]&)) {
letter = sortString.toUpperCase(Locale.CHINESE);
* 取sort_key的首字母
* @param sortKey
private String getSortLetterBySortKey(String sortKey) {
if (sortKey == null || &&.equals(sortKey.trim())) {
String letter = &#&;
//汉字转换成拼音
String sortString = sortKey.trim().substring(0, 1).toUpperCase(Locale.CHINESE);
// 正则表达式,判断首字母是否是英文字母
if (sortString.matches(&[A-Z]&)) {
letter = sortString.toUpperCase(Locale.CHINESE);
* 模糊查询
* @param str
private List&SortModel& search(String str) {
List&SortModel& filterList = new ArrayList&SortModel&();//过滤后的list
if (str.matches(&^([0-9]|[/+])*$&)) {//正则表达式 匹配号码
for (SortModel contact : mAllContactsList) {
if (contact.number != null && contact.name != null) {
if (contact.number.contains(str) || contact.name.contains(str)) {
if (!filterList.contains(contact)) {
filterList.add(contact);
for (SortModel contact : mAllContactsList) {
if (contact.number != null && contact.name != null) {
//姓名全匹配,姓名首字母简拼匹配,姓名全字母匹配
if (contact.name.toLowerCase(Locale.CHINESE).contains(str.toLowerCase(Locale.CHINESE))
|| contact.sortKey.toLowerCase(Locale.CHINESE).replace(& &, &&).contains(str.toLowerCase(Locale.CHINESE))
|| contact.sortToken.simpleSpell.toLowerCase(Locale.CHINESE).contains(str.toLowerCase(Locale.CHINESE))
|| contact.sortToken.wholeSpell.toLowerCase(Locale.CHINESE).contains(str.toLowerCase(Locale.CHINESE))) {
if (!filterList.contains(contact)) {
filterList.add(contact);
return filterL
String chReg = &[\\u4E00-\\u9FA5]+&;//中文字符串匹配
//String chReg=&[^\\u4E00-\\u9FA5]&;//除中文外的字符匹配
* 解析sort_key,封装简拼,全拼
* @param sortKey
public SortToken parseSortKey(String sortKey) {
SortToken token = new SortToken();
if (sortKey != null && sortKey.length() & 0) {
//其中包含的中文字符
String[] enStrs = sortKey.replace(& &, &&).split(chReg);
for (int i = 0, length = enStrs. i & i++) {
if (enStrs[i].length() & 0) {
//拼接简拼
token.simpleSpell += enStrs[i].charAt(0);
token.wholeSpell += enStrs[i];
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:12864次
排名:千里之外
原创:13篇
评论:16条
(3)(1)(2)(1)(1)(1)(3)(1)(1)(1)(1)(2)(2)

我要回帖

更多关于 qq邮箱修改联系人名字 的文章

 

随机推荐