谷歌眼镜Mirror API开发指南之Subscriptions
2014-01-24 14:16
387 查看
原文地址:http://bbs.seacat.cn/thread-883-1-2.html
订阅Mirrror API允许当用户需要具体的Timeline Item和当用户的位置发送改变时发送订阅通知(subscribe to notifications),当你订阅通知,你需要提供一个回调URL来处理通知。
接收通知
来自MirrorAPI的通知会发送一个POST请求给订阅的段节点,这里面包含一段JSON数据。
Raw HTTP
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "UPDATE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "<TYPE>",
"payload": "<PAYLOAD>"
}
]
}
Java代码
[java]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.mirror.model.Notification;
import java.io.IOException;
import java.io.InputStream;
// ...
publicclass MyClass {
// ...
/**
* Parse a request body into a Notification object.
*
* @param requestBody The notification payload sent by the Mirror API.
* @return Parsed notification payload if successful, {@code null} otherwise.
*/
static Notification parseNotification(InputStream requestBody) {
try {
JsonFactory jsonFactory = new JacksonFactory();
return jsonFactory.fromInputStream(requetBody, Notification.class);
} catch (IOException e) {
System.out.println("An error occurred: " + e);
returnnull;
}
}
// ...
}
Python
[python]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
import json
def parse_notification(request_body):
"""Parse a request body into a notification dict.
Params:
request_body: The notification payload sent by the Mirror API as a string.
Returns:
Dict representing the notification payload.
"""
return json.load(request_body)
[align=left]你的服务如果没有错误发生必须对HTTP状态码等于200时做出响应。如果你的服务响应一个错误代码,Mirror API可能会重发通知给你的服务。[/align][align=left]注意: 10秒无响应连接将超时。如果你的请求时间过长,你需要新开一个线程。[/align][align=left]
[/align]通知类型
Mirror API为不同事件会发送不同的通知载体。
共享timeline item
用户通过你的Glassware来共享Timeline item
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "INSERT",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "SHARE"
}
]
}
temId属性共享Timelineitem的id,你可以通过使用 Timeline.get来获得timeline item。下面一个典型的示例展示了timelineitem带照片做为附件。
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
{
"id": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"attachments": [
{
"contentType": "image/jpeg",
"id": "<ATTACHMENT_ID>"
}
],
"recipients": [
{
"kind": "glass#contact",
"source": "api:<SERVICE_ID>",
"id": "<CONTACT_ID>",
"displayName": "<CONTACT_DISPLAY_NAME>",
"imageUrls": [
"<CONTACT_ICON_URL>"
]
}
]
}
注意:有关更多信息,请参见 联系人(Contacts)与联系人分享内容。
回复
[align=left]用户使用内置的答复回复你timeline item[/align]
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "INSERT",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "REPLY"
}
]
}
[align=left]itemId属性设置为项目包含的ID[/align]inReplyTo属性设置为timelineitem的ID项回复
text属性设置为文本转录
[align=left]收件人属性设置为timeline item的创造者的回复,如果它存在的话[/align][align=left]
[/align][align=left]例子:[/align]
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
{
"kind": "glass#timelineItem",
"id": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"inReplyTo": "3236e5b0-b282-4e00-9d7b-6b80e2f47f3d",
"text": "This is a text reply",
"recipients": [
{
"id": "CREATOR_ID",
"displayName": "CREATOR_DISPLAY_NAME",
"imageUrls": [
"CREATOR_IMAGE_URL"
]
}
]
}
[align=left]删除[/align][align=left]
[/align][align=left]用户删除一个timeline item[/align]
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "DELETE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "DELETE"
}
]
}
[align=left]temId属性设置为删除项的ID。项目不再包含元数据除了它的ID和isDeleted属性[/align][align=left]注意:如果用户删除一个timeline item,建议您从您的系统删除这些内容[/align][align=left]
[/align][align=left]自定义菜单项选择[/align]
用户选择了您服务设置的一个自定义菜单项(custom menu item)
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "UPDATE",
"userToken": "harold_penguin",
"userActions": [
{
"type": "CUSTOM",
"payload": "PING"
}
]
}
[align=left]temId属性设置为用户选择菜单项的ID[/align][align=left]userActions数组包含用户点击这个项目自定义操作的列表,。你的服务应该相应地处理这些行为。[/align]位置更新
[align=left]一个新的位置对当前用户可用[/align]
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
{
"collection": "locations",
"itemId": "latest",
"operation": "UPDATE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer"
}
当你的Glassware接收位置更新、发送一个请求给glass.locations.get让端点知道最新的位置。你的Glassware每十分钟接收一次位置更新注意:获取位置信息需要在https://www.googleapis.com/auth/glass.location范围之内语音命令你的用户激活语音命令,例如:“Ok Glass, take anote, Cat Stream, 明天是Chipotle是的生日”。以下通知发送到你的Glassware
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
{
"collection": "timeline",
"operation": "INSERT",
"userToken": "chipotle's_owner",
"verifyToken": "mew mew mew",
"itemId": "<ITEM_ID>",
"userActions": [
{“type”: "LAUNCH"}
]
}
[align=left]这个通知是有别于其他启动userActions的通知。[/align][align=left]您可以使用itemId获取timeline item的值[/align]
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
{
"id": "<ITEM_ID>",
"text": "Chipotle's birthday is tomorrow",
"recipients": [
{"id": "CAT_STREAM"}
]
}
收件人属性包含联系人id所使用的语音命令。
订阅Mirrror API允许当用户需要具体的Timeline Item和当用户的位置发送改变时发送订阅通知(subscribe to notifications),当你订阅通知,你需要提供一个回调URL来处理通知。
接收通知
来自MirrorAPI的通知会发送一个POST请求给订阅的段节点,这里面包含一段JSON数据。
Raw HTTP
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "UPDATE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "<TYPE>",
"payload": "<PAYLOAD>"
}
]
}
Java代码
[java]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.mirror.model.Notification;
import java.io.IOException;
import java.io.InputStream;
// ...
publicclass MyClass {
// ...
/**
* Parse a request body into a Notification object.
*
* @param requestBody The notification payload sent by the Mirror API.
* @return Parsed notification payload if successful, {@code null} otherwise.
*/
static Notification parseNotification(InputStream requestBody) {
try {
JsonFactory jsonFactory = new JacksonFactory();
return jsonFactory.fromInputStream(requetBody, Notification.class);
} catch (IOException e) {
System.out.println("An error occurred: " + e);
returnnull;
}
}
// ...
}
Python
[python]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
import json
def parse_notification(request_body):
"""Parse a request body into a notification dict.
Params:
request_body: The notification payload sent by the Mirror API as a string.
Returns:
Dict representing the notification payload.
"""
return json.load(request_body)
[align=left]你的服务如果没有错误发生必须对HTTP状态码等于200时做出响应。如果你的服务响应一个错误代码,Mirror API可能会重发通知给你的服务。[/align][align=left]注意: 10秒无响应连接将超时。如果你的请求时间过长,你需要新开一个线程。[/align][align=left]
[/align]通知类型
Mirror API为不同事件会发送不同的通知载体。
共享timeline item
用户通过你的Glassware来共享Timeline item
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "INSERT",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "SHARE"
}
]
}
temId属性共享Timelineitem的id,你可以通过使用 Timeline.get来获得timeline item。下面一个典型的示例展示了timelineitem带照片做为附件。
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
{
"id": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"attachments": [
{
"contentType": "image/jpeg",
"id": "<ATTACHMENT_ID>"
}
],
"recipients": [
{
"kind": "glass#contact",
"source": "api:<SERVICE_ID>",
"id": "<CONTACT_ID>",
"displayName": "<CONTACT_DISPLAY_NAME>",
"imageUrls": [
"<CONTACT_ICON_URL>"
]
}
]
}
注意:有关更多信息,请参见 联系人(Contacts)与联系人分享内容。
回复
[align=left]用户使用内置的答复回复你timeline item[/align]
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "INSERT",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "REPLY"
}
]
}
[align=left]itemId属性设置为项目包含的ID[/align]inReplyTo属性设置为timelineitem的ID项回复
text属性设置为文本转录
[align=left]收件人属性设置为timeline item的创造者的回复,如果它存在的话[/align][align=left]
[/align][align=left]例子:[/align]
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
{
"kind": "glass#timelineItem",
"id": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"inReplyTo": "3236e5b0-b282-4e00-9d7b-6b80e2f47f3d",
"text": "This is a text reply",
"recipients": [
{
"id": "CREATOR_ID",
"displayName": "CREATOR_DISPLAY_NAME",
"imageUrls": [
"CREATOR_IMAGE_URL"
]
}
]
}
[align=left]删除[/align][align=left]
[/align][align=left]用户删除一个timeline item[/align]
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "DELETE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "DELETE"
}
]
}
[align=left]temId属性设置为删除项的ID。项目不再包含元数据除了它的ID和isDeleted属性[/align][align=left]注意:如果用户删除一个timeline item,建议您从您的系统删除这些内容[/align][align=left]
[/align][align=left]自定义菜单项选择[/align]
用户选择了您服务设置的一个自定义菜单项(custom menu item)
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "UPDATE",
"userToken": "harold_penguin",
"userActions": [
{
"type": "CUSTOM",
"payload": "PING"
}
]
}
[align=left]temId属性设置为用户选择菜单项的ID[/align][align=left]userActions数组包含用户点击这个项目自定义操作的列表,。你的服务应该相应地处理这些行为。[/align]位置更新
[align=left]一个新的位置对当前用户可用[/align]
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
{
"collection": "locations",
"itemId": "latest",
"operation": "UPDATE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer"
}
当你的Glassware接收位置更新、发送一个请求给glass.locations.get让端点知道最新的位置。你的Glassware每十分钟接收一次位置更新注意:获取位置信息需要在https://www.googleapis.com/auth/glass.location范围之内语音命令你的用户激活语音命令,例如:“Ok Glass, take anote, Cat Stream, 明天是Chipotle是的生日”。以下通知发送到你的Glassware
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
{
"collection": "timeline",
"operation": "INSERT",
"userToken": "chipotle's_owner",
"verifyToken": "mew mew mew",
"itemId": "<ITEM_ID>",
"userActions": [
{“type”: "LAUNCH"}
]
}
[align=left]这个通知是有别于其他启动userActions的通知。[/align][align=left]您可以使用itemId获取timeline item的值[/align]
[plain]view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
{
"id": "<ITEM_ID>",
"text": "Chipotle's birthday is tomorrow",
"recipients": [
{"id": "CAT_STREAM"}
]
}
收件人属性包含联系人id所使用的语音命令。
相关文章推荐
- 谷歌眼镜Mirror API开发指南之Subscriptions
- 谷歌眼镜Mirror API开发指南之Timeline
- 谷歌眼镜Mirror API开发指南之Timeline
- 谷歌眼镜Mirror API开发指南之Contacts
- 谷歌眼镜Mirror API开发指南之Glass主题和UI控件
- 谷歌眼镜Mirror API开发指南之Authorizing Requests
- 谷歌眼镜Mirror API开发指南之Location
- Rest服务开发指南—常用注解说明
- Delphi For iOS开发指南(18):让Delphi XE4开发的iOS应用显示为中文名称
- Delphi for iOS开发指南(10): 在iOS应用程序中使用Layout来调整窗体尺寸或排列方向
- ECSHOP二次开发指南
- FleaPHP 开发指南 - 3. 应用程序入口
- Android开发指南(36) —— Search
- android 开发指南--MK
- 前端自动化构建工具Webpack开发模式入门指南 (网上看到的,写得很详细)
- Unity网游开发生存指南—蒸汽之城
- 【资源共享】《Rockchip IO-Domain 开发指南 V1.0》
- Kurento模块开发指南之五:开发示例 Plate Detector Filter
- 读Lua游戏开发实践指南
- IntelliJ IDEA 智能集成开发环境使用指南