Statik Kartlar

Basit REST API'leri kullanarak statik kartları ekleyebilir, güncelleyebilir, okuyabilir ve silebilirsiniz. Ayrıca, statik bir karta konum veya medya gibi nesneler ekleyebilirsiniz.

İşleyiş şekli

Statik kartlar, varsayılan olarak Glass saatinin sağında yer alır ve teslimat sırasında kullanıcıyla ilgili bilgileri gösterir. Ancak bu kartlar, canlı kartlar gibi hemen ilgilenmeniz gerekmez. Kullanıcılar isterlerse karttaki içerikleri okumayı veya kartta işlem yapmayı tercih edebilirler.

Glassware zaman çizelgesine statik kartlar eklediğinde Glass, kullanıcıları uyarmak için bir bildirim sesi çalabilir. Önceki tüm statik kartlar da sağa geçer ve 7 gün sonra veya 200 kart daha yeni olduğunda zaman çizelgesinden kaybolur.

Ne zaman kullanılır?

Statik kartlar, önemli şeyler meydana geldikçe kullanıcılara düzenli aralıklarla bildirimler göndermek için idealdir. Örneğin, en çok okunan haberleri anında gönderen bir haber teslimat hizmeti bu kapsama girer. Mirror API statik kartları, OPEN_URI menü öğesi üzerinden canlı kartlar veya Yoğun İçerikler başlatılabilir. Bu sayede, statik kartlardan hem bildirim olarak hem de canlı kart veya sürükleyicilik kullanarak daha etkileşimli bir deneyim sunan karma etkileşimler oluşturabilirsiniz.

Zaman çizelgesi öğeleriyle ilgili olası işlemlerin tam listesi için referans belgelerine bakın.

Statik kart ekleme

Statik kartlar (zaman çizelgesi öğeleri) eklemek için REST uç noktasına bir zaman çizelgesi öğesinin JSON gösterimi POST yapın.

Zaman çizelgesi öğesindeki alanların çoğu isteğe bağlıdır. En basit biçimiyle, bir zaman çizelgesi öğesi aşağıdaki örnekte olduğu gibi yalnızca kısa bir kısa mesaj içerir:

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

Başarılı olursa, oluşturulan öğenin tam kopyasını içeren bir 201 Created yanıt kodu alırsınız. Yukarıdaki örnek için başarılı bir yanıt şöyle görünebilir:

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

Kullanıcının zaman çizelgesinde görünecek olan eklenen öğe aşağıdaki gibi görünür:

Ek içeren bir zaman çizelgesi öğesi ekleme

Bir resim bin kelimeye bedeldir. Bu da bir zaman çizelgesi öğesine sığdırabileceğinizden çok daha fazladır. Bu doğrultuda, bir zaman çizelgesi öğesine resim ve video da ekleyebilirsiniz. Fotoğraf eki olan bir zaman çizelgesi öğesinin nasıl ekleneceğine dair örneği aşağıda bulabilirsiniz:

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

Resim ekli bir zaman çizelgesi öğesi, Glass'ta şuna benzer:

Video ekleniyor

Zaman çizelgesi öğelerinize video dosyaları ekliyorsanız tüm yükü tek seferde yüklemek yerine videoyu canlı oynatmanızı öneririz. Google Mirror API; HTTP canlı yayın, progresif indirme ve gerçek zamanlı akış protokolü (RTSP) ile yayını destekler. RTSP, güvenlik duvarları tarafından sıklıkla engellendiğinden mümkün olduğunda diğer seçenekleri kullanın.

Video akışı gerçekleştirmek için PLAY_VIDEO yerleşik menü öğesini kullanın ve videonun URL'sini menü öğesinin payload olarak belirtin. Daha fazla bilgi için Yerleşik menü öğeleri ekleme ve desteklenen medya biçimleri bölümlerine bakın.

Sayfalara ayırma

Tek bir zaman çizelgesi kartına uymayan ancak aynı kartla ilişkilendirilmesi gereken zaman çizelgesi öğelerini sayfalara ayırabilirsiniz. Sayfalara ayrılmış öğelerin tümü aynı timeline.id değerini paylaşır ve bu nedenle aynı menü öğelerine sahiptir. Kullanıcı, sayfalara ayrılmış bir zaman çizelgesi öğesine dokunduğunda Devamı menü öğesi görünür.

Glass, text görüntüleyen zaman çizelgesi öğelerini otomatik olarak sayfalara ayırır. Glass'ın html sayfasını otomatik olarak sayfalandırmasını sağlamak için article etiketini aşağıdaki örnekte gösterildiği gibi sınıf özelliği auto-paginate değerine ayarlanmış şekilde kullanın:

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

Manuel olarak sayfalandırmak için her kartta görüntülemek istediğiniz içeriğin article etiketini kullanın. Glass, her bir article etiketinin içeriğini ayrı bir alt zaman çizelgesi kartında görüntüler. Örneğin, aşağıdaki HTML ile sayfalara ayrılmış bir zaman çizelgesi öğesi oluşturabilirsiniz:

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

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

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

Varsayılan olarak, sayfalara ayrılmış zaman çizelgesi öğesinin ilk kartı kapak kartı olarak gösterilir ve kullanıcı Devamı menü öğesini seçtiğinde tekrar gösterilir. Devamı'na dokunduktan sonra ilk kartın tekrar görünmesini önlemek amacıyla, ilk <article> etiketi için cover-only CSS sınıfını belirtebilirsiniz:

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

cover-only sınıfı, otomatik sayfalandırılmış zaman çizelgesi öğelerini de destekler:

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

Paket

Gruplandırma, alakalı ancak farklı öğeleri (örneğin, bir e-posta ileti dizisindeki tek tek iletiler için) gruplandırmanıza olanak tanır. Paketlerde, kullanıcının paketteki diğer kartları içeren bir alt zaman çizelgesi görüntülemek için dokunduğu bir ana kapak kartı bulunur. Paketler, normal zaman çizelgesi kartlarından, paketin kapak kartının sağ üst köşesinde köşeye katlanarak ayrılır.

Zaman çizelgesi öğelerini gruplandırmak için bunları bundleId için aynı değerle oluşturun. En son eklenen öğe paketin kapak kartıdır.

Aşağıdaki resimlerde, sağ üst köşede köşeye katlanmış bir paket kılıfı ve altında iki adet gruplandırılmış kart gösterilmektedir.

Zaman çizelgesi öğeleri okunuyor

Hizmetiniz, oluşturduğu tüm zaman çizelgesi öğelerine ve onunla paylaşılan tüm zaman çizelgesi öğelerine erişebilir. Hizmetiniz tarafından görülebilen zaman çizelgesi öğelerini nasıl listeleyeceğinizi buradan öğrenebilirsiniz.

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

Zaman çizelgesi öğelerini almak, güncellemek ve silmek için diğer REST işlemlerini kullanabilirsiniz.

Eklere erişme

Zaman çizelgesi öğesinin eklerine, attachments adlı bir dizi özelliği üzerinden erişebilirsiniz. Daha sonra, bir ekin ikili verilerini ekin contentUrl özelliği veya ek uç noktası aracılığıyla alabilirsiniz.

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

Menü öğeleri oluşturma

Menü öğeleri, kullanıcıların zaman çizelgesi kartıyla ilgili işlemler istemesine olanak tanır. Bu öğeler iki türde sunulur: yerleşik menü öğeleri ve özel menü öğeleri.

Yerleşik menü öğeleri, zaman çizelgesi kartını sesli okuma, bir konuma gitme, resim paylaşma veya bir mesajı yanıtlama gibi Glass tarafından sağlanan özel işlevlere erişim sağlar:

Özel menü öğeleri, uygulamanızın Glassware'inize özgü davranışı göstermesine olanak tanır. Ayrıca, markanızla uyumlu bir menü öğesi simgesi de sağlayabilirsiniz.

Yerleşik menü öğeleri ekleme

Zaman çizelgesi öğelerinize yerleşik menü öğeleri eklemek için bunları eklerken menuItems array alanını doldurabilirsiniz. Yerleşik bir menü öğesini kullanmak için yalnızca her bir menuItem öğesinin action öğesini doldurmanız gerekir.

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

Özel menü öğelerini tanımlama

Yerleşik menü öğeleri işinize yaramıyorsa zaman çizelgesi öğesi eklerken veya güncellerken aşağıdakileri yaparak kendi işlemlerinizle özel menü öğeleri oluşturabilirsiniz:

  • menuItem.action için CUSTOM değerini belirtin.
  • menuItem.id belirtin. Kullanıcılar özel menü öğesine dokunduğunda Glassware'iniz menuItem.id alanının doldurulduğu bir bildirim alır. Bu sayede bildirimin kaynağını belirleyebilirsiniz.
  • Glass'ta görünen bir iconUrl ve displayName eklemek için menuItem.values değerini belirtin. iconUrl için şeffaf bir arka plana sahip beyaz renkli bir 50 x 50 PNG resminin üzerine gelin.
  • displayTime belirtin. Bir displayTime belirtmezseniz kullanıcılar özel menü öğesine her dokunduğunda zaman çizelgesi öğesi zaman çizelgesinin önüne taşınır.

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

Kullanıcıların zaman çizelgesi kartınızı sabitlemesine izin verme

Kullanıcılarınızın zaman çizelgesi kartını sabitlemesini sağlayan bir menü öğesi oluşturabilirsiniz. Bu kart, zaman çizelgesi kartını kalıcı olarak ana saat kartının solunda görüntüler. Kullanıcılar aynı menü öğesini kullanarak kartın sabitlemesini de kaldırabilir.

Sabitleme menüsü öğesi yerleşik bir menü öğesi olduğundan, menuItem için TOGGLE_PINNED action sağlamanız yeterlidir.

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

Abonelikler

Mirror API, kullanıcı bir Zaman Çizelgesi Öğesi'nde belirli işlemler gerçekleştirdiğinde veya kullanıcı konumu güncellendiğinde gönderilen bildirimlere abone olmanıza olanak tanır. Bir bildirime abone olduğunuzda, bildirimi işleyen bir geri çağırma URL'si sağlarsınız.

Bildirim alma

Mirror API'den, JSON istek gövdesi içeren abone olunan uç noktaya POST isteği olarak bir bildirim gönderilir.

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

Hata oluşmadıysa hizmetiniz 200 OK HTTP durum koduyla API'ye yanıt vermelidir. Hizmetiniz bir hata koduyla yanıt verirse Mirror API, bildirimi hizmetinize yeniden göndermeyi deneyebilir.

Bildirim türleri

Mirror API, farklı etkinlikler için farklı bir bildirim yükü gönderir.

Yanıtla

Kullanıcı, yerleşik REPLY menü öğesini kullanarak zaman çizelgesi öğenize yanıt verdi:

{
  "collection": "timeline",
  "itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
  "operation": "INSERT",
  "userToken": "harold_penguin",
  "verifyToken": "random_hash_to_verify_referer",
  "userActions": [
    {
      "type": "REPLY"
    }
  ]
}

itemId özelliği, aşağıdakileri içeren öğenin ID değerine ayarlanır:

  • inReplyTo özelliği, yanıt olduğu zaman çizelgesi öğesinin ID değerine ayarlandı.
  • text özelliği, metin transkriptine ayarlandı.
  • recipients özelliği, yanıtlandığı zaman çizelgesi öğesinin (varsa) creator değerine ayarlanır.

Örnek:

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

Sil

Kullanıcı bir zaman çizelgesi öğesini sildi:

{
  "collection": "timeline",
  "itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
  "operation": "DELETE",
  "userToken": "harold_penguin",
  "verifyToken": "random_hash_to_verify_referer",
  "userActions": [
    {
      "type": "DELETE"
    }
  ]
}

itemId özelliği, silinen öğenin kimliğine ayarlanır. Öğe artık kimliği ve isDeleted özelliği dışında meta veri içermiyor.

Özel menü öğesi seçildi

Kullanıcı, hizmetiniz tarafından ayarlanan bir özel menü öğesi seçmiştir:

{
  "collection": "timeline",
  "itemId": "3hidvm0xez6r8_dacdb3103b8b604_h8rpllg",
  "operation": "UPDATE",
  "userToken": "harold_penguin",
  "userActions": [
    {
      "type": "CUSTOM",
      "payload": "PING"
    }
  ]
}

itemId özelliği, kullanıcının seçtiği menü öğesinin kimliğine ayarlanır.

userActions dizisi, kullanıcının bu öğe üzerinde gerçekleştirdiği özel işlemlerin listesini içerir. Hizmetiniz bu işlemleri uygun şekilde yapmalıdır.

Konum güncellemesi

Geçerli kullanıcı için yeni bir konum mevcut:

{
  "collection": "locations",
  "itemId": "latest",
  "operation": "UPDATE",
  "userToken": "harold_penguin",
  "verifyToken": "random_hash_to_verify_referer"
}

Glassware'iniz bir konum güncellemesi aldığında, bilinen en son konumu almak için glass.locations.get uç noktasına bir istek gönderin. Glassware'iniz her on dakikada bir konum güncellemelerini alır.

Sesli komut

Kullanıcınız bir sesli komutu etkinleştirdi. Örneğin: "Ok Glass, not al, Kedi Akışı, Chipotle'ın doğum günü yarın". Glassware'inize aşağıdaki bildirim gönderilir:

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

Bu bildirim, userActions mülkündeki LAUNCH değeriyle diğer bildirimlerden ayrılır.

Ardından zaman çizelgesi öğesini getirmek için itemId içindeki değeri kullanabilirsiniz:

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

recipients özelliği, kullanılan sesli komutu temsil eden kişinin id bilgisini içerir.