I am trying to add multiple contacts from my application. I read data from an xml file and then transfer it to a list of strongly typed objects. These objects, and then looped, and I cause the insertion into the contacts of users for each of them.
However, I get some very strange results by checking where I get 1 or two working contacts, and then a few empty (unknown) entries. The number of successful entries over (Unknown) seems random, but I don’t understand why I can’t do something that should be pretty simple.
My click event that triggers a command to retrieve data and then add it to the contacts below. I can confirm that the data is read into the contact list every time, so this is not a data problem.
public void onClick(View v) { List<AddressContent> contacts = GetAddresses(); int counter = 0; if (!contacts.isEmpty()) { ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); for (int i = 0; i < contacts.size(); i++) { 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()); // ------------------------------------------------------ Name ops.add(ContentProviderOperation .newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference( ContactsContract.Data.RAW_CONTACT_ID, i) .withValue( ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) .withValue( ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contacts.get(i).getName()).build()); // ------------------------------------------------------ Work // Number ops.add(ContentProviderOperation .newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference( ContactsContract.Data.RAW_CONTACT_ID, i) .withValue( ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) .withValue( ContactsContract.CommonDataKinds.Phone.NUMBER, contacts.get(i).getPhone()) .withValue( ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK) .build()); // ------------------------------------------------------ Fax // Number ops.add(ContentProviderOperation .newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference( ContactsContract.Data.RAW_CONTACT_ID, i) .withValue( ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) .withValue( ContactsContract.CommonDataKinds.Phone.NUMBER, contacts.get(i).getFax()) .withValue( ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK) .build()); // ------------------------------------------------------ Email ops.add(ContentProviderOperation .newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference( ContactsContract.Data.RAW_CONTACT_ID, i) .withValue( ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) .withValue(ContactsContract.CommonDataKinds.Email.DATA, contacts.get(i).getEmail()) .withValue( ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK) .build()); // ------------------------------------------------------ // Organisation ops.add(ContentProviderOperation .newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference( ContactsContract.Data.RAW_CONTACT_ID, i) .withValue( ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) .withValue( ContactsContract.CommonDataKinds.Organization.COMPANY, contacts.get(i).getCompany()) .withValue( ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK) .build()); // ------------------------------------------------------ // Address ops.add(ContentProviderOperation .newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference( ContactsContract.Data.RAW_CONTACT_ID, i) .withValue( ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) .withValue( ContactsContract.CommonDataKinds.StructuredPostal.STREET, contacts.get(i).getStreet()) .withValue( ContactsContract.CommonDataKinds.StructuredPostal.CITY, contacts.get(i).getCity()) .withValue( ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, contacts.get(i).getPostcode()) .withValue( ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, contacts.get(i).getCountry()) .withValue( ContactsContract.CommonDataKinds.StructuredPostal.TYPE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK) .build()); counter++; } try { getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, "Error adding contact", Toast.LENGTH_SHORT).show(); counter--; } if (counter > 0) { if (counter > 1) { Toast.makeText(this, "Contacts added", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Contact added", Toast.LENGTH_SHORT).show(); } } } if (counter == 0) { Toast.makeText(this, "Unable to add contact", Toast.LENGTH_SHORT).show(); } }