当前位置: 首页 > 面试题库 >

通过电话簿在我的App中多次显示一些联系人

卜盛
2023-03-14
问题内容

我在我的应用中遇到了三到两次相同的联系人,这种情况发生在某些联系人而不是每个联系人上。在我的应用程序中,一切都按预期工作,但是单击我的“显示联系人”时,显示三个时间相同的联系人,但在手机联系人中仅存储一次。我从我这边尝试了一切,但是无法解决这个问题,请问有什么机构可以帮助我。还是有其他替代方法可以做到这一点。

这是我的代码:

    @Override
protected Integer doInBackground(Void... params) {


    try {


        db = new WhooshhDB(myContext);
        this.list = new ArrayList<>();

        ContentResolver cr = myContext.getContentResolver();

        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
                null, null, null, "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME + ") ASC");
        if ((cur != null ? cur.getCount() : 0) > 0) {

            while (cur != null && cur.moveToNext()) {

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

                if (cur.getInt(cur.getColumnIndex(
                        ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {
                    Cursor pCur = cr.query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            null,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                            new String[]{id}, null);
                    while (pCur.moveToNext()) {
                        String phoneNo = pCur.getString(pCur.getColumnIndex(
                                ContactsContract.CommonDataKinds.Phone.NUMBER));

                        ContactModel model = new ContactModel();

                        if (phoneNo.replaceAll("\\s", "").trim().length() > 7) {
                            model.name = name;
                            model.mobileNumber = phoneNo.replaceAll("\\s", "");
                            if (model.mobileNumber.contains("-")) {
                                model.mobileNumber = model.mobileNumber.replaceAll("-", "");
                            }
                            model.iconHexColor = AppConstant.getRandomSubscriptionHexColor(myContext);
                            if (!phoneNumber.equals(model.mobileNumber)) {
                                list.add(model);
                            }

                        }

                        Log.i("FetchContacts", "Name: " + name);
                        Log.i("FetchContacts", "Phone Number: " + phoneNo);
                    }
                    pCur.close();
                }
            }
        }
        if (cur != null) {
            cur.close();
        }

        return AppConstant.SUCCESS;
    } catch (Exception ex) {
        return null;
    }
}

问题答案:

您正在为每个电话的每个联系人打印那些“
FetchContacts”日志,因此,如果一个联系人为她存储了多个电话,您将看到它多次打印(即使它是相同的电话号码)。

如果您安装了类似Whatsapp的应用程序,那么几乎总是会看到每个联系人的所有电话号码重复,从而导致这些日志的打印次数超过每个联系人一次。

而且,这是通过电话获得联系的缓慢而痛苦的方式。取而代之的是,您可以直接通过Phones.CONTENT_URI直接查询并获取数据库中的所有电话,然后通过Contact-
ID将它们映射到联系人中:

Map<String, List<String>> contacts = new HashMap<String, List<String>>();

String[] projection = { Phone.CONTACT_ID, Phone.DISPLAY_NAME, Phone.NUMBER };
Cursor cur = cr.query(Phone.CONTENT_URI, projection, null, null, null);

while (cur != null && cur.moveToNext()) {
    long id = cur.getLong(0); // contact ID
    String name = cur.getString(1); // contact name
    String data = cur.getString(2); // the actual info, e.g. +1-212-555-1234

    Log.d(TAG, "got " + id + ", " + name + ", " + data);

    // add info to existing list if this contact-id was already found, or create a new list in case it's new
    String key = id + " - " + name;
    List<String> infos;
    if (contacts.containsKey(key)) {
        infos = contacts.get(key);
    } else {
        infos = new ArrayList<String>();
        contacts.put(key, infos);
    }
    infos.add(data);
}

// contacts will now contain a mapping from id+name to a list of phones.
// you can enforce uniqueness of phones while adding them to the list as well.


 类似资料:
  • 我想从Android的联系簿中获得电话号码。我尝试了许多方法,但我无法获得电话号码。我有联系人姓名和状态,但当我尝试获取电话号码时,它不起作用。我的代码是。

  • 我是新的应用程序开发人员,所以我写了一个代码,希望从通讯录中读取联系人列表,并成功点击该联系人。现在的问题是,当单击“我的联系人”列表视图中显示的联系人时,我想在不同的页面上显示联系人的姓名和电话号码。我想在add_friend类中显示姓名和电话号码。 这是联系人。JAVA } 这是contactADAPTER } 这是回收者的观点 我想在这里显示所选联系人的姓名和号码 公共类Add_Friend

  • public void OnBindViewWholder(@nonnull MyViewWholder持有者,int位置){

  • 问题内容: 我正在尝试制作一个程序,一次显示3个框。我以为,如果您为设置一个类,它将每秒显示一个新框。 所以这是我想出的代码: } 它有效,但不是我想要的方式。在上一个按ok之后,它每秒显示一个新框,而不是每秒显示一个新框。 因此,当我按下“按下”键时,它会等待1秒钟并产生一个盒子。当我按“确定”时,它会等待1秒钟并生成另一个,依此类推。知道如何使3个盒子接连产生1个吗? 问题答案: 使用JOpt

  • 背景: 我为android写了一个简单的小拨号器,可以拨打联系人的电话号码 问题: 我想打电话给联系人,而不是电话号码,这样Android: 如果联系人有两个号码:将启动电话号码选择对话框,然后启动通话 当然,我可以从头开始实现一个弹出窗口,但我更愿意委托给一个标准操作,这样用户就可以使用与使用标准拨号器相同的用户体验。

  • 每次尝试提交此联系人表单时,都会收到以下错误消息: “请输入您的消息。” 名称错误消息和电子邮件错误消息不会出现,除非我将它们留空。我尝试在HTML中指定post。 以下是HTML: 下面是PHP: