การ์ดคงที่

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

วิธีการทำงาน

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

เมื่อ Glassware ใส่การ์ดแบบคงที่ลงในไทม์ไลน์ Glass อาจเล่นการแจ้งเตือน เพื่อแจ้งเตือนผู้ใช้ การ์ดภาพนิ่งทั้งหมดก่อนหน้าจะเลื่อนไปทางขวาด้วย และจะหายไปจากไทม์ไลน์หลังผ่านไป 7 วัน หรือเมื่อมีการ์ด 200 ใบที่ใหม่กว่า

ควรใช้ในกรณีใด

การ์ดภาพนิ่งเหมาะสำหรับการแสดงโฆษณา การแจ้งเตือนตามกำหนดเวลา แก่ผู้ใช้เมื่อสิ่งสำคัญเกิดขึ้น ตัวอย่างเช่น บริการส่งข่าว ส่งเรื่องราวข่าวเด่นทันทีที่เกิดข่าว การ์ดแบบคงที่ของ API มิเรอร์ สามารถเริ่มใช้การ์ดสด หรือ ดื่มด่ำกับ OPEN_URI รายการในเมนู คุณจึงสร้างการโต้ตอบแบบผสมที่ใช้ การ์ดแบบคงที่เป็นการแจ้งเตือนและการ์ดแบบสดหรือการดื่มด่ำกับ ประสบการณ์ที่มีการโต้ตอบมากขึ้น

สำหรับรายการการดำเนินการที่เป็นไปได้ทั้งหมดสำหรับไทม์ไลน์ โปรดดูที่ข้อมูลอ้างอิง เอกสารประกอบ

การแทรกการ์ดแบบคงที่

หากต้องการแทรกการ์ดแบบคงที่ (รายการไทม์ไลน์) ให้โพสต์ การแสดง 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 การดาวน์โหลดแบบโพรเกรสซีฟ และโปรโตคอลสตรีมมิงแบบเรียลไทม์ (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 cover-only สำหรับ แท็ก <article>:

<article class="cover-only">
...

คลาส cover-only ยังรองรับรายการในไทม์ไลน์ที่ใส่เลขหน้าโดยอัตโนมัติอีกด้วย ดังนี้

<article class="auto-paginate cover-only">
...

การรวมกลุ่มอีเมล

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

หากต้องการจัดกลุ่มรายการในไทม์ไลน์ ให้สร้างรายการดังกล่าวด้วยค่าเดียวกันสำหรับ bundleId เพิ่มล่าสุด คือการ์ดหน้าปกของแพ็กเกจ

ภาพต่อไปนี้แสดงแพ็กเกจ การ์ดปกที่มีพับมุมที่มุมขวาบนและพ่วงสองใบ ที่อยู่ด้านล่าง

กำลังอ่านรายการในไทม์ไลน์

บริการของคุณสามารถเข้าถึงรายการไทม์ไลน์ทั้งหมดที่บริการนั้นสร้างขึ้น รวมถึงไทม์ไลน์ทั้งหมด รายการที่มีการใช้ร่วมกับรายการนี้ วิธีการมีดังนี้ ระบุรายการในไทม์ไลน์ที่ ซึ่งบริการของคุณจะเห็นได้

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 เช่น การอ่านออกเสียงการ์ดไทม์ไลน์ การไปยัง ตำแหน่ง การแชร์รูปภาพ หรือการตอบกลับข้อความ ให้ทำดังนี้

รายการเมนูที่กำหนดเองช่วยให้แอปพลิเคชันแสดงลักษณะการทำงานที่เจาะจง กับเครื่องแก้ว และคุณยังสามารถแสดงไอคอนเมนูให้ตรงกับ การแสดงแบรนด์

กำลังเพิ่มรายการในเมนูในตัว

คุณสามารถเพิ่มรายการในเมนูในตัวไปยังรายการในไทม์ไลน์ได้โดยการป้อนข้อมูล 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 ปลายทางเพื่อเรียกข้อมูลตำแหน่งล่าสุดที่ทราบ เครื่องแก้วของคุณ รับการอัปเดตตำแหน่งทุก 10 นาที

คำสั่งเสียง

ผู้ใช้เปิดใช้งานคำสั่งเสียง เช่น "Ok Glass จดโน้ตนะ Cat Stream วันเกิดของ Chipotle นะ พรุ่งนี้" เราได้ส่งการแจ้งเตือนต่อไปนี้ไปยัง เครื่องแก้ว:

{
  "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 ของรายชื่อติดต่อที่แสดงถึง ใช้คำสั่งเสียง