java - 联系方式已返回两次

标签 java android android-contentprovider android-contacts

我正在尝试获取联系人详细信息,例如姓名、电话号码、电子邮件和照片。附加到数组列表中的联系人。

但是对于同时拥有电话号码和电子邮件地址的联系人。我可以看到同一个联系人姓名两次,首先是其电子邮件地址,然后是其电话号码,并且没有显示为单个联系人(它应该是)。 有人可以帮我解决这个问题吗? TIA:)

引用:

public ArrayList<User> getPhoneContact(String paramString, ArrayList<User> paramArrayList)
    throws CustomException
  {

        //Cursor localCursor = null;
        Cursor cursor = null;
        ArrayList localArrayList = new ArrayList();
        User user;
        boolean flag;
        String s1;
        String s2;
        String s6;
        String s5;
        String s3;
        String s4;
        int i;
        int j;
        int k;
        int l;
        int i1;
        try
        {

            cursor = getNamesAndPictures(paramArrayList);

            if(cursor != null && cursor.moveToFirst()){
                user = null;

                i = cursor.getColumnIndex("data1");
                j = cursor.getColumnIndex("contact_id");
                k = cursor.getColumnIndex("display_name");
                l = cursor.getColumnIndex("data1");
                i1 = cursor.getColumnIndex("mimetype");
                s1 = null;

                do{
                    s2 = cursor.getString(j);
                    if(s2 == null)
                        return localArrayList;
                    //if(s2.equals(s1))
                        //return localArrayList;
                    user = new User();

                    s1 = s2;
                    s3 = cursor.getString(k);
                    user.setName(s3);
                    user.setContactId(s2);
                    user.setContactType(paramString);
                    s4 = cursor.getString(i1);
                    if(s4 != null){
                        if(s4.equals("vnd.android.cursor.item/phone_v2")){
                            s6 = cursor.getString(i);
                            user.setPhone(s6);
                        }

                        else if(s4.equals("vnd.android.cursor.item/email_v2")){
                                s5 = cursor.getString(l);
                                user.setEmail(s5);

                            }
                    }

                    localArrayList.add(user);
                }while(cursor.moveToNext());

            }
        }
        catch (Exception localException)
        {
          //localException
        }

    finally
    {
      //closeCursor(localCursor);
      closeCursor(cursor);
      closeDatabase();
    }

        return localArrayList;
  }

并且:

private Cursor getNamesAndPictures(ArrayList<User> paramArrayList)
  {
    String str1 = prepareContactIdsString(paramArrayList);
    ContentResolver localContentResolver = this.getAppContext().getContentResolver();
    String[] arrayOfString = { "data1", "contact_id", "display_name", "_id", "data1", "mimetype" };
    String str2 = "display_name != 'null' AND ( (mimetype = 'vnd.android.cursor.item/phone_v2'  AND is_primary != -1 )  OR (mimetype = 'vnd.android.cursor.item/email_v2'  AND is_primary != -1 ) ) AND contact_id NOT IN ( " + str1 + ")";
    return localContentResolver.query(android.provider.ContactsContract.Data.CONTENT_URI, arrayOfString, str2, null, "display_name COLLATE LOCALIZED ASC");
  }

最佳答案

这是因为您查询包含数据行的数据表,每一行都有有关联系人的某种信息,例如一行用于电子邮件,一行用于电话号码。 如果您只想获取联系人,您应该查询 ContactsContract.Contacts 表,但随后您必须查询每个联系人的电子邮件和电话。

http://developer.android.com/guide/topics/providers/contacts-provider.html

关于java - 联系方式已返回两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19723394/

相关文章:

java - 如何获取DST间隙和重叠?

android - 为什么亚马逊搜索从应用商店获取结果?

java - Java中不排序的自定义对象数组排序

java - Android CallLog Content Provider 引发 java.lang.IllegalArgumentException

android - 无法从联系人中检索电子邮件

Android:如何锁定可通过 ContentProvider(或其他执行原子条件操作的方式)访问的 SQLite 数据库

java - 使用 apache camel 和 Kafka 时如何处理背压?

java - Spring Boot 模型映射器 - StackOverflowError : null

java - 我如何使用 Retrofit 2.3.0 解析 json 对象

android - 任何第三方提供渲染的android库 MS-office (word,ppt,excel)