Inserting contacts in Android 2.2

后端 未结 3 577
后悔当初
后悔当初 2020-11-27 16:01

I am trying to insert new RawContact contacts, but the RawContact added doesn\'t get displayed when I view the contacts through Contacts or phonebo

相关标签:
3条回答
  • 2020-11-27 16:37

    I thought this Q was long forgotten but Since someone upvoted it, I am assuming someone else also faces the same problem as me. After a little struggle I was able to figure out the problem and insert contacts, Hope this helps, here is the sample code:

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    int rawContactInsertIndex = ops.size();
    
    ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
       .withValue(RawContacts.ACCOUNT_TYPE, null)
       .withValue(RawContacts.ACCOUNT_NAME,null )
       .build());
    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
       .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
       .withValue(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE)
       .withValue(Phone.NUMBER, "9X-XXXXXXXXX")
       .build());
    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
       .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
       .withValue(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE)
       .withValue(StructuredName.DISPLAY_NAME, "Mike Sullivan")
       .build());  
    ContentProviderResult[] res = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    
    0 讨论(0)
  • 2020-11-27 16:38

    To have a visible contact created, it needs to belong to a visible group. Have a look at gmail contacts on your computer to view groups and visibility.

    To find a visible group on the device, do something like this:

        Long myContactsGroupId = null;
        sqlWhere = ContactsContract.Groups.ACCOUNT_TYPE + " = 'com.google'  AND  " + ContactsContract.Groups.GROUP_VISIBLE + " = 1";
        Cursor cursor = getContentResolver().query(ContactsContract.Groups.CONTENT_URI, new String[] {"_id"}, sqlWhere, null, "_id");
        if (cursor.moveToFirst()) {
            myContactsGroupId = cursor.getLong(0);
        }
    

    To add the group to the rawContact:

            cv.clear();
            cv.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE);
            cv.put(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID, myContactsGroupId);
            cv.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
            getContentResolver().insert(ContactsContract.Data.CONTENT_URI, cv);
    

    Or the ops version:

             ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.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, myContactsGroupId)
                    .build());
    

    @anqe1ki11er:

    I don't understand the 3rd paragraph in your answer where it says:

    values.put(Data.MIMETYPE, Data.CONTENT_TYPE) ...

    There is no such MIMETYPE. (I checked it on HTC Desire running HTC Android 2.2).

    Thanks.

    0 讨论(0)
  • 2020-11-27 16:41

    A client reported to me that the solution in the answer above(by Als) doesn't work on some HTC devices. So after a few days of frustration I came up with this solution:

    String name = "First Family";
    String phone = "0123456789";
    ContentValues values = new ContentValues();
    values.put(Data.DISPLAY_NAME, name);
    Uri rawContactUri = c.getContentResolver().insert(RawContacts.CONTENT_URI, values);
    long rawContactId = ContentUris.parseId(rawContactUri);
    long contactId = Util.getContactId(c, rawContactId);
    System.out.println("rawContactId = " + rawContactId);
    System.out.println("contactId = " + contactId);
    
    values.clear();
    values.put(Phone.NUMBER, phone);
    values.put(Phone.TYPE, Phone.TYPE_OTHER);
    values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
    values.put(Data.RAW_CONTACT_ID, rawContactId);
    c.getContentResolver().insert(Data.CONTENT_URI, values);
    
    values.clear();
    values.put(Data.MIMETYPE, Data.CONTENT_TYPE);
    values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name);
    values.put(Data.RAW_CONTACT_ID, rawContactId);
    c.getContentResolver().insert(Data.CONTENT_URI, values);
    
    values.clear();
    values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
    values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name);
    values.put(Data.RAW_CONTACT_ID, rawContactId);
    c.getContentResolver().insert(Data.CONTENT_URI, values);
    
    
    
    public static long getContactId(Context context, long rawContactId) {
        Cursor cur = null;
        try {
            cur = context.getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, new String[] { ContactsContract.RawContacts.CONTACT_ID }, ContactsContract.RawContacts._ID + "=" + rawContactId, null, null);
            if (cur.moveToFirst()) {
                return cur.getLong(cur.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cur != null) {
                cur.close();
            }
        }
        return -1l;
    }
    
    0 讨论(0)
提交回复
热议问题