स्टैटिक कार्ड

आप REST API का इस्तेमाल करके, स्टैटिक कार्ड डाल सकते हैं, अपडेट कर सकते हैं, पढ़ सकते हैं, और उन्हें मिटा सकते हैं. इसके अलावा, आप किसी स्थिर कार्ड में ऑब्जेक्ट अटैच कर सकते हैं, जैसे कि जगह या मीडिया.

वे कैसे काम करते हैं

स्थैतिक कार्ड डिफ़ॉल्ट रूप से ग्लास घड़ी के दाईं ओर रहते हैं और डिलीवरी के समय उपयोगकर्ता के लिए प्रासंगिक जानकारी दिखाते हैं. हालांकि, इन कार्ड पर तुरंत ध्यान देने की ज़रूरत नहीं होती है, जैसे कि लाइव कार्ड. इनकी मदद से, उपयोगकर्ता अपने हिसाब से कार्ड पर कुछ पढ़ सकते हैं या कोई कार्रवाई कर सकते हैं.

जब Glassware समयावधि में स्थिर कार्ड डालता है, तो Glass उपयोगकर्ताओं को सूचना देने के लिए एक सूचना चला सकता है. पिछले सभी स्टैटिक कार्ड भी दाईं ओर शिफ़्ट हो जाते हैं और सात दिन बाद या 200 कार्ड नए होने पर गायब हो जाते हैं.

इनका इस्तेमाल कब करना चाहिए

स्टैटिक कार्ड की मदद से, उपयोगकर्ताओं को ज़रूरी सूचनाएं मिलने पर समय-समय पर सूचनाएं दी जा सकती हैं. उदाहरण के लिए, खबरें डिलीवर करने वाली कोई ऐसी सेवा जो दिन में मुख्य खबरें आपके घर पर भेजती है. मिरर एपीआई स्टैटिक कार्ड OPEN_URI मेन्यू आइटम की मदद से लाइव कार्ड या इमर्सिव भी शुरू कर सकते हैं. इससे, हाइब्रिड इंटरैक्शन करने में मदद मिलती है. इसमें ऐक्टिव कार्ड, सूचनाएं और लाइव कार्ड या इमर्सिव व्यू का इस्तेमाल करते हैं. इससे आपको इंटरैक्टिव अनुभव मिलता है.

समयावधि आइटम की संभावित कार्रवाइयों की पूरी सूची के लिए, दस्तावेज़ का दस्तावेज़ देखें.

स्टैटिक कार्ड डालना

स्टैटिक कार्ड (टाइमलाइन आइटम) शामिल करने के लिए, REST एंडपॉइंट पर टाइमलाइन आइटम की JSON प्रज़ेंटेशन पोस्ट करें.

टाइमलाइन आइटम के ज़्यादातर फ़ील्ड ज़रूरी नहीं होते हैं. सबसे आसान रूप में, टाइमलाइन आइटम में सिर्फ़ एक छोटा टेक्स्ट मैसेज होता है, जैसे कि इस उदाहरण में:

रॉ एचटीटीपी

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/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"
}

डाला गया आइटम, उपयोगकर्ता की टाइमलाइन में इस तरह दिखेगा:

अटैचमेंट के साथ टाइमलाइन आइटम शामिल करना

एक तस्वीर एक हज़ार शब्दों के बराबर होती है. यह आपके लिए तय समय सीमा में फ़िट हो सकने वाले आइटम से बहुत ज़्यादा अहम है. इसके लिए, टाइमलाइन आइटम में इमेज और वीडियो भी अटैच किए जा सकते हैं. यहां फ़ोटो अटैचमेंट वाले समयावधि आइटम को शामिल करने के तरीके का एक उदाहरण दिया गया है:

रॉ एचटीटीपी

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()

अटैच की गई इमेज वाला टाइमलाइन आइटम, कांच पर कुछ ऐसा दिखता है:

वीडियो अटैच किया जा रहा है

अगर आप अपने टाइमलाइन आइटम में वीडियो फ़ाइलें अटैच कर रहे हैं, तो हमारा सुझाव है कि आप पूरे पेलोड को एक साथ अपलोड करने के बजाय, वीडियो को स्ट्रीम करें. Google Mirror API, एचटीटीपी लाइव स्ट्रीमिंग, प्रोग्रेसिव डाउनलोड, और रीयल-टाइम स्ट्रीमिंग प्रोटोकॉल (आरटीएसपी) की सुविधा के साथ काम करता है. RTSP अक्सर फ़ायरवॉल से ब्लॉक होता है, इसलिए संभव होने पर दूसरे विकल्पों का इस्तेमाल करें.

वीडियो स्ट्रीम करने के लिए, PLAY_VIDEO पहले से मौजूद मेन्यू आइटम का इस्तेमाल करें. साथ ही, वीडियो के यूआरएल को मेन्यू आइटम का 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 टैग की सामग्री को एक अलग सब-टाइमलाइन कार्ड में दिखाता है. उदाहरण के लिए, आप नीचे दिए गए एचटीएमएल का इस्तेमाल करके, पेजों का क्रम तय करके, अलग-अलग पेज बना सकते हैं:

<article>
 <section>
   <p>First page</p>
 </section>
</article>

<article>
 <section>
   <p>Second page</p>
 </section>
</article>

<article>
 <section>
   <p>Third page</p>
 </section>
</article>

डिफ़ॉल्ट रूप से, पेज पर नंबर डालने वाले टाइमलाइन आइटम के पहले कार्ड को कवर कार्ड के रूप में दिखाया जाता है. जब उपयोगकर्ता और पढ़ें मेन्यू आइटम को चुनता है, तो इसे फिर से दिखाया जाता है. ज़्यादा पढ़ें पर टैप करने के बाद, पहले कार्ड को फिर से दिखने से रोकने के लिए, पहले <article> टैग के लिए cover-only सीएसएस क्लास तय किया जा सकता है:

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

cover-only क्लास में, पेजों को क्रम में लगाने वाले टाइमलाइन आइटम भी काम करते हैं:

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

बंडलिंग

बंडलिंग से आप संबंधित लेकिन अलग-अलग आइटम का एक साथ समूह बना सकते हैं, जैसे किसी ईमेल थ्रेड में मौजूद अलग-अलग संदेश. बंडल में एक मुख्य कवर कार्ड होता है, जिस पर टैप करके उपयोगकर्ता एक सब-टाइमलाइन दिखाता है. इसमें एक बंडल में दूसरे कार्ड शामिल होते हैं. बंडल को सामान्य टाइमलाइन कार्ड से बंडल के कवर कार्ड के ऊपरी दाएं कोने में कोने के फ़ोल्ड से अलग किया जाता है.

टाइमलाइन आइटम को बंडल करने के लिए, bundleId के लिए एक ही वैल्यू का इस्तेमाल करके आइटम बनाएं. बंडल में हाल ही में जोड़ा गया आइटम, कवर कार्ड होता है.

नीचे दी गई इमेज में एक बंडल कवर कार्ड दिखाया गया है, जिसमें ऊपरी कोने में कोने में फ़ोल्ड है और उसके नीचे दो बंडल किए गए कार्ड हैं.

टाइमलाइन आइटम पढ़ना

आपकी सेवा उन सभी टाइमलाइन आइटम को ऐक्सेस कर सकती है जो उसने बनाए थे और वे वे सभी समयावधि आइटम जिन्हें उसके साथ शेयर किया गया था. यहां आपकी सेवा के लिए दिखने वाले टाइमलाइन आइटम को सूची में डालने का तरीका बताया गया है.

रॉ एचटीटीपी

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 प्रॉपर्टी या अटैचमेंट एंडपॉइंट की मदद से, अटैचमेंट का बाइनरी डेटा पा सकते हैं.

रॉ एचटीटीपी

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();

मेन्यू में आइटम बनाना

मेन्यू आइटम की मदद से, उपयोगकर्ता टाइमलाइन कार्ड से जुड़ी कार्रवाइयों का अनुरोध कर सकते हैं. ये दो तरह के होते हैं: बिल्ट-इन मेन्यू आइटम और कस्टम मेन्यू आइटम.

पहले से मौजूद मेन्यू आइटम में, Glass की खास सुविधाओं का ऐक्सेस मिलता है. जैसे, टाइमलाइन कार्ड को ज़ोर से पढ़ना, किसी जगह पर नेविगेट करना, इमेज शेयर करना या किसी मैसेज का जवाब देना:

कस्टम मेन्यू आइटम आपके ऐप्लिकेशन को आपके ग्लासवेयर के लिए खास व्यवहार सामने लाने देते हैं और आप अपनी ब्रैंडिंग से मेल खाने के लिए मेन्यू आइटम आइकॉन भी दे सकते हैं.

पहले से मौजूद मेन्यू आइटम जोड़ना

टाइमलाइन मेन्यू में पहले से मौजूद मेन्यू आइटम जोड़ने के लिए, menuItems array शामिल करें. पहले से मौजूद मेन्यू आइटम का इस्तेमाल करने के लिए, आपको हर menuItem में से सिर्फ़ action को पॉप्युलेट करना होगा.

रॉ एचटीटीपी

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"
    }
  ]
}

कस्टम मेन्यू आइटम के बारे में जानकारी देना

अगर पहले से मौजूद मेन्यू आइटम आपके लिए काम नहीं करते हैं, तो टाइमलाइन आइटम को शामिल या अपडेट करते समय, आप नीचे दिए गए काम करके अपनी पसंद की मेन्यू आइटम बना सकते हैं:

  • menuItem.action के लिए CUSTOM बताएं.
  • menuItem.id के बारे में बताएं. जब उपयोगकर्ता अपनी पसंद के मुताबिक बनाए गए मेन्यू आइटम पर टैप करते हैं, तो आपके Glassware को एक सूचना मिलती है. इसमें, menuItem.id से जानकारी भरी जाएगी. इससे आपको सूचना का स्रोत तय करने में मदद मिलती है.
  • Glass पर दिखाई देने वाला iconUrl और displayName जोड़ने के लिए, menuItem.values तय करें. iconUrl के लिए, पारदर्शी बैकग्राउंड वाली 50 x 50 PNG इमेज की ओर पॉइंट करें.
  • displayTime के बारे में बताएं. अगर आप displayTime नहीं बताते हैं, तो टाइमलाइन आइटम जब भी उपयोगकर्ता कस्टम मेन्यू आइटम पर टैप करते हैं, यह टाइमलाइन के सामने चला जाता है.

रॉ एचटीटीपी

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"
      }]
    }
  ]
}

उपयोगकर्ताओं को आपका टाइमलाइन कार्ड पिन करने की अनुमति देना

आप एक ऐसा मेन्यू आइटम बना सकते हैं जो आपके उपयोगकर्ताओं को टाइमलाइन कार्ड को पिन करने देता है. यह कार्ड को मुख्य घड़ी के बाईं ओर टाइमलाइन कार्ड को हमेशा के लिए दिखाता है. उपयोगकर्ता उसी मेन्यू आइटम का इस्तेमाल करके कार्ड को अनपिन भी कर सकते हैं.

पिन करने वाला मेन्यू आइटम, पहले से मौजूद मेन्यू आइटम है. इसलिए, आपको menuItem के लिए TOGGLE_PINNED action देना होगा.

रॉ एचटीटीपी

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 से सूचना, POST अनुरोध के तौर पर भेजी जाती है. यह सदस्यता, एंडपॉइंट के उस अनुरोध पर भेजी जाती है जिसकी सदस्यता JSON है.

रॉ एचटीटीपी

{
  "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)

अगर कोई गड़बड़ी नहीं होती है, तो आपकी सेवा को एपीआई को 200 OK एचटीटीपी स्टेटस कोड के साथ जवाब देना चाहिए. अगर आपकी सेवा में गड़बड़ी कोड के साथ जवाब दिया जाता है, तो हो सकता है कि 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 को हर दस मिनट में स्थान अपडेट मिलते हैं.

बोला गया निर्देश

आपके उपयोगकर्ता ने बोले गए निर्देश को चालू किया है, उदाहरण के लिए: "Ok Glass, बिल्ली स्ट्रीम करो, बिल्ली की स्ट्रीम, चिपोटल का जन्मदिन कल है". यह सूचना आपके Glassware को भेजी जाती है:

{
  "collection": "timeline",
  "operation": "INSERT",
  "userToken": "chipotle's_owner",
  "verifyToken": "mew mew mew",
  "itemId": "<ITEM_ID>",
  "userActions": [
    {“type”: "LAUNCH"}
  ]
}

यह सूचना, userActions प्रॉपर्टी में मौजूद LAUNCH वैल्यू के हिसाब से दूसरी सूचनाओं से अलग होती है.

इसके बाद, टाइमलाइन आइटम फ़ेच करने के लिए, itemId में वैल्यू का इस्तेमाल किया जा सकता है:

{
  "id": "<ITEM_ID>",
  "text": "Chipotle's birthday is tomorrow",
  "recipients": [
    {"id": "CAT_STREAM"}
  ]
}

recipients प्रॉपर्टी में, उस संपर्क का id शामिल होता है जो बोलकर दिए गए निर्देश के बारे में बताता है.