【问题标题】:Integrate my app with Contact将我的应用与联系人集成
【发布时间】:2011-05-27 15:11:43
【问题描述】:

我想将我的应用与联系人管理器集成:

更准确地说:

当我在手机中运行联系人应用程序然后单击任何头像时,会显示一个弹出(快速联系人徽章)窗口,其中包含一些可供选择的应用程序(联系人、邮件等)我想在其中添加我的应用程序地方。

这可能吗?

我希望清楚。

提前致谢。

【问题讨论】:

  • 你是怎么解决的?我也想这样做。
  • 到目前为止运气不佳,这是我的 TODO 列表中的一个待处理任务,只要找到一些解决方案,我就会在这里发布。请也这样做:)。

标签: android contacts contact android-contacts


【解决方案1】:

嘿,伙计,我终于解决了这个问题,向 ContactProvider 添加了一个自定义字段,然后 QuickContactBadge 将为您链接它。

我的代码,用于添加,删除特定条目,删除我添加的所有条目。

 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.");
    }
}

希望有人觉得这很有用。

【讨论】:

  • 您能否澄清一下“嘿,伙计,我终于解决了这个问题,向 ContactProvider 添加了一个自定义字段,然后 QuickContactBadge 将为您链接它。”
  • 如果您向 ContactProvider 添加自定义字段,您的应用将被列在 QuickContactBadge 中。检查手机上的默认联系人应用程序,然后“点击”一个联系人,将显示一个弹出窗口(徽章),其中包含一些可用的应用程序。我的意图是将我的应用程序添加到该徽章中,我发现您可以添加自己的字段并在其中放置一些信息,然后由于我的应用程序拥有该自定义字段,因此 android 会将您的应用程序与该特定联系人链接。
  • 你能告诉我什么是账户名吗?只是简单的联系人姓名吗?当我尝试这个时,它在 applyBatch 方法中给了我例外。请帮帮我。
  • 已经很久了,但到目前为止我还记得,是的,你想输入的就是帐户(Skype 帐户、whatsupp 帐户等)。
  • 你能告诉我当用户点击你的应用图标时会发生什么吗?
【解决方案2】:

以下是在 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多