显示联系人头像

编写:spencer198711 - 原文:http://developer.android.com/training/contacts-provider/display-contact-badge.html

这一课展示了如何在我们的应用界面上添加一个QuickContactBadge,以及如何为它绑定数据。 QuickContactBadge是一个在初始情况下显示联系人缩略图头像的widget。尽管我们可以使用任何Bitmap作为缩略图头像,但是我们通常会使用从联系人照片缩略图中解码出来的Bitmap。

这个小的图片是一个控件,当用户点击它时,QuickContactBadge会展开一个包含以下内容的对话框:

  • 一个大的联系人头像

    与这个联系人关联的大的头像,如果此人没有设置头像,则显示预留的图案。

  • 应用程序图标

    根据联系人详情数据,显示每一个能够被手机中的应用所处理的数据的图标。例如,如果联系人的数据包含一个或多个email地址,就会显示email应用的图标。当用户点击这个图标的时候,这个联系人所有的email地址都会显示出来。当用户点击其中一个email地址时,email应用将会显示一个界面,让用户为选中的地址撰写邮件。

QuickContactBadge视图提供了对联系人数据的即时访问,是一种与联系人沟通的快捷方式。用户不用查询一个联系人,查找并复制信息,然后把信息粘贴到合适的应用中。他们可以点击QuickContactBadge,选择他们想要的沟通方式,然后直接把信息发送给合适的应用中。

添加一个QuickContactBadge视图

为了添加一个QuickContactBadge视图,需要在布局文件中插入一个QuickContactBadge。例如:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
...
    <QuickContactBadge
               android:id=@+id/quickbadge
               android:layout_height="wrap_content"
               android:layout_width="wrap_content"
               android:scaleType="centerCrop"/>
    ...
</RelativeLayout>

获取Contacts Provider的数据

为了能在QuickContactBadge中显示联系人,我们需要这个联系人的内容URI和显示头像的Bitmap。我们可以从在Contacts Provider中获取到的数据列中生成这两个数据。需要指定这些列作为查询映射去把数据加载到Cursor中。

对于Android 3.0(API版本为11)以及以后的版本,需要在查询映射中添加以下列:

对于Android 2.3.3(API版本为10)以及之前的版本,则使用以下列:

这一课的剩余部分假设你已经获取到了包含这些以及其他你可能选择的数据列的Cursor对象。想要学习如何获取这些列对象的Cursor,请参阅课程获取联系人列表

设置联系人URI和缩略图

一旦我们已经拥有了所需的数据列,那么我们就可以为QuickContactBadge视图绑定数据了。

设置联系人URI

为了设置联系人URI,需要调用getLookupUri(id, lookupKey)去获取CONTENT_LOOKUP_URI,然后调用assignContactUri())去为QuickContactBadge设置对应的联系人。例如:

// The Cursor that contains contact rows
Cursor mCursor;
// The index of the _ID column in the Cursor
int mIdColumn;
// The index of the LOOKUP_KEY column in the Cursor
int mLookupKeyColumn;
// A content URI for the desired contact
Uri mContactUri;
// A handle to the QuickContactBadge view
QuickContactBadge mBadge;
...
mBadge = (QuickContactBadge) findViewById(R.id.quickbadge);
/*
 * Insert code here to move to the desired cursor row
 */
// Gets the _ID column index
mIdColumn = mCursor.getColumnIndex(Contacts._ID);
// Gets the LOOKUP_KEY index
mLookupKeyColumn = mCursor.getColumnIndex(Contacts.LOOKUP_KEY);
// Gets a content URI for the contact
mContactUri =
        Contacts.getLookupUri(
            mCursor.getLong(mIdColumn),
            mCursor.getString(mLookupKeyColumn)
        );
mBadge.assignContactUri(mContactUri);

当用户点击QuickContactBadge图标的时候,这个联系人的详细信息将会自动展现在对话框中。

设置联系人照片的缩略图

为QuickContactBadge设置联系人URI并不会自动加载联系人的缩略图照片。为了加载联系人照片,需要从联系人的Cursor对象的一行数据中获取照片的URI,使用这个URI去打开包含压缩的缩略图文件,并把这个文件读到Bitmap对象中。

Note:PHOTO_THUMBNAIL_URI这一列在Android 3.0之前的版本是不存在的。对于这些版本,我们必须从Contacts.Photo表中获取照片的URI。

首先,为包含Contacts._ID和Contacts.LOOKUP_KEY的Cursor数据列设置对应的变量,这在之前已经有描述:

// The column in which to find the thumbnail ID
int mThumbnailColumn;
/*
 * The thumbnail URI, expressed as a String.
 * Contacts Provider stores URIs as String values.
 */
String mThumbnailUri;
...
/*
 * Gets the photo thumbnail column index if
 * platform version >= Honeycomb
 */
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    mThumbnailColumn =
            mCursor.getColumnIndex(Contacts.PHOTO_THUMBNAIL_URI);
// Otherwise, sets the thumbnail column to the _ID column
} else {
    mThumbnailColumn = mIdColumn;
}
/*
 * Assuming the current Cursor position is the contact you want,
 * gets the thumbnail ID
 */
mThumbnailUri = mCursor.getString(mThumbnailColumn);
...

定义一个方法,使用与这个联系人的照片有