คุณสามารถแทรก อัปเดต อ่าน และลบบัตรแบบคงที่ได้โดยใช้ REST API แบบง่าย นอกจากนี้ คุณยังแนบออบเจ็กต์กับการ์ดแบบคงที่ได้ด้วย เช่น สถานที่หรือสื่อ
วิธีการทำงาน
การ์ดแบบคงที่จะอยู่ทางด้านขวาของนาฬิกา Glass โดยค่าเริ่มต้น และจะแสดงข้อมูล ที่เกี่ยวข้องกับผู้ใช้ ณ เวลาที่นำส่ง อย่างไรก็ตาม การ์ดเหล่านี้ไม่จำเป็นต้องได้รับการดำเนินการทันทีเหมือนการ์ดสด และผู้ใช้สามารถเลือกที่จะอ่านหรือดำเนินการกับการ์ด ได้ตามสะดวก

เมื่อ Glassware แทรกการ์ดแบบคงที่ลงในไทม์ไลน์ Glass อาจเล่นเสียงแจ้งเตือน เพื่อแจ้งให้ผู้ใช้ทราบ การ์ดแบบคงที่ก่อนหน้าทั้งหมดจะเลื่อนไปทางขวา และหายไปจากไทม์ไลน์หลังจากผ่านไป 7 วันหรือเมื่อมีการ์ดใหม่กว่า 200 ใบ
ควรใช้ในกรณีใด
การ์ดแบบคงที่เหมาะสําหรับการแสดงการแจ้งเตือนเป็นระยะ
แก่ผู้ใช้เมื่อมีสิ่งสําคัญเกิดขึ้น
เช่น บริการส่งข่าวที่
ส่งเรื่องราวข่าวเด่นเมื่อเกิดขึ้น การ์ดแบบคงที่ของ Mirror API
ยังสามารถเริ่มการ์ดแบบสดหรือ
การแช่ผ่าน
OPEN_URI
รายการเมนูได้ด้วย ซึ่งจะช่วยให้คุณสร้างการโต้ตอบแบบไฮบริดที่ใช้การ์ดแบบคงที่เป็นการแจ้งเตือนและการ์ดแบบสดหรือการแช่เพื่อประสบการณ์การโต้ตอบที่ดียิ่งขึ้น
ดูรายการการดำเนินการทั้งหมดที่อาจใช้ได้กับรายการไทม์ไลน์ได้ในเอกสารอ้างอิง
การแทรกการ์ดคงที่
หากต้องการแทรกการ์ดแบบคงที่ (รายการไทม์ไลน์) ให้ POST การแสดงรายการไทม์ไลน์ในรูปแบบ JSON ไปยังปลายทาง REST
ช่องส่วนใหญ่ในรายการไทม์ไลน์เป็นช่องที่ไม่บังคับ ในรูปแบบที่ง่ายที่สุด รายการไทม์ไลน์จะมีเพียงข้อความสั้นๆ เช่น ในตัวอย่างนี้
HTTP ดิบ
POST /mirror/v1/timeline HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer {auth token}
Content-Type: application/json
Content-Length: 26
{ "text": "Hello world" }
Java
TimelineItem timelineItem = new TimelineItem();
timelineItem.setText("Hello world");
service.timeline().insert(timelineItem).execute();
Python
timeline_item = {'text': 'Hello world'}
service.timeline().insert(body=timeline_item).execute()
เมื่อสำเร็จ คุณจะได้รับโค้ดตอบกลับ 201 Created พร้อมสำเนาแบบเต็มของรายการที่สร้างขึ้น
สำหรับตัวอย่างก่อนหน้า คำตอบที่สำเร็จ
อาจมีลักษณะดังนี้
HTTP ดิบ
HTTP/1.1 201 Created
Date: Tue, 25 Sep 2012 23:30:11 GMT
Content-Type: application/json
Content-Length: 303
{
"kind": "glass#timelineItem",
"id": "1234567890",
"selfLink": "https://www.googleapis.com/mirror/v1/timeline/1234567890",
"created": "2012-09-25T23:28:43.192Z",
"updated": "2012-09-25T23:28:43.192Z",
"etag": "\"G5BI0RWvj-0jWdBrdWrPZV7xPKw/t25selcGS3uDEVT6FB09hAG-QQ\"",
"text": "Hello world"
}
รายการที่แทรกซึ่งจะปรากฏในไทม์ไลน์ของผู้ใช้จะมีลักษณะดังนี้

การแทรกรายการไทม์ไลน์พร้อมไฟล์แนบ
ภาพหนึ่งภาพแทนคำพูดได้นับพัน ซึ่งมากกว่าที่คุณจะใส่ลงใน รายการไทม์ไลน์ได้ ด้วยเหตุนี้ คุณจึงแนบรูปภาพและวิดีโอ ไปยังรายการไทม์ไลน์ได้ด้วย ตัวอย่างวิธีแทรกรายการไทม์ไลน์ที่มี ไฟล์แนบรูปภาพมีดังนี้
HTTP ดิบ
POST /upload/mirror/v1/timeline HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer {auth token}
Content-Type: multipart/related; boundary="mymultipartboundary"
Content-Length: {length}
--mymultipartboundary
Content-Type: application/json; charset=UTF-8
{ "text": "A solar eclipse of Saturn. Earth is also in this photo. Can you find it?" }
--mymultipartboundary
Content-Type: image/jpeg
Content-Transfer-Encoding: binary
[binary image data]
--mymultipartboundary--
Java
TimelineItem timelineItem = new TimelineItem();
timelineItem.setText("Hello world");
InputStreamContent mediaContent = new InputStreamContent(contentType, attachment);
service.timeline().insert(timelineItem, mediaContent).execute();
Python
timeline_item = {'text': 'Hello world'}
media_body = MediaIoBaseUpload(
io.BytesIO(attachment), mimetype=content_type, resumable=True)
service.timeline().insert(body=timeline_item, media_body=media_body).execute()
รายการในไทม์ไลน์ที่มีรูปภาพแนบจะมีลักษณะดังนี้ใน Glass

แนบวิดีโอ
หากคุณแนบไฟล์วิดีโอไปกับรายการไทม์ไลน์ เราขอแนะนำให้คุณสตรีมวิดีโอแทนการอัปโหลดเพย์โหลดทั้งหมดในครั้งเดียว Google Mirror API รองรับการสตรีมด้วย HTTP Live Streaming, การดาวน์โหลดแบบ Progressive และโปรโตคอลการสตรีมแบบเรียลไทม์ (RTSP) ไฟร์วอลล์มักจะบล็อก RTSP ดังนั้นให้ใช้ตัวเลือกอื่นๆ เมื่อเป็นไปได้
หากต้องการสตรีมวิดีโอ ให้ใช้PLAY_VIDEO
รายการเมนูในตัวและระบุ URL ของวิดีโอให้เป็นpayloadของรายการเมนู ดูข้อมูลเพิ่มเติมได้ที่
การเพิ่มรายการในเมนูที่มีอยู่แล้วและ
รูปแบบสื่อที่รองรับ
การแบ่งหน้า
คุณสามารถแบ่งหน้าไทม์ไลน์สำหรับรายการที่ไม่พอดีกับการ์ดไทม์ไลน์เดียว
แต่ควรเชื่อมโยงกับการ์ดเดียวกัน รายการที่มีการแบ่งหน้า
ทั้งหมดใช้ timeline.id เดียวกัน จึงมี
ชุดรายการเมนูเดียวกัน เมื่อผู้ใช้แตะรายการไทม์ไลน์แบบแบ่งหน้า เมนู
อ่านเพิ่มเติมจะปรากฏขึ้น
Glass จะแบ่งหน้าไทม์ไลน์โดยอัตโนมัติสำหรับรายการที่แสดง text หากต้องการให้ Glass แบ่งหน้าhtmlโดยอัตโนมัติ ให้ใช้แท็ก article โดยตั้งค่าพร็อพเพอร์ตี้คลาสเป็น auto-paginate ดังตัวอย่างต่อไปนี้
<article class="auto-paginate">
<h3>Very long list</h3>
<ul>
<li>First item</li>
<li>Second item</li>
<li>Third item</li>
<li>Fourth item</li>
<li>Fifth item</li>
<li>Sixth item</li>
<li>...</li>
</ul>
<article>
หากต้องการแบ่งหน้าด้วยตนเอง ให้ใช้แท็ก article สำหรับเนื้อหา
ที่ต้องการแสดงในการ์ดแต่ละใบ Glass จะแสดงเนื้อหาของแท็ก
articleแต่ละแท็กในการ์ดไทม์ไลน์ย่อยแยกต่างหาก เช่น คุณสร้าง
รายการไทม์ไลน์แบบแบ่งหน้าด้วย HTML ต่อไปนี้ได้
<article>
<section>
<p>First page</p>
</section>
</article>
<article>
<section>
<p>Second page</p>
</section>
</article>
<article>
<section>
<p>Third page</p>
</section>
</article>
โดยค่าเริ่มต้น การ์ดแรกของรายการไทม์ไลน์แบบแบ่งหน้าจะแสดงเป็น
การ์ดหน้าปก และจะแสดงอีกครั้งเมื่อผู้ใช้เลือกรายการในเมนูอ่านเพิ่มเติม
หากต้องการไม่ให้การ์ดแรกปรากฏอีกหลังจากแตะอ่านเพิ่มเติม คุณสามารถระบุคลาส CSS สำหรับแท็ก
<article>แรกได้ดังนี้cover-only
<article class="cover-only">
...
cover-only คลาสยังรองรับรายการไทม์ไลน์ที่แบ่งหน้าอัตโนมัติด้วย
<article class="auto-paginate cover-only">
...
การรวมกลุ่ม
การจัดกลุ่มช่วยให้คุณจัดกลุ่มรายการที่เกี่ยวข้องแต่แตกต่างกันไว้ด้วยกันได้ เช่น ข้อความแต่ละรายการในชุดข้อความอีเมล แพ็กเกจมีปกหลักที่ผู้ใช้แตะเพื่อแสดงไทม์ไลน์ย่อยซึ่งมีการ์ดอื่นๆ ในแพ็กเกจ ระบบจะแยกแยะบันเดิลจากการ์ดไทม์ไลน์ปกติด้วยรอยพับที่มุมบนขวาของการ์ดหน้าปกของบันเดิล
หากต้องการจัดกลุ่มรายการไทม์ไลน์ ให้สร้างรายการโดยใช้ค่าเดียวกันสำหรับ
bundleId รายการที่เพิ่มล่าสุด
คือการ์ดปกของแพ็กเกจ
รูปภาพต่อไปนี้แสดงการ์ดปกของแพ็กเกจ ที่มีรอยพับมุมที่มุมขวาบนและการ์ดที่รวมแพ็กเกจ 2 ใบอยู่ด้านล่าง


รายการในไทม์ไลน์การอ่าน
บริการของคุณจะเข้าถึงรายการไทม์ไลน์ทั้งหมดที่สร้างขึ้น และรายการไทม์ไลน์ทั้งหมดที่แชร์กับบริการได้ วิธีแสดงรายการไทม์ไลน์ที่บริการของคุณมองเห็นมีดังนี้
HTTP ดิบ
GET /mirror/v1/timeline HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer {auth token}
Java
TimelineItem timelineItem = new TimelineItem();
service.timeline().list().execute();
Python
service.timeline().list().execute()
คุณสามารถใช้การดำเนินการ REST อื่นๆ เพื่อรับ อัปเดตและ ลบรายการไทม์ไลน์ได้
การเข้าถึงไฟล์แนบ
คุณเข้าถึงไฟล์แนบของรายการไทม์ไลน์ได้ผ่าน
พร็อพเพอร์ตี้อาร์เรย์ที่ชื่อ attachments
จากนั้นคุณจะได้รับข้อมูลไบนารีของไฟล์แนบผ่านพร็อพเพอร์ตี้
contentUrl
ของไฟล์แนบหรือด้วย
ปลายทางของไฟล์แนบ
HTTP ดิบ
GET /mirror/v1/timeline/{itemId}/attachments/{attachmentId} HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer {auth token}
Java
TimelineItem item = service.timeline().get(itemId).execute();
String attachmentId = item.getAttachments().get(0).getId();
service.attachments().get(itemId, attachmentId).executeAsInputStream();
การสร้างรายการในเมนู
รายการเมนูช่วยให้ผู้ใช้ขอการดำเนินการที่เกี่ยวข้องกับการ์ดไทม์ไลน์ และมี 2 ประเภท ได้แก่ รายการเมนูในตัวและรายการเมนูที่กำหนดเอง
รายการเมนูในตัวช่วยให้เข้าถึงฟังก์ชันพิเศษที่ Glass มีให้ เช่น การอ่านการ์ดไทม์ไลน์ออกเสียง การไปยัง ตำแหน่ง การแชร์รูปภาพ หรือการตอบกลับข้อความ

รายการเมนูที่กำหนดเองช่วยให้แอปพลิเคชันแสดงลักษณะการทำงานที่เฉพาะเจาะจง สำหรับ Glassware ของคุณได้ และคุณยังระบุไอคอนรายการเมนูให้ตรงกับการสร้างแบรนด์ ได้ด้วย
การเพิ่มรายการในเมนูที่มีอยู่แล้ว
คุณเพิ่มรายการในเมนูที่มีอยู่แล้วลงในรายการไทม์ไลน์ได้โดยการป้อนข้อมูลใน
menuItems array เมื่อแทรกรายการ
หากต้องการใช้รายการเมนูในตัว คุณเพียงแค่ต้องป้อนข้อมูลaction ของแต่ละ menuItem
HTTP ดิบ
HTTP/1.1 201 Created
Date: Tue, 25 Sep 2012 23:30:11 GMT
Content-Type: application/json
Content-Length: 303
{
"text": "Hello world",
"menuItems": [
{
"action": "REPLY"
}
]
}
การกำหนดรายการในเมนูที่กำหนดเอง
หากรายการเมนูในตัวใช้งานไม่ได้ คุณสามารถสร้างรายการเมนูที่กำหนดเองพร้อมการดำเนินการของคุณเองได้โดยทำดังนี้เมื่อแทรกหรืออัปเดตรายการไทม์ไลน์
- ระบุ
CUSTOMสำหรับmenuItem.action - ระบุ
menuItem.idเมื่อผู้ใช้แตะรายการเมนูที่กำหนดเอง Glassware จะได้รับการแจ้งเตือนที่มีmenuItem.idซึ่งจะช่วยให้คุณระบุแหล่งที่มาของ การแจ้งเตือนได้ - ระบุ
menuItem.valuesเพื่อเพิ่มiconUrlและdisplayNameที่ปรากฏบน Glass ชี้ไปยังรูปภาพ PNG ขนาด 50 x 50 ที่มีสีขาวและพื้นหลังโปร่งใสสำหรับiconUrl ระบุ
displayTimeหากไม่ได้ระบุdisplayTimeรายการไทม์ไลน์ จะเลื่อนไปที่ด้านหน้าของไทม์ไลน์ทุกครั้งที่ผู้ใช้แตะรายการเมนูที่กำหนดเอง
HTTP ดิบ
HTTP/1.1 201 Created
Date: Tue, 25 Sep 2012 23:30:11 GMT
Content-Type: application/json
Content-Length: 303
{
"text": "Hello world",
"displayTime": "2013-08-08T22:47:31-07:00",
"menuItems": [
{
"action": "CUSTOM",
"id": "complete"
"values": [{
"displayName": "Complete",
"iconUrl": "http://example.com/icons/complete.png"
}]
}
]
}
อนุญาตให้ผู้ใช้ปักหมุดการ์ดไทม์ไลน์
คุณสามารถสร้างรายการเมนูที่ช่วยให้ผู้ใช้ปักหมุดการ์ดไทม์ไลน์ได้ ซึ่งจะแสดงการ์ดไทม์ไลน์ทางด้านซ้ายของการ์ดนาฬิกาหลักอย่างถาวร ผู้ใช้สามารถเลิกปักหมุดการ์ดได้ด้วยโดยใช้รายการเมนูเดียวกัน
รายการในเมนูการปักหมุดเป็นรายการในเมนูที่มีอยู่แล้ว ดังนั้นสิ่งที่คุณต้องทำคือระบุ TOGGLE_PINNED
action สำหรับ menuItem
HTTP ดิบ
HTTP/1.1 201 Created
Date: Tue, 25 Sep 2012 23:30:11 GMT
Content-Type: application/json
Content-Length: 303
{
"text": "You can pin or unpin this card.",
"menuItems": [
{
"action": "TOGGLE_PINNED"
}
...
]
}
การติดตาม
Mirror API ช่วยให้คุณสมัครรับการแจ้งเตือน ที่ส่งเมื่อผู้ใช้ดำเนินการที่เฉพาะเจาะจงในรายการไทม์ไลน์หรือเมื่อมีการอัปเดตตำแหน่งของผู้ใช้ เมื่อสมัครรับการแจ้งเตือน คุณจะต้อง ระบุ URL การเรียกกลับที่จะประมวลผลการแจ้งเตือน
การรับการแจ้งเตือน
ระบบจะส่งการแจ้งเตือนจาก Mirror API เป็นคำขอ POST ไปยัง ปลายทางที่สมัครรับข้อมูลซึ่งมีส่วนเนื้อหาของคำขอ JSON
HTTP ดิบ
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "UPDATE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "<TYPE>",
"payload": "<PAYLOAD>"
}
]
}
Java
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;
// ...
public class 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);
return null;
}
}
// ...
}
Python
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)
บริการของคุณต้องตอบกลับ API ด้วยรหัสสถานะ HTTP 200 OK หากไม่มีข้อผิดพลาดเกิดขึ้น
หากบริการตอบกลับด้วยรหัสข้อผิดพลาด Mirror API อาจพยายามส่งการแจ้งเตือนไปยังบริการของคุณอีกครั้ง
ประเภทการแจ้งเตือน
Mirror API จะส่งเพย์โหลดการแจ้งเตือนที่แตกต่างกันสำหรับเหตุการณ์ต่างๆ
ตอบ
ผู้ใช้ตอบกลับรายการไทม์ไลน์ของคุณโดยใช้REPLY
รายการในเมนูในตัว
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "INSERT",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "REPLY"
}
]
}
แอตทริบิวต์ itemId จะตั้งค่าเป็น ID ของสินค้าที่มีข้อมูลต่อไปนี้
inReplyToตั้งค่าแอตทริบิวต์เป็นIDของรายการไทม์ไลน์ที่แอตทริบิวต์นี้เป็น การตอบกลับtextตั้งค่าแอตทริบิวต์เป็นการถอดเสียงข้อความ- แอตทริบิวต์
recipientsตั้งค่าเป็นcreatorของรายการไทม์ไลน์ที่ เป็นคำตอบ หากมี
ตัวอย่าง
{
"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"
]
}
]
}
ลบ
ผู้ใช้ลบรายการไทม์ไลน์
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "DELETE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer",
"userActions": [
{
"type": "DELETE"
}
]
}
แอตทริบิวต์ itemId ถูกตั้งค่าเป็นรหัสของสินค้าที่ถูกลบ
รายการนี้จะไม่มีข้อมูลเมตาอื่นๆ นอกเหนือจากรหัสและพร็อพเพอร์ตี้ isDeleted
เลือกรายการเมนูที่กำหนดเองแล้ว
ผู้ใช้ได้เลือกรายการเมนูที่กำหนดเอง ซึ่งบริการของคุณตั้งค่าไว้
{
"collection": "timeline",
"itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
"operation": "UPDATE",
"userToken": "harold_penguin",
"userActions": [
{
"type": "CUSTOM",
"payload": "PING"
}
]
}
ระบบจะตั้งค่าแอตทริบิวต์ itemId เป็นรหัสของรายการเมนูที่ผู้ใช้เลือก
userActions อาร์เรย์ประกอบด้วยรายการการดำเนินการที่กำหนดเอง
ที่ผู้ใช้ทำกับรายการนี้ บริการของคุณควรจัดการการดำเนินการเหล่านั้นตามความเหมาะสม
การอัปเดตตำแหน่ง
ตำแหน่งใหม่พร้อมให้บริการสำหรับผู้ใช้ปัจจุบันแล้ว
{
"collection": "locations",
"itemId": "latest",
"operation": "UPDATE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer"
}
เมื่อ Glassware ได้รับการอัปเดตตำแหน่ง ให้ส่งคำขอไปยังปลายทาง glass.locations.get เพื่อดึงตำแหน่งล่าสุดที่ทราบ Glassware จะได้รับการอัปเดตตำแหน่งทุกๆ 10 นาที
คำสั่งเสียง
ผู้ใช้ได้เปิดใช้งานคำสั่งเสียง เช่น "Ok Glass, จดบันทึกว่า Cat Stream, วันเกิดของ Chipotle คือ พรุ่งนี้" ระบบจะส่งการแจ้งเตือนต่อไปนี้ไปยัง Glassware ของคุณ
{
"collection": "timeline",
"operation": "INSERT",
"userToken": "chipotle's_owner",
"verifyToken": "mew mew mew",
"itemId": "<ITEM_ID>",
"userActions": [
{“type”: "LAUNCH"}
]
}
การแจ้งเตือนนี้จะแตกต่างจากการแจ้งเตือนอื่นๆ ด้วยค่า LAUNCH
ในพร็อพเพอร์ตี้ userActions
จากนั้นคุณจะใช้ค่าใน itemId เพื่อดึงข้อมูลรายการไทม์ไลน์ได้
{
"id": "<ITEM_ID>",
"text": "Chipotle's birthday is tomorrow",
"recipients": [
{"id": "CAT_STREAM"}
]
}
พร็อพเพอร์ตี้ recipients มี id ของรายชื่อติดต่อที่แสดงถึง
คำสั่งเสียงที่ใช้