安卓4.0(ICS)的全新社交应用程序接口(New Social APIs in Android ICS)
英文发布:Tim Bray
原文作者:Daniel Lehmann, Android Apps 小组的技术主管
有了安卓冰淇淋三明治(ICS,亦即Android 4.0), 我们意图做一些能够为人类和他们的便携设备
之间加入更多情感链接的软件。我们想做出世界上最有个人味道的掌上设备。
因此,我们这道个性情感大餐的第一份原料就是采取一种杂志的形式,用高分辨率的照片,向用户展
示他们所最关心的人。
这道大餐的第二份原料,就是以更突出地将朋友们的活动呈现出来。当我们打开一个联系人时,可以
从显示他来自多种数据源的最新动态,而无需逐个打开他们的社交网站应用。(译者:看来这是Google依
托终端对Facebook一次巧妙的反击)
安卓是一个开放性平台,在安卓4.0中,我们提供了丰富的应用程序接口(API)以便让那些社交网站
应用集成进来。以下这篇文章阐述了社交应用(例如我们自家的Google+)如何使用这些这些API,以及其
他社交应用(例如友台的Facebook)也可以(译者:被迫地,或者无奈地)同样地整合进来。
【基本知识】
自从Eclair版本开始(安卓2.0), 安卓系统已经能够从不同的数据源获取相关的联系人信息。安
卓能够识别出你是在关联至不同网络(例如Skype, Gmail, Google+)的同一个联系人,然后把它们连成
一个“整合联系人”。
下面这些术语将有助于你对本文的理解:
- RawContact(原始联系人) 是一个来自于单一数据源的联系人,例如,你在Skype上的一个朋友
资料
- Data rows(数据行) 是保存在RawContact里的每一个片段信息(名称、电话号码、邮件地址等
等)
- Contact (联系人) 可以把多个RawContact整合成一个aggregate contact(整合联系人)。这
个联系人就是用户在手机上的People和Phone应用中看到的联系人。
- Sync adapter(同步适配器)用于将RawContact与其关联的云端服务进行同步。这个Adapter可
以和电子市场里面的应用进行捆绑。(如Skype应用, Twitter应用, Google+应用)
当用户操作手机上的联系人的时候,sync adapter对他们自己的RawContact的Data Row进行处理。这
些adapter管有其数据行,但是设计上是由安卓系统将不同的原始联系人进行关联。
Sync Adapter用一个特殊的xml文件来描述他们的内容,这个描述可以参考安卓SDK。在下面的段落中
,我们假定这个文件名叫做contacts.xml。
安卓SDK还有一个应用程序叫做SampleSyncAdapter(包括源码),这个应用清晰明了地实现了以上所
说的内容。
【高分辨率照片】
在安卓3.0版本之前,联系人图片采用96x96分辨率。从ICS版本开始,开始使用一个Thumbnail(缩略
图96x96)和一个Display Photo(显示图片)。显示图片的最大尺寸可以依照设备而不同(例如,在
Galaxy Nexus和Nexus S中,它被设定为256x256,但将来的设备可能会变化)。预设的尺寸可以通过以下
代码进行查询:
private static int getPhotoPickSize(Context context) {
// Note that this URI is safe to call on the UI thread.
Cursor c = context.getContentResolver().query(DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI,
new String[]{ DisplayPhoto.DISPLAY_MAX_DIM }, null, null, null);
try {
c.moveToFirst();
return c.getInt(0);
} finally {
c.close();
}
}
这个值可以用于用与从服务器中查询照片的过程(因为你可以设定下载照片的尺寸)。如果你已经有
了一张高分辨率的图片,那么没必要在服务器端做尺寸修改。如果你的照片尺寸太大,联系人应用会自动
缩减尺寸。
到目前为止,照片内容是写入一个ContantValues对象中,就像其他来自RawContact的Data Rows一样
。虽然这种方法还被支持,但对于更大的图片,这种方法可能会有问题,因为在进程间发送一个
ContentValues会有容量的限制。我们更推荐采用一个AssetFileDescriptor然后把数据写入一个
FileOutputStream中:
private static void saveBitmapToRawContact(Context context, long rawContactId, byte[] photo)
throws IOException {
Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
Uri outputFileUri =
Uri.withAppendedPath(rawContactUri, RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
AssetFileDescriptor descriptor = context.getContentResolver().openAssetFileDescriptor(
outputFileUri, "rw");
FileOutputStream stream = descriptor.createOutputStream();
try {
stream.write(photo);
} finally {
stream.close();
descriptor.close();
}
}
想达到最佳的展示效果,请保存无压缩的正方形的照片,让联系人应用的provider来做压缩图片的工
作,它会按需创建缩略图和展示图。
这个API在14+以上的版本才能用。在旧版本中,我们推荐用旧的ContentValues并且假定尺寸是96x96
。
【Update Streams联系人动态流】
Update Stream的API是ICS对联系人的最大改进。Sync Adapters现在能够想联系人信息中注入更多
的社交信息流(如文本、图片等)
这个API意图为你的社交应用提供一个接入点以加强和用户的联系。安卓系统内置应仅仅会展现一部
分最新的社交信息流信息,我们认为你们自己的社交应用才是最好的用户交互和信息发布的途径。
StreamItems 被关联至一个联系人行信息中。他们保存了关于这个原始联系人的最新更新,包括文
字、时间和评论。它也可以有图片内容,放在StreamItemPhotos中。Stream Items有个条数限制,在
Nexus设备中被设定为5条,但未来可能会改变。如果你需要查询更新的条数限制,可以这样:
private static int getStreamItemLimit(Context context) {
// Note that this URI is safe to call on the UI thread.
Cursor c = context.getContentResolver().query(StreamItems.CONTENT_LIMIT_URI,
new String[]{ StreamItems.MAX_ITEMS }, null, null, null);
try {
c.moveToFirst();
return c.getInt(0);
} finally {
c.close();
}
}
当在用户使用联系人(People)应用时,来自所有的原始联系人数据的朋友动态流会被混在一起,然
后按时间顺序展示。
下面的功能展示了如何向一个原始联系人信息中添加一个stream item。
private static void addContactStreamItem(Context context, long rawContactId, String text,
String comments, long timestamp, String accountName, String accountType){
ContentValues values = new ContentValues();
values.put(StreamItems.RAW_CONTACT_ID, rawContactId);
values.put(StreamItems.TEXT, "Breakfasted at Tiffanys");
values.put(StreamItems.TIMESTAMP, timestamp);
values.put(StreamItems.COMMENTS, comments);
values.put(StreamItems.ACCOUNT_NAME, accountName);
values.put(StreamItems.ACCOUNT_TYPE, accountType);
context.getContentResolver().insert(StreamItems.CONTENT_URI, values);
}
你还可以指定当用户点击一条更新信息或更新图片之后执行的后续动作。只需在你的contacts.xml中
用viewStreamItemActivity和viewStreamItemPhotoActivity标签指定目标activities就可以了。
<ContactsAccountType
xmlns:android="http://schemas.android.com/apk/res/android"
viewStreamItemActivity="com.example.activities.ViewStreamItemActivity”
viewStreamItemPhotoActivity="com.example.activities.ViewStreamItemPhotoActivity">
<!-- Description of your data types -->
</ContactsAccountType>
在API15+可以采用Update streams。这个API用来取代旧的StatusUpdate API。对于旧版设备请用
StatusUpdate,但那个只能显示一条文字信息,不能显示图片。
【"ME" profile】
ICS是第一个支持"Me"联系人(我自己)的安卓版本。这个联系人会在People应用的最上方突出显示
。这减少了以前要分享自己的联系信息时的操作步骤,也可以减少在导航时“导航回家”的操作。他也允
许程序直接通过名字查询联系人并展示照片。
ME profile已经通过新的权限“READ_PROFILE”和“WRITE_PROFILE"进行保护。这些新功能强大到读
取用户的个人信息。请确保你的应用清晰地告诉用户为什么你要读取这些信息。
这些新API的入口是ContactsContact.Profile,14+以上版本可用。
【Add Connection 添加社交网络朋友连接】
以前将用户连到一个社交网络需要打开相关的社交网络应用,搜索朋友名字,然后连结(或者诸如“加好友”、“加关注”等)ICS有个更平滑的方法。当我们在联系人中查看朋友信息时,用户可以即时决定是否将这个人加入到另外的一个网络。例如,用户可能想把一个已经在Gmail中的联系人,加入到他的Google+圈子中。
一旦用户点击“Add Connection”命令,有关的应用会启动并且通过联系人中的现有信息寻找用户。搜索条件由社交应用决定,但是一个比较好的方法是用名字,邮件地址或电话号码。
如需指定“Add Connection”菜单项,请在contacts.xml采用inviteContactActivity和inviteContactActionLabel来设定。
<ContactsAccountType
xmlns:android="http://schemas.android.com/apk/res/android"
inviteContactActivity="com.example.activities.InviteContactActivity"
inviteContactActionLabel="@string/invite_action_label">
<!-- Description of your data types -->
</ContactsAccountType>
请采用和你的社交网络的惯常用语来填写这个add connection的标签(例如“加好友”,或者“关注他”),以确保和你的程序图标一致,让用户易于理解。
14+以上的API可用。
【联系人视图通知】
高分辨率图片需要很多空间,社交信息流会很快变得过时。因此不建议每次都同步所有的用户数据库。一个好的sync adapter应该将考虑联系人的重要性。例如一个加了星标的联系人会采用大图显示,因此用高分辨率显示图片会更加重要。你的网站也可能有自己的规则以帮助标注重要联系人。
对于其他的所有不那么重要的联系人,你可以注册并获得一个来自People应用程序的通知。这个事件通知在某个联系人的明细页面打开的时候被发出。这个时候你的程序可以提供附加的信息,例如,Google+的sync adapter收到了这个通知,它会从服务器上抓取高分辨率的照片和最近的社交动态流并写入contacts provider。
以上操作可以通过在contacts.xml中添加viewContactNotifyService属性达成:
<ContactsAccountType
xmlns:android="http://schemas.android.com/apk/res/android"
viewContactNotifyService="com.example.notifier.NotifierService">
<!-- Description of your data types -->
</ContactsAccountType>
当上面的Intent运行时, 它的data属性将会指向刚刚打开的raw contact的URI。
14+以上版本可用。
【结论】
有了ICS版本,我们在高分辨率照片和社交动态信息流的关键部分做了改进,简化了添加好友的过程。
以上提到的采用新的API的功能可以让任何的社交网络使用。 我们很兴奋能够看到开发者能善用这些新特性。(译者:例如对面那家Facebook)