尝试查询联系人以获取详细信息。

时间:2013-12-02 06:36:08

标签: android android-contacts

我正在尝试查询联系人数据库中的联系人信息,我设计的程序只提取了与出生日详细信息的联系人:

projection = new String[] {
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.NUMBER,
                ContactsContract.CommonDataKinds.Event.CONTACT_ID,
                ContactsContract.CommonDataKinds.Event.START_DATE,
                ContactsContract.CommonDataKinds.Email.DATA,

        };

        where = ContactsContract.Data.MIMETYPE + "= ? AND " +
                ContactsContract.CommonDataKinds.Event.TYPE + "=" + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY;


        selectionArgs = new String[] { ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE };

电话:

getLoaderManager().initLoader(0, null, this);

最后我尝试获取结果:

public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {

    CursorLoader loader = new CursorLoader(this, uri, projection, where,
            selectionArgs, null);
    return loader;
}

@SuppressWarnings("unchecked")
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    Map<Date,String> BD = new HashMap<Date,String>(); 

    while (cursor.moveToNext()) {
        String id = cursor.getString(cursor
                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        Toast.makeText(getApplicationContext(), ""+id, 10000).show(); 

        String displayBirthday = cursor
                .getString(cursor
                        .getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE));

        String name = cursor.getString(cursor
                .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));


        String DateStr=displayBirthday;
        Date d = null;
        try {
            d = new SimpleDateFormat("yyyy-MM-dd", current).parse(DateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        } 
        java.sql.Date d1 = new java.sql.Date(d.getTime());
        BD.put(d1, name); 
    }
    TreeMap Sorted = new TreeMap<Date,String>(BD); 
    //new MagicCall().execute(Sorted); 
}

然而,我没有得到电话号码,它给了我在吐司消息而不是电话号码中的出生日字段结果,如果我将其更改为电子邮件,它仍然给我生日详细信息。请忽略抑制警告,因为这是一个测试项目,我在其中隔离了问题代码。

1 个答案:

答案 0 :(得分:0)

试试这个家伙:)祝你好运

 <uses-permission android:name="android.permission.READ_CONTACTS" />

这是类

的代码
public class ReadContacts extends AsyncTask<Void, Void, Void>{
    private ListView contactsList;

    private Context cntx;
    private Constant constants;

    static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {
        Contacts._ID, // 0
        Contacts.DISPLAY_NAME, // 1
        Contacts.STARRED, // 2
        Contacts.TIMES_CONTACTED, // 3
        Contacts.CONTACT_PRESENCE, // 4
        Contacts.PHOTO_ID, // 5
        Contacts.LOOKUP_KEY, // 6
        Contacts.HAS_PHONE_NUMBER, // 7
    };

    private long contactId;
    private String display_name;
    private String phoneNumber;

    private ArrayList<ContactsWrapper>contactWrap = new ArrayList<ContactsWrapper>();
    private HashMap<Long, ArrayList<ContactsWrapper>>map = new HashMap<Long, ArrayList<ContactsWrapper>>();

    private ContactsAdapter adapter;

    private DataController controller;

    public ReadContacts(Context cntx, ListView contactList) {
        // TODO Auto-generated constructor stub
        this.cntx = cntx;
        constants = new Constant();
        this.contactsList = contactList;

        controller = DataController.getInstance(); 
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        if(!(controller.contactWrapper.size()>0))
             constants.displayProgressDialog(cntx, "Loading Contacts...", "Please Wait");
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub

        if(!(controller.contactWrapper.size()>0))
        {
        try {
            String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("
                    + Contacts.HAS_PHONE_NUMBER + "=1) AND ("
                    + Contacts.DISPLAY_NAME + " != '' ))";

            Cursor c = cntx.getContentResolver().query(Contacts.CONTENT_URI, CONTACTS_SUMMARY_PROJECTION, select,
                    null, Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");

            int colorcounter = 0;
            String[] colorcounter_array = { "#91A46B", "#8BB6B5", "#CAA973", "#8DA6C8","#D19B8D"};

            int color_string;
            for(int i=0;i<c.getCount();i++)
            {
//              contactWrap.clear();
                try {
                    contactId = 0;
                    String hasPhone = "";
                    display_name = "";
                    phoneNumber = "";

                    c.moveToPosition(i);

                    contactId =  c.getLong(0);
                    display_name = c.getString(1);
                    hasPhone = c.getString(7);

                    if (hasPhone.equalsIgnoreCase("1"))
                        hasPhone = "true";
                    else
                        hasPhone = "false" ;

                    if (Boolean.parseBoolean(hasPhone)) 
                    {
                        Cursor phones = cntx.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null);
                        while (phones.moveToNext()) 
                        {
                            int indexPhoneType = phones.getColumnIndexOrThrow(Phone.TYPE);
                            String phoneType =  phones.getString(indexPhoneType);

                            phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

                            String lookupKey = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));

                            if (colorcounter < 5) 
                            {
                                color_string =Color.parseColor(colorcounter_array[colorcounter]);
                                colorcounter++;
                            } else {
                                colorcounter = 0;
                                color_string =Color.parseColor(colorcounter_array[colorcounter]);
                                colorcounter++;
                            }
                            contactWrap.add(new ContactsWrapper(contactId, display_name, phoneNumber,lookupKey,false,color_string));
                        }
//                      map.put(contactId, new ArrayList<ContactsWrapper>(contactWrap));
                        phones.close();
                    }
                } catch (Exception e) {

                    e.printStackTrace();
                }  
            }
            controller.contactWrapper = contactWrap;
        }
        catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        constants.dismissDialog();

        adapter = new ContactsAdapter(cntx);
        contactsList.setAdapter(adapter);
    }

}

这是我的联系包装类

public class ContactsWrapper {

private long contactId;
private String displayName,displayNumber,lookUp;
public boolean checked = true;
int color_string;

public ContactsWrapper(long contactId, String displayName, String displayNumber, String lookUp, boolean checked,int color_string) {
    // TODO Auto-generated constructor stub
    this.contactId = contactId;
    this.displayName = displayName;
    this.displayNumber = displayNumber;
    this.lookUp = lookUp;
    this.checked = checked;
    this.color_string =color_string;
}

public String getLookUp() {
    return lookUp;
}

public int getColor_string() {
    return color_string;
}

public boolean isChecked() {
    return checked;
}

public long getContactId() {
    return contactId;
}

public String getDisplayName() {
    return displayName;
}

public String getDisplayNumber() {
    return displayNumber;
}

public void setChecked(boolean checked) {
    this.checked = checked;
}
}

别恐慌花花公子只是匹配列表与thar birthdate并采取一个临时arraylist和任何名称匹配然后添加在那个临时arraylist然后根据那个临时arraylist显示该列表视图:)在这里我给你的代码和提示我认为它会帮助你达到你想要的......:)

ArrayList<String> matchname = new ArrayList<String>();

                    for(int l =0;l<contactarraylist.size();l++)
                    {
                        String keyname = contactarraylist[k];

                        if((keyname.trim().equals("birthdate_string")))
                        {
                            matchname.add(keyname);

                        }
                    }
}