Android-contentprovider 获取手机联系人

                                 Android-contentprovider 获取手机联系人

一,布局文件(3个)

1,activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.android_contentprovider04.MainActivity">

    <Button
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:text="获取联系人"
               android:onClick="getContacts"
        />
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lv_main"
        ></ListView>

</LinearLayout>
2,activity_test.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/contact_list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="获取联系人"
        android:onClick="getAllContacts"
        ></Button>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳转到联系人"
        android:onClick="jumpContacts"
        ></Button>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/tv_test_contacts"
        />
    <android.support.v4.widget.SlidingPaneLayout
        android:id="@+id/slidingview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true" >
        <ListView
            android:id="@+id/contact_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:cacheColorHint="#000000"
            android:divider="#00000000"
            android:fadingEdge="none"
            android:scrollbars="none"
            android:scrollingCache="false"
            android:visibility="visible" />
    </android.support.v4.widget.SlidingPaneLayout>
    <TextView
        android:id="@+id/fast_position"
        android:layout_width="70dip"
        android:layout_height="70dip"
        android:layout_centerInParent="true"
        android:layout_gravity="center_horizontal|top"
        android:layout_margin="34dip"
        android:gravity="center"
        android:padding="2dip"
        android:textColor="#404040"
        android:textSize="48dip"
        android:visibility="invisible" />
</LinearLayout>

3,contact_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/contact_list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="获取联系人"
        android:onClick="getAllContacts"
        ></Button>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳转到联系人"
        android:onClick="jumpContacts"
        ></Button>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/tv_test_contacts"
        />
    <android.support.v4.widget.SlidingPaneLayout
        android:id="@+id/slidingview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true" >
        <ListView
            android:id="@+id/contact_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:cacheColorHint="#000000"
            android:divider="#00000000"
            android:fadingEdge="none"
            android:scrollbars="none"
            android:scrollingCache="false"
            android:visibility="visible" />
    </android.support.v4.widget.SlidingPaneLayout>
    <TextView
        android:id="@+id/fast_position"
        android:layout_width="70dip"
        android:layout_height="70dip"
        android:layout_centerInParent="true"
        android:layout_gravity="center_horizontal|top"
        android:layout_margin="34dip"
        android:gravity="center"
        android:padding="2dip"
        android:textColor="#404040"
        android:textSize="48dip"
        android:visibility="invisible" />
</LinearLayout>
二,建实体类,
public class ContactBean {
   private int contactId;
   private String desplayName;
   private String phoneNum;
   private String sortKey;
   private Long photoId;
   private String lookUpKey;
   private int selected = 0;
   private String formattedNumber;
   private String pinyin;
   public int getContactId() {
      return contactId;
   }
   public void setContactId(int contactId) {
      this.contactId = contactId;
   }
   public String getDesplayName() {
      return desplayName;
   }
   public void setDesplayName(String desplayName) {
      this.desplayName = desplayName;
   }
   public String getPhoneNum() {
      return phoneNum;
   }
   public void setPhoneNum(String phoneNum) {
      this.phoneNum = phoneNum;
   }
   public String getSortKey() {
      return sortKey;
   }
   public void setSortKey(String sortKey) {
      this.sortKey = sortKey;
   }
   public Long getPhotoId() {
      return photoId;
   }
   public void setPhotoId(Long photoId) {
      this.photoId = photoId;
   }
   public String getLookUpKey() {
      return lookUpKey;
   }
   public void setLookUpKey(String lookUpKey) {
      this.lookUpKey = lookUpKey;
   }
   public int getSelected() {
      return selected;
   }
   public void setSelected(int selected) {
      this.selected = selected;
   }
   public String getFormattedNumber() {
      return formattedNumber;
   }
   public void setFormattedNumber(String formattedNumber) {
      this.formattedNumber = formattedNumber;
   }
   public String getPinyin() {
      return pinyin;
   }
   public void setPinyin(String pinyin) {
      this.pinyin = pinyin;
   }
}

三,写具體代码
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test extends AppCompatActivity {
    private ContactListAdapter adapter;
    private ListView contactList;
    private List<ContactBean> list;
    private AsyncQueryHandler asyncQueryHandler; // 异步查询数据库类对象
//    private QuickAlphabeticBar alphabeticBar; // 快速索引条
    private List<ContactBean> li;
    private Map<Integer, ContactBean> contactIdMap = null;
    private EditText edit_querys;
    private TextView tv_test_contacts;
    private String s;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        contactList = (ListView) findViewById(R.id.contact_list);
        tv_test_contacts = (TextView) findViewById(R.id.tv_test_contacts);
      // 实例化
        asyncQueryHandler = new MyAsyncQueryHandler(getContentResolver());
        init();
    }
    public void getAllContacts(View view){
        setAdapter(list);
    }
    /**
     * 初始化数据库查询参数
     */
    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(0, null, uri, projection, null, null,
                "sort_key COLLATE LOCALIZED asc");
    }
    /**
     *
     * @author Administrator
     *
     */
    private class MyAsyncQueryHandler extends AsyncQueryHandler {
        public MyAsyncQueryHandler(ContentResolver cr) {
            super(cr);
        }
        @Override
        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
            if (cursor != null && cursor.getCount() > 0) {
                contactIdMap = new HashMap<Integer, ContactBean>();
                list = new ArrayList<ContactBean>();
                cursor.moveToFirst(); // 游标移动到第一项
                for (int i = 0; i < cursor.getCount(); i++) {
                    cursor.moveToPosition(i);
                    String name = cursor.getString(1);
                    String number = cursor.getString(2);
                    String sortKey = cursor.getString(3);
                    int contactId = cursor.getInt(4);
                    Long photoId = cursor.getLong(5);
                    String lookUpKey = cursor.getString(6);
                    if (contactIdMap.containsKey(contactId)) {
                        // 无操作
                    } else {
                        // 创建联系人对象
                        ContactBean contact = new ContactBean();
                        contact.setDesplayName(name);
                        contact.setPhoneNum(number);
                        contact.setPhotoId(photoId);
                        contact.setSortKey(sortKey);
                        Log.i("ccc",photoId+"");
                        contact.setLookUpKey(lookUpKey);
                        list.add(contact);
                        contactIdMap.put(contactId, contact);
                    }
            }
                }
            super.onQueryComplete(token, cookie, cursor);
        }
    }

    private void setAdapter(final List<ContactBean> list) {
        adapter = new ContactListAdapter(this, list);
        contactList.setAdapter(adapter);
    }
    public void jumpContacts(View view){
        Uri uri=Uri.parse("content://contacts/people");
        Intent intent=new Intent(Intent.ACTION_PICK,uri);
        startActivityForResult(intent,0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode){
            case 0:
                if(data==null)
                {
                    return;
                }
                //处理返回的data,获取选择的联系人信息
                Uri uri=data.getData();
                String[] contacts=getPhoneContacts(uri);
                s = contacts[0]+":"+contacts[1];
                tv_test_contacts.setText(s);
                break;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
  private String[] getPhoneContacts(Uri uri){
        String[] contact=new String[2];
        //得到ContentResolver对象
        ContentResolver cr = getContentResolver();
        //取得电话本中开始一项的光标
        Cursor cursor=cr.query(uri,null,null,null,null);
        if(cursor!=null)
        {
            cursor.moveToFirst();
            //取得联系人姓名
            int nameFieldColumnIndex=cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
            contact[0]=cursor.getString(nameFieldColumnIndex);
            //取得电话号码
            String ContactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + ContactId, null, null);
            if(phone != null){
                phone.moveToFirst();
                contact[1] = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            }
            phone.close();
            cursor.close();
        }
        else
        {
            return null;
        }
        return contact;
    }
}
三.1適配器ContactListAdapter 

import java.io.InputStream;
import 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.util.Log;
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 android.widget.Toast;


public class ContactListAdapter extends BaseAdapter {
   private LayoutInflater inflater;
   private List<ContactBean> list;
   private HashMap<String, Integer> alphaIndexer; // 字母索引
   private String[] sections; // 存储每个章节
   private Context ctx; // 上下文

   public ContactListAdapter(Context context, List<ContactBean> list) {
      this.ctx = context;
      this.inflater = LayoutInflater.from(context);
      this.list = list;
      this.alphaIndexer = new HashMap<String, Integer>();
      this.sections = new String[list.size()];
      for (int i = 0; i < list.size(); i++) {
         // 得到字母
         String name = getAlpha(list.get(i).getSortKey());
         if (!alphaIndexer.containsKey(name)) {
            alphaIndexer.put(name, i);
         }
      Set<String> sectionLetters = alphaIndexer.keySet();
      }
      ArrayList<String> sectionList = new ArrayList<String>(sectionLetters);
      Collections.sort(sectionList);
      sections = new String[sectionList.size()];
      sectionList.toArray(sections);
   }

   @Override
   public int getCount() {
      return list.size();
   }
   @Override
   public Object getItem(int position) {

      return list.get(position);
   }
   @Override
   public long getItemId(int position) {
      return position;
   }
   public void remove(int position) {
      list.remove(position);
   }
   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
      ViewHolder holder;
      if (convertView == null) {
         convertView = inflater.inflate(R.layout.contact_list_item, null);
         holder = new ViewHolder();
         holder.quickContactBadge = (QuickContactBadge) convertView
               .findViewById(R.id.qcb);
         holder.alpha = (TextView) convertView.findViewById(R.id.alpha);
         holder.name = (TextView) convertView.findViewById(R.id.name);
         holder.number = (TextView) convertView.findViewById(R.id.number);
         convertView.setTag(holder);
      } else {
         holder = (ViewHolder) convertView.getTag();
      }
      ContactBean contact = list.get(position);
      String name = contact.getDesplayName();
      String number = contact.getPhoneNum();
      holder.name.setText(name);
      holder.number.setText(number);
      holder.quickContactBadge.assignContactUri(Contacts.getLookupUri(contact.getContactId(), contact.getLookUpKey()));
      if (0 == contact.getPhotoId()) {
//       holder.quickContactBadge.setImageResource(R.drawable.touxiang);
      } else {
         Uri uri = ContentUris.withAppendedId(
               Contacts.CONTENT_URI,
               contact.getContactId());
         InputStream input = Contacts
               .openContactPhotoInputStream(ctx.getContentResolver(), uri);
         Bitmap contactPhoto = BitmapFactory.decodeStream(input);
         holder.quickContactBadge.setImageBitmap(contactPhoto);
      }
      // 当前字母
      String currentStr = getAlpha(contact.getSortKey());
      // 前面的字母
      String previewStr = (position - 1) >= 0 ? getAlpha(list.get(
            position - 1).getSortKey()) : " ";
      if (!previewStr.equals(currentStr)) {
         holder.alpha.setVisibility(View.VISIBLE);
         holder.alpha.setText(currentStr);
      } else {
         holder.alpha.setVisibility(View.GONE);
      }
      return convertView;
   }

   private static class ViewHolder {
      QuickContactBadge quickContactBadge;
      TextView alpha;
      TextView name;
      TextView number;
   }
   /**
    * 获取首字母
    *
    * @param str
    * @return
    */
   private String getAlpha(String str) {
      if (str == null) {
         return "#";
      }
      if (str.trim().length() == 0) {
         return "#";
      }
      char c = str.trim().substring(0, 1).charAt(0);
      // 正则表达式匹配
      Pattern pattern = Pattern.compile("^[A-Za-z]+$");
      if (pattern.matcher(c + "").matches()) {
         return (c + "").toUpperCase(); // 将小写字母转换为大写
      } else {
         return "#";
      }
   }
}


 
 
 
 
 
 
 
 
 
 
 
 
 
 

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值