13

I would like to integrate my app with contact manager:

More precisely:

When I run Contact app in my phone and then I click on any avatar, a Popup (Quick Contact Badge) windows shows up with some application to choose (Contact, Mail, etc) I would like to add my Application in that place.

That is possible ?

I hope to be clear.

Thanks in advance.

vsm
  • 3,373
  • 2
  • 25
  • 36

2 Answers2

14

Hey guy finally I resolved this adding a custom field to ContactProvider and then QuickContactBadge will be link it for you.

My code, for adding, delete a particular entry, delete all entry added by me.

 private static final String IM_LABEL = "Test protocol";
 private static final String LOG_TAG = "Log"
    /**
 * This method add my account under IM field at default Contact
 * application
 * 
 * Labeled with my custom protocol.
 * 
 * @param contentResolver
 *            content resolver
 * @param uid
 *            User id from android
 * @param account
 *            account name
 */
public static void updateIMContactField(ContentResolver contentResolver,
        String uid, String account) {

    ContentValues contentValues = new ContentValues();

    contentValues.put(ContactsContract.Data.RAW_CONTACT_ID,
            Integer.parseInt(uid));
    contentValues.put(ContactsContract.Data.MIMETYPE,
            ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE);
    contentValues.put(ContactsContract.CommonDataKinds.Im.TYPE,
            ContactsContract.CommonDataKinds.Im.TYPE_CUSTOM);
    contentValues.put(ContactsContract.CommonDataKinds.Im.LABEL, IM_LABEL);
    contentValues.put(ContactsContract.CommonDataKinds.Im.PROTOCOL,
            ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM);
    contentValues.put(ContactsContract.CommonDataKinds.Im.CUSTOM_PROTOCOL,
            IM_LABEL);

    contentValues.put(ContactsContract.CommonDataKinds.Im.DATA, account);

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    ops.add(ContentProviderOperation
            .newInsert(ContactsContract.Data.CONTENT_URI)
            .withValues(contentValues).build());

    try {
        contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
    } catch (Exception e) {
        Log.d(LOG_TAG, "Can't update Contact's IM field.");
    }
}

/**
 * This method remove IM entry at default Contact application.
 * 
 * @param contentResolver
 *            content resolver
 * @param uid
 *            User id from android
 * @param account
 *            account name
 */
public static void removeIMContactField(ContentResolver contentResolver,
        String uid, String account) {
    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

    ops.add(ContentProviderOperation
            .newDelete(Data.CONTENT_URI)
            .withSelection(
                    ContactsContract.Data.RAW_CONTACT_ID + "=? and "
                            + ContactsContract.Data.MIMETYPE + "=? and "
                            + ContactsContract.CommonDataKinds.Im.DATA
                            + " = ?",
                    new String[] {
                            String.valueOf(uid),
                            ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE,
                            account }).build());

    try {
        contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
    } catch (Exception e) {
        Log.d(LOG_TAG, "Can't delete Contact's IM field.");
    }
}

/**
 * This method remove IM all entries at default Contact application 
 * 
 * @param contentResolver
 *            content resolver
 */
public static void deleteAllIMContactField(ContentResolver contentResolver) {
    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

    ops.add(ContentProviderOperation
            .newDelete(Data.CONTENT_URI)
            .withSelection(
                    ContactsContract.Data.MIMETYPE
                            + "= ? and "
                            + ContactsContract.CommonDataKinds.Im.CUSTOM_PROTOCOL
                            + "= ?",
                    new String[] {
                            ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE,
                            IM_LABEL }).build());

    try {
        contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
    } catch (Exception e) {
        Log.d(LOG_TAG,
                "An exception occurred when deleting all IM field of Contact.");
    }
}

Hope some one found this useful.

Akil
  • 719
  • 13
  • 23
vsm
  • 3,373
  • 2
  • 25
  • 36
  • Could you clarify this "Hey guy finally I resolved this adding a custom field to ContactProvider and then QuickContactBadge will be link it for you." – Chrispix Nov 09 '11 at 17:53
  • 1
    If you add a custom field to the ContactProvider your app will be listed into QuickContactBadge. Check default contact app on your phone and "tap" a contact a popup will be displayed (Badge) with some apps available. My intention was add my app into that badge and I found that you can add your own field put some info there and then android will link your app with that particular contact due my app owns that custom field. – vsm Nov 11 '11 at 05:57
  • can you tell me what is account name? Is it just simple contact name? And when I tried this it gives me exception in applyBatch method. Please help me. – baldguy Oct 11 '13 at 06:49
  • Has been a long time since, but so far I can remember, yes account is what ever you want to put in (skype account, whatsupp account, etc). – vsm Oct 15 '13 at 17:28
  • could you tell me what happens when a user clicks on ur app icon ? – Tarek Kanon Jan 18 '14 at 10:21
  • I don't work in that project/company since then, but as far as remember when you click on your app icon, Android start your app, don't remember if you have extra information on Intent. But you can try it and tell us about your test. Sorry to not be helpful. – vsm Jan 19 '14 at 02:38
  • @vsm did u get solution for it, i also want same thing but dont know how to do it, please help if it is possible – Ravi Apr 23 '14 at 06:23
  • I don't know what is your issue/question, but basically you have to copy above code, and call it when you add/remove/modify a contact into your app. If you have some particular question, please create a new Stackoverflow question and I will be glad to follow up there. – vsm Apr 23 '14 at 20:19
0

Here's how you're able to add Custom Field in the ContactsContract.IM.

val contentProviderOperation = ArrayList<ContentProviderOperation>()
val rawContactInsertIndex = contentProviderOperation.size

contentProviderOperation.add(
    ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
        .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
        .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
        .build()
)

val customOperation = ContentProviderOperation
    .newInsert(ContactsContract.Data.CONTENT_URI)
    .withValueBackReference(
        ContactsContract.Data.RAW_CONTACT_ID,
        rawContactInsertIndex
    ).withValue(
        ContactsContract.Contacts.Data.MIMETYPE,
        ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE
    ).withValue(
        ContactsContract.Contacts.Data.MIMETYPE,
        ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE
    ).withValue(
        ContactsContract.CommonDataKinds.Im.TYPE,
        ContactsContract.CommonDataKinds.Im.TYPE_CUSTOM
    ).withValue(
        ContactsContract.CommonDataKinds.Im.PROTOCOL,
        ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM
    ).withValue(
        ContactsContract.CommonDataKinds.Im.CUSTOM_PROTOCOL,
        "Custom IM Field"
    ).withValue(
        ContactsContract.CommonDataKinds.Im.DATA,
        "Custom IM Value"
    )

contentProviderOperation.add(customOperation.build())

contentResolver.applyBatch(ContactsContract.AUTHORITY, contentProviderOperation)
Morgan Koh
  • 2,297
  • 24
  • 24