Android获取手机联系人及检索
来源:互联网 发布:京东秒抢软件 编辑:程序博客网 时间:2024/05/22 05:12
又是时隔好久才来写文章,,,,,悲惨啊...最近在项目中有一个获取手机联系人并且可以通过短信来邀请他的这么一个功能...今天来写一篇获取手机联系人和检索联系人的文章....也查看了网上很多的文章..感觉大部分都可以直接使用,所以决定自己试试...好了下面就开始吧...
1. 添加相关权限
<!-- 读取联系人权限 --><uses-permission android:name="android.permission.READ_CONTACTS"/><uses-permission android:name="android.permission.WRITE_CONTACTS"/>
2.我们在画一下布局
首先是activity的布局,如下:
一个自定义的EditText ,一个listView ,一个SideBar
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <View android:layout_width="match_parent" android:layout_height="1px" android:background="@color/light_gray"/> <com.yuandian.wanna.view.ClearEditText android:id="@+id/filter_edit" android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginTop="5dip" android:background="@color/white" android:hint="搜索联系人" android:paddingLeft="10dp" android:singleLine="true" android:textColor="@color/black" android:textColorHint="@color/light_gray" android:textSize="15.0dip"/> <View android:layout_width="match_parent" android:layout_height="1px" android:background="@color/light_gray"/> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/country_lvcountry" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" android:divider="@null" android:scrollbars="none"/> <TextView android:id="@+id/title_layout_no_friends" android:layout_width="fill_parent" android:layout_height="30dp" android:layout_gravity="right|top" android:background="#E0E0E0" android:gravity="center_vertical" android:text="没有匹配的联系人" android:textColor="#454545" android:visibility="gone"/> <LinearLayout android:id="@+id/title_layout" android:layout_width="match_parent" android:layout_height="30dp" android:layout_gravity="right|top" android:background="#ff303030" android:orientation="vertical"> <TextView android:id="@+id/title_layout_catalog" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#E0E0E0" android:paddingBottom="5dip" android:paddingLeft="5dip" android:paddingTop="5dip" android:textColor="#454545"/> </LinearLayout> <TextView android:id="@+id/dialog" android:layout_width="80.0dip" android:layout_height="80.0dip" android:layout_gravity="center" android:background="@android:color/darker_gray" android:gravity="center" android:textColor="#ffffffff" android:textSize="30.0dip" android:visibility="invisible"/> <com.yuandian.wanna.activity.chat.readcontacts.view.SideBar android:id="@+id/sidrbar" android:layout_width="30dip" android:layout_height="match_parent" android:layout_gravity="right|center"/> </FrameLayout></LinearLayout>
下面是ListView 的item 布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!--android:layout_gravity="right" android:background="?android:attr/activatedBackgroundIndicator"--> <TextView android:id="@+id/catalog" android:layout_width="fill_parent" android:layout_height="30dp" android:background="#E0E0E0" android:paddingBottom="5dip" android:paddingLeft="5dip" android:paddingTop="5dip" android:text="A" android:textColor="#454545"/> <LinearLayout android:layout_width="match_parent" android:layout_height="62dp" android:background="@color/white" android:orientation="horizontal" android:padding="6dip"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_gravity="left" android:layout_weight="1" android:orientation="vertical" android:paddingLeft="10dp"> <TextView android:id="@+id/contact_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="false" android:layout_centerVertical="true" android:gravity="center_vertical" android:text="姓名" android:textColor="@color/black" android:textSize="18dp"/> </RelativeLayout> </LinearLayout> <LinearLayout android:id="@+id/mBottomLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:visibility="gone"> <View android:layout_width="match_parent" android:layout_height="10dp" android:background="#f2f2f2"/> </LinearLayout></LinearLayout>
然后就是Activity代码:
我们通过Cursor 来获取联系人
ContentResolver cr = getContentResolver(); phoneContacts = new ArrayList<PhoneContacts>(); Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_ALTERNATIVE); if (cursor != null && cursor.getCount() > 0) { Log.d("AYD", "cursor size is " + cursor.getCount()); phonelist = new PhoneContactsList(); list = new ArrayList<>(); except = new HashMap<>(); cursor.moveToPosition(-1); //通过while循环取出数据并放到list中 while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); String phone = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); phone = PhoneNumberFommatter.NumberFommatter(phone); PhoneContacts contacts = new PhoneContacts(name, phone); ContactInfoBean mContact = new ContactInfoBean(name, phone); except.put(phone, list.size()); list.add(mContact); phoneContacts.add(contacts); mContact.setPhoneName(mContact.getPhoneName()); // 汉字转换成拼音 String pinyin = characterParser.getSelling(mContact.getPhoneName()); String sortString = pinyin.substring(0, 1).toUpperCase(); // 正则表达式,判断首字母是否是英文字母 if (sortString.matches("[A-Z]")) { mContact.setSortLetters(sortString.toUpperCase()); } else { mContact.setSortLetters("#"); } } cursor.close(); phonelist.setPhoneContacts(phoneContacts); Collections.sort(list, pinyinComparator); } else { Toast.makeText(this, "没有联系人", Toast.LENGTH_LONG).show(); }检索list中的数据:
/** * 根据输入框中的值来过滤数据并更新ListView * * @param filterStr */ private void filterData(String filterStr) { List<ContactInfoBean> filterDateList = new ArrayList<>(); if (TextUtils.isEmpty(filterStr)) { filterDateList = list; tvNofriends.setVisibility(View.GONE); } else { filterDateList.clear(); for (ContactInfoBean sortModel : list) { String name = sortModel.getPhoneName(); if (name.indexOf(filterStr.toString()) != -1 || characterParser.getSelling(name).startsWith( filterStr.toString())) { filterDateList.add(sortModel); } } } // 根据a-z进行排序 Collections.sort(filterDateList, pinyinComparator); adapter.updateListView(filterDateList); if (filterDateList.size() == 0) { tvNofriends.setVisibility(View.VISIBLE); } }然后就是Adapter中的数据显示附上所有的代码
public class ContactsAdapter extends BaseAdapter { private List<ContactInfoBean> list;// private AddressAdapter.ListItemClickHelper listener; private Context context; public ContactsAdapter(Context context, List<ContactInfoBean> src) { this.context = context; list = src; Log.e("AYD","-------contactsAdapter" + list.size()); } /** * 当ListView数据发生变化时,调用此方法来更新ListView * * @param list */ public void updateListView(List<ContactInfoBean> list) { this.list = list; notifyDataSetChanged(); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(final int position, View convertView, final ViewGroup parent) { LinearLayout ll; if (convertView != null) { ll = (LinearLayout) convertView.getTag(); } else { ll = new LinearLayout(context); LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = li.inflate(R.layout.contacts_list_item, ll); convertView.setTag(ll); } TextView name = (TextView) convertView.findViewById(R.id.contact_name); TextView add = (TextView) convertView.findViewById(R.id.add_friend); TextView catalog = (TextView) convertView.findViewById(R.id.catalog);// add.setOnClickListener(new View.OnClickListener() {// @Override// public void onClick(View v) {// listener.onClick(v, parent, position);// }// }); ContactInfoBean c = list.get(position); // 根据position获取分类的首字母的Char ascii值 int section = getSectionForPosition(position); // 如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现 if (position == getPositionForSection(section)) { catalog.setVisibility(View.VISIBLE); catalog.setText(c.getSortLetters()); } else { catalog.setVisibility(View.GONE); } name.setText(c.getPhoneName()); Log.e("AYD",position + "th item is " + c.getPhoneNo() + ", contactID:" + c.getContactId() + ", memberID:" + c.getMemberId()); if (c.getMemberId() != null) { if (c.getContactId() == null || c.getContactId().equals("")) { add.setText("添加"); } else { add.setText("已添加"); } } else { add.setText("邀请"); } return ll; } /** * 根据ListView的当前位置获取分类的首字母的Char ascii值 */ public int getSectionForPosition(int position) { return list.get(position).getSortLetters().charAt(0); } /** * 根据分类的首字母的Char ascii值获取其第一次出现该首字母的位置 */ public int getPositionForSection(int section) { for (int i = 0; i < getCount(); i++) { String sortStr = list.get(i).getSortLetters(); char firstChar = sortStr.toUpperCase().charAt(0); if (firstChar == section) { return i; } } return -1; }}
割-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------割
以上就是如何获取手机联系人的代码,我从项目中把这个功能提出来作为demo 一会上传,,,,有兴趣的同学看看...总之代码这东西就是要经常写,看别人的代码远不如动手自己慢慢写..好了.....这就样吧....bug还等着我呢,,我去改bug了....拜拜!!
Demo在这------------------------->点我下载
阅读全文
1 0
- Android获取手机联系人及检索
- Android---获取手机联系人及归属地
- Android获取手机联系人
- Android 获取手机联系人
- Android 获取手机联系人
- Android 获取手机联系人
- android 获取手机联系人
- Android 获取手机联系人
- android 获取手机联系人
- android 获取手机联系人
- 向Android手机中插入一条短信 及联系人获取
- Android手机获取通讯录联系人信息及短信广播实现
- android获取手机通讯录联系人
- android 获取手机联系人信息
- android获取手机通讯录联系人
- android获取手机通讯录联系人
- android获取手机通讯录联系人
- android获取手机通讯录联系人
- 《Java核心技术》 Class类文件结构
- 微信H5支付接口开发步骤
- 《Java核心技术》 JVM指令集
- Iaas,paas,saas区别与联系
- 《深入解析Hello,World》 :第三章 java源代码是怎样变成class文件的
- Android获取手机联系人及检索
- final 和static
- 《深入解析Hello,World》 :第四章 class文件是怎样被读取解析执行的,JVM执行引擎
- python存储16bit和32bit图像
- Paul Graham:梦寐以求的编程语言
- Eric S. Raymond:如何成为一名黑客
- Java新手极简指北手册
- 如何利用LoadRunner最高效的批量制造Oracle数据
- Manifest merger failed with multiple errors, see logs