1

When I add contact without adding him to group it's work but when i try to add to specific group( i had the id) it's faild. I read lot of answers how to add contact to group. but it's faild all time.

Here my code:

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
             .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, "meu")
             .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, "meu")
             .build());

     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contact.name)
             .build());
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.Phone._ID, contact.index)
             .build());
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.phone)
             .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_WORK)
             .build());
     if(contact.phone2 !=" "){
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.phone2)
             .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_WORK)
             .build());
     }
     if(contact.phone3 !=" "){
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.phone3)
             .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_WORK)
             .build());
     }
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.fax)
             .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_FAX_WORK)
             .build());
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET,contact.street+" "+contact.streetNumber+","+contact.city)
             .build());
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY,Screen.currentContext.getResources().getString(R.string.meuhedet))
             .build());

    ops.add(ContentProviderOperation.newInsert(ContactsContract.Groups.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID, 10)
             .build());

     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     Bitmap photo = BitmapFactory.decodeResource(Screen.getContext().getResources(),R.drawable.logo);
     photo.compress(Bitmap.CompressFormat.PNG, 100, baos);
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
         .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
         .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
         .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, baos.toByteArray())
         .build());

i found this trace in Log:

12-03 10:17:11.693: E/SQLiteLog(18436): (1) table groups has no column named mimetype 12-03 10:17:11.698: E/SQLiteDatabase(18436): Error inserting mimetype=vnd.android.cursor.item/group_membership account_id=1 data1=10 dirty=1 raw_contact_id=2 12-03 10:17:11.698: E/SQLiteDatabase(18436): android.database.sqlite.SQLiteException: table groups has no column named mimetype (code 1): , while compiling: INSERT INTO groups(mimetype,account_id,data1,dirty,raw_contact_id) VALUES (?,?,?,?,?) 12-03 10:17:11.698: E/SQLiteDatabase(18436): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 12-03 10:17:11.698: E/SQLiteDatabase(18436): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1012) 12-03 10:17:11.698: E/SQLiteDatabase(18436): at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:623) 12-03 10:17:11.698: E/SQLiteDatabase(18436): at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 12-03 10:17:11.698: E/SQLiteDatabase(18436): at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58) 12-03 10:17:11.698: E/SQLiteDatabase(18436): at android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:31) 12-03 10:17:11.698: E/SQLiteDatabase(18436): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467) 12-03 10:17:11.698: E/SQLiteDatabase(18436): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339) 12-03 10:17:11.698: E/SQLiteDatabase(18436): at com.android.providers.contacts.ContactsProvider2.insertGroup(ContactsProvider2.java:5170) 12-03 10:17:11.698: E/SQLiteDatabase(18436): at com.android.providers.contacts.ContactsProvider2.insertInTransaction(ContactsProvider2.java:3598) 12-03 10:17:11.698: E/SQLiteDatabase(18436): at com.android.providers.contacts.AbstractContactsProvider.insert(AbstractContactsProvider.java:116) 12-03 10:17:11.698: E/SQLiteDatabase(18436): at com.android.providers.contacts.ContactsProvider2.insert(ContactsProvider2.java:2681) 12-03 10:17:11.698: E/SQLiteDatabase(18436): at android.content.ContentProviderOperation.apply(ContentProviderOperation.java:214) 12-03 10:17:11.698: E/SQLiteDatabase(18436): at com.android.providers.contacts.AbstractContactsProvider.applyBatch(AbstractContactsProvider.java:217)....

blay
  • 464
  • 9
  • 23

2 Answers2

1

I found my problem and it's quite stupid.

I write this ContactsContract.**Groups**.CONTENT_URI instead ContactsContract.**Data**.CONTENT_URI

This why i get exception in sql. because to Groups table has no column named mimetype

Pratik Butani
  • 60,504
  • 58
  • 273
  • 437
blay
  • 464
  • 9
  • 23
0

Try this code. Groups._ID will be generated by Android

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

    ops.add(ContentProviderOperation.newInsert(Groups.CONTENT_URI)
             .withValue(Groups.TITLE, "your_group_Title")
             .withValue(Groups.GROUP_VISIBLE, true)
             .withValue(RawContacts.ACCOUNT_TYPE, "com.google")
             .withValue(RawContacts.ACCOUNT_NAME, "********@gmail.com")
             .build());


    try {
        ContentProviderResult[] contactUri = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    } catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (OperationApplicationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
Vlad
  • 3,465
  • 1
  • 31
  • 24
  • This works on all devices here exept a HTC M8 gives this error: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference – Roel Sep 16 '15 at 07:23