Integrate my app with Contact
Asked Answered
P

2

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.

Pilot answered 18/12, 2010 at 18:14 Comment(2)
How did you solve it? I would like to do the same.Maggy
No luck so far, is a pending task in my TODO list, as soos as find some solution I will post it here. please do the same :).Pilot
P
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.

Pilot answered 16/7, 2011 at 17:12 Comment(8)
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."Sambar
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.Pilot
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.Gipps
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).Pilot
could you tell me what happens when a user clicks on ur app icon ?Dunkin
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.Pilot
@Pilot did u get solution for it, i also want same thing but dont know how to do it, please help if it is possibleKylynn
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.Pilot
M
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)
Menhir answered 11/11, 2020 at 7:52 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.