Android的联系方式供应商只得到了所有电子邮件手机联系人 [英] Android Contacts provider get only phone contacts with all emails

本文介绍了Android的联系方式供应商只得到了所有电子邮件手机联系人的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要让所有的手机通讯录和电子邮件地址和照片网址:

这是我做的:

 私人无效getContacts(){

        ContentResolver的CR = getContentResolver();
        光标CUR = cr.query(Contacts.CONTENT_URI,NULL,NULL,NULL,Contacts.DISPLAY_NAME);

        如果(cur.getCount()大于0){
            而(cur.moveToNext()){

                // 如果
                //(的Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))
                //> 0){

                联系方式联系我们=新联系();

                字符串ID = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));

                开放的我们的uri = getContactPhotoUri(的Long.parseLong(ID));
                //设置photoUri
                contact.setContactPhotoUri(URI);

                //设置名称
                contact.setContactName(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));

                //获取电话号码
                光标pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,空,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +=,新的String [] {ID},NULL);
                而(pCur.moveToNext()){

                    //设置手机munber
                    contact.setContactNumber(pCur.getString(pCur
                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
                    contacts.add(接触);

                }
                pCur.close();

                //获取电子邮件和类型
                光标emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,空,
                        ContactsContract.CommonDataKinds.Email.CONTACT_ID +=,新的String [] {ID},NULL);
                而(emailCur.moveToNext()){
                    //这将让你获得多个电子邮件地址
                    //如果电子邮件地址被存储在一个阵列

                    //设置电子邮件
                    contact.setContactEmail(emailCur.getString(emailCur
                            .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)));

                    contacts.add(接触);

                }
                emailCur.close();

            }
        }

        cur.close();
        contactAdapter =新ContactAdapter(这一点,R.id.contactList,联系方式);

        //}

    }

    公众开放的getContactPhotoUri(长的ContactID){
        乌里photoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI,使用ContactID);
        photoUri = Uri.withAppendedPath(photoUri,Contacts.Photo.CONTENT_DIRECTORY);
        返回photoUri;
    }
 

我的问题我得到的所有联系人,包括Gmail联系人,我不想被包括Gmail联系人。和花费的时间也很慢。如何优化这个,我知道它的拍摄时间怎么我现在用的很多光标..但不知道如何做一个cusror,可以给我名字的电子邮件数量的照片URI ...谢谢!

最后订正:

 私人无效getContacts(){

    ContentResolver的CR = getContentResolver();

    光标CUR = cr.query(Data.CONTENT_URI,新的String [] {Data.CONTACT_ID,Data.MIMETYPE,Email.ADDRESS,
            Contacts.DISPLAY_NAME,Phone.NUMBER},NULL,NULL,Contacts.DISPLAY_NAME);

    联系接触;

    如果(cur.getCount()大于0){

        而(cur.moveToNext()){

            字符串ID = cur.getString(cur.getColumnIndex(Data.CONTACT_ID));

            字符串MIMETYPE = cur.getString(cur.getColumnIndex(Data.MIMETYPE));

            如果(allContacts.containsKey(ID)){
                //更新名片
                接触= allContacts.get(ID);
            } 其他 {
                触点=新联系();
                allContacts.put(ID,联系方式);
                //设置photoUri
                contact.setContactPhotoUri(getContactPhotoUri(的Long.parseLong(ID)));
            }

            如果(mimeType.equals(StructuredName.CONTENT_ITEM_TYPE))
                //设置名称
                contact.setContactName(cur.getString(cur.getColumnIndex(Contacts.DISPLAY_NAME)));

            如果(mimeType.equals(Phone.CONTENT_ITEM_TYPE))
                //设置手机munber
                contact.setContactNumber(cur.getString(cur.getColumnIndex(Phone.NUMBER)));

            如果(mimeType.equals(Email.CONTENT_ITEM_TYPE))
                //设置电子邮件
                contact.setContactEmail(cur.getString(cur.getColumnIndex(Email.ADDRESS)));

        }
    }

    cur.close();
    //从HashMap中的联系人
    contacts.clear();
    contacts.addAll(allContacts.values​​());

    //删除零接触
    对于(联系_contact:触点){

        如果(_contact.getContactName()== NULL和放大器;&安培; _contact.getContactNumber()== NULL
                &功放;&安培; _contact.getContactEmail()== NULL){
            contacts.remove(_contact);
            打破;
        }

    }

    contactAdapter =新ContactAdapter(这一点,R.id.contactList,联系方式);
    contactAdapter.notifyDataSetChanged();

}

公众开放的getContactPhotoUri(长的ContactID){
    乌里photoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI,使用ContactID);
    photoUri = Uri.withAppendedPath(photoUri,Contacts.Photo.CONTENT_DIRECTORY);
    返回photoUri;
}
 

解决方案

您应该能够得到所有需要在一个查询Data.CONTENT_URI的信息, 查阅android.provider.ContactsContract.Data表,并就如何查询不同类型的数据通过电子邮件,电话,照片等的例子... <一href="http://developer.android.com/reference/android/provider/ContactsContract.Data.html">http://developer.android.com/reference/android/provider/ContactsContract.Data.html

例如:

 光标数据= cntx.getContentResolver()查询(Data.CONTENT_URI,新的String [] {Data._ID,Data.MIMETYPE,Email.ADDRESS,Photo.PHOTO},数据.CONTACT_ID +=?+和+(+ Data.MIMETYPE +='+ Photo.CONTENT_ITEM_TYPE +'或+ Data.MIMETYPE +='+ Email.CONTENT_ITEM_TYPE +') ,
                        新的String [] {将String.valueOf(的ContactID)},NULL);
 

如果把你所有你需要关于一个特定的ContactID的信息,理论上可以要求所有联系人和自己整理的信息。

至于过滤Gmail联系人这是一个比较复杂的问题,看看ACCOUNT_NAME / TYPE <一href="http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html">http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html 参数,关于这个问题在这里讨论: <一href="http://stackoverflow.com/questions/4863653/what-is-the-default-account-type-name-for-contacts-on-android-contact-applicat">What是默认的帐户类型/名称在Android接触的应用联系人?

I need to get all phone contacts and their email address and photo uri:

This is what am doing:

private void getContacts() {

        ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(Contacts.CONTENT_URI, null, null, null, Contacts.DISPLAY_NAME);

        if (cur.getCount() > 0) {
            while (cur.moveToNext()) {

                // if
                // (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))
                // > 0) {

                Contact contact = new Contact();

                String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));

                Uri uri = getContactPhotoUri(Long.parseLong(id));
                // set photoUri
                contact.setContactPhotoUri(uri);

                // set name
                contact.setContactName(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));

                // get the phone number
                Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null);
                while (pCur.moveToNext()) {

                    // set phone munber
                    contact.setContactNumber(pCur.getString(pCur
                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
                    contacts.add(contact);

                }
                pCur.close();

                // get email and type
                Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
                        ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[] { id }, null);
                while (emailCur.moveToNext()) {
                    // This would allow you get several email addresses
                    // if the email addresses were stored in an array

                    // set email
                    contact.setContactEmail(emailCur.getString(emailCur
                            .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)));

                    contacts.add(contact);

                }
                emailCur.close();

            }
        }

        cur.close();
        contactAdapter = new ContactAdapter(this, R.id.contactList, contacts);

        // }

    }

    public Uri getContactPhotoUri(long contactId) {
        Uri photoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
        photoUri = Uri.withAppendedPath(photoUri, Contacts.Photo.CONTENT_DIRECTORY);
        return photoUri;
    }

My problem am getting all contacts including gmail contacts, i dont want gmail contacts to be included. And the time taken is also very slow. How do i optimize this, I know its taking time coz i am using many cursors.. but dont know how to make a single cusror that can give me name email number photo uri ...Thanks!

UPDATED FINAL:

private void getContacts() {

    ContentResolver cr = getContentResolver();

    Cursor cur = cr.query(Data.CONTENT_URI, new String[] { Data.CONTACT_ID, Data.MIMETYPE, Email.ADDRESS,
            Contacts.DISPLAY_NAME, Phone.NUMBER }, null, null, Contacts.DISPLAY_NAME);

    Contact contact;

    if (cur.getCount() > 0) {

        while (cur.moveToNext()) {

            String id = cur.getString(cur.getColumnIndex(Data.CONTACT_ID));

            String mimeType = cur.getString(cur.getColumnIndex(Data.MIMETYPE));

            if (allContacts.containsKey(id)) {
                // update contact
                contact = allContacts.get(id);
            } else {
                contact = new Contact();
                allContacts.put(id, contact);
                // set photoUri
                contact.setContactPhotoUri(getContactPhotoUri(Long.parseLong(id)));
            }

            if (mimeType.equals(StructuredName.CONTENT_ITEM_TYPE))
                // set name
                contact.setContactName(cur.getString(cur.getColumnIndex(Contacts.DISPLAY_NAME)));

            if (mimeType.equals(Phone.CONTENT_ITEM_TYPE))
                // set phone munber
                contact.setContactNumber(cur.getString(cur.getColumnIndex(Phone.NUMBER)));

            if (mimeType.equals(Email.CONTENT_ITEM_TYPE))
                // set email
                contact.setContactEmail(cur.getString(cur.getColumnIndex(Email.ADDRESS)));

        }
    }

    cur.close();
    // get contacts from hashmap
    contacts.clear();
    contacts.addAll(allContacts.values());

    // remove null contacts
    for (Contact _contact : contacts) {

        if (_contact.getContactName() == null && _contact.getContactNumber() == null
                && _contact.getContactEmail() == null) {
            contacts.remove(_contact);
            break;
        }

    }

    contactAdapter = new ContactAdapter(this, R.id.contactList, contacts);
    contactAdapter.notifyDataSetChanged();

}

public Uri getContactPhotoUri(long contactId) {
    Uri photoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
    photoUri = Uri.withAppendedPath(photoUri, Contacts.Photo.CONTENT_DIRECTORY);
    return photoUri;
}

解决方案

You should be able to get all the information needed in one query on Data.CONTENT_URI, Check out "android.provider.ContactsContract.Data" table and the examples on how to query different types of data Email,Phone,Photo etc... http://developer.android.com/reference/android/provider/ContactsContract.Data.html

For example:

Cursor data = cntx.getContentResolver().query(Data.CONTENT_URI, new String[] {Data._ID,Data.MIMETYPE,Email.ADDRESS,Photo.PHOTO},Data.CONTACT_ID + "=?" + " AND " + "(" +  Data.MIMETYPE + "='" + Photo.CONTENT_ITEM_TYPE + "' OR " + Data.MIMETYPE + "='" + Email.CONTENT_ITEM_TYPE +"')",
                        new String[] {String.valueOf(contactId)}, null);

Should bring you all the information you need regarding one specific contactId, you could theoretically ask for all contacts and sort the information yourself.

As for filtering gmail contacts this is a more complex issue, take a look at ACCOUNT_NAME / TYPE http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html parameter and a discussion regarding this issue here: What is the default Account Type / Name for contacts on Android Contact Application?

这篇关于Android的联系方式供应商只得到了所有电子邮件手机联系人的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆