代码之家  ›  专栏  ›  技术社区  ›  Florian Schmidt

添加新联系人(36项)

  •  1
  • Florian Schmidt  · 技术社区  · 8 年前

    我试图在手机上添加新联系人,但他只做了前12项。 我想尝试所有当前的36个项目,也许更多添加到电话联系人中。

                while ((line = bufferedReader.readLine()) != null) {
                    System.out.println("[[DEBUG]] [DW-UPDATE] LINE: " + line);
                    String[] split = line.split(";", -1);
    
                    split[2] = split[2].replace("/", "").replace("-", "");
    
                    if (!contactExists(mActivity, split[2])) {
                        ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
                            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
                            .withValue(ContactsContract.RawContacts.AGGREGATION_MODE, ContactsContract.RawContacts.AGGREGATION_MODE_DISABLED)
                        .build());
                        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, Integer.valueOf(split[0]))
                            .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                            .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, split[1])
                        .build());
                        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, Integer.valueOf(split[0]))
                            .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, split[2])
                            .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
                        .build());
    
                        try {
                            mActivity.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
    

    功能联系人存在:

    public boolean contactExists(Activity _activity, String number) {
        Uri lookupUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
        String[] mPhoneNumberProjection = { ContactsContract.PhoneLookup._ID, ContactsContract.PhoneLookup.NUMBER, ContactsContract.PhoneLookup.DISPLAY_NAME };
        Cursor cur = _activity.getContentResolver().query(lookupUri, mPhoneNumberProjection, null, null, null);
        try {
            if (cur.moveToFirst()) {
                return true;
            }
        } finally {
            if (cur != null)
                cur.close();
        }
        return false;
    }// contactExists
    

    我必须做什么,才能更好地工作?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Michael Dodd    8 年前

    您的问题在于添加其他联系人数据时的反向引用。后面的参考应该指的是你的位置 RawContacts.CONTENT_URI 在操作列表中插入( ops ),而不是联系人在原始数据文件中的位置。您可以通过跟踪 运营部 通过每次迭代:

    if (!contactExists(mActivity, split[2])) {
        int backRef = ops.size();
    
        ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
            .withValue(...)
            .build());
    
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, backRef)
            .withValue(...)
            .build()
    
        .build());
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, backRef)
            .withValue(...)
        .build());
    
        try {
            mActivity.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }