0

我正在 Android 上开发一个 IM 应用程序。目的是具有多帐户和协议的兼容性。我正在寻找一种在 Android 上获得最佳联系人状态的方法。我有一个支持的帐户类型列表。我有一个函数需要很长时间(contact_id),并且必须返回最好的Account+最好的联系方式(例如somebody@jabber.org)。

我已经查看了文档,并且我已经知道 SQL。但是在那一点上文档有点混乱,我不知道如何获得向联系人发送消息的最佳方式。这是我正在尝试做的一些代码:

public static Account best(Context context, long contact)
{
    final ContentResolver resolver = context.getContentResolver();
    final Cursor rawContacts = resolver.query(RawContacts.CONTENT_URI,
              new String[]{RawContacts._ID},
              RawContacts.CONTACT_ID + "=? AND " + registeredProtocolsSelection(),
              new String[]{String.valueOf(contact)}, null);
    while(rawContacts.moveToNext())
    {
        final long rawContactId = rawContacts.getLong(0);
        Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
        Uri entityUri = Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY);
        Cursor rawContact = resolver.query(entityUri,
                  new String[]{RawContacts.SOURCE_ID, Entity.DATA_ID, Entity.MIMETYPE, Entity.DATA1},
                  null, null, null);
    }
    return null;
}

我可以选择对我的应用程序重要的所有 RawContact,但我不知道如何加入,也无法获得数据库的清晰架构。我不知道如何从那里访问 StatusUpdate。目标就像ORDER BY presence

有没有简单的方法可以做到这一点?有没有办法通过 ORM 之类的东西像普通对象一样操作联系人?或者我们是否有一种机制可以在 Android 上轻松创建和管理我们自己的 IM 协议?

4

1 回答 1

0

随着时间的推移,我找到了它。我们可以使用 ContentProvider.query(..., sort); 的最后一个参数;为给定的联系人首先拥有最佳的 RawContact Presence。对于那些仍然在这里搜索的人是代码

final Cursor cursor = contentResolver.query
(
    StatusUpdates.CONTENT_URI, 
    new String[]
    {
        StatusUpdates.PRESENCE,
        StatusUpdates.STATUS_LABEL,
        StatusUpdates.STATUS_RES_PACKAGE
    }, 
    Data.CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", 
    new String[]
    { 
        Long.toString(id), 
        CommonDataKinds.Im.CONTENT_ITEM_TYPE 
    },
    StatusUpdates.STATUS_TIMESTAMP + " DESC" // For last Or
    StatusUpdates.PRESENCE + " DESC" // For presence
);
if(cursor!=null && cursor.moveToFirst())
{
    presence = Presence.get(cursor.getLong(0));
    status = Utils.Contact.status(cursor.getInt(1), cursor.getString(2));
}
if(cursor!=null)
{
    cursor.close();
}

您还可以将联系人表的预定义字段用于给定联系人的自动最佳状态。

于 2012-07-30T12:05:13.393 回答