Basit REST API'lerini kullanarak statik kartlar ekleyebilir, güncelleyebilir, okuyabilir ve silebilirsiniz. Ayrıca, statik bir karta konum veya medya gibi öğeler ekleyebilirsiniz.
İşleyiş şekli
Statik kartlar varsayılan olarak Glass saatinin sağında bulunur ve teslimat sırasında kullanıcıyla alakalı bilgileri gösterir. Ancak canlı kartlar gibi anında dikkat gerektirmez ve kullanıcılar kartı istedikleri zaman okuyabilir veya kartla ilgili işlem yapabilir.
Glassware zaman çizelgesine statik kartlar eklediğinde Glass, kullanıcıları uyarmak için bildirim sesi çalabilir. Önceki tüm statik kartlar da sağa kayar ve 7 gün sonra veya 200 kart daha yeni olduğunda zaman çizelgesinden kaybolur.
Ne zaman kullanılır?
Statik kartlar, önemli olaylar gerçekleştiğinde kullanıcılara düzenli bildirimler göndermek için idealdir.
Örneğin, en önemli haberleri olduğu anda yayınlayan bir haber yayını hizmeti. Mirror API statik kartları, OPEN_URI
menü öğesinden canlı kartlar veya immersive deneyimler de başlatabilir. Bu sayede, bildirimler için statik kartlar ve daha etkileşimli bir deneyim için canlı kart veya tam sayfa görüntüleme kullanan karma etkileşimler oluşturabilirsiniz.
Zaman çizelgesi öğeleriyle yapılabilecek işlemlerin tam listesi için referans dokümanlarına bakın.
Statik kart ekleme
Statik kartları (zaman çizelgesi öğeleri) eklemek için REST uç noktasına zaman çizelgesi öğesinin JSON temsilini POST yapın.
Zaman çizelgesi öğesindeki alanların çoğu isteğe bağlıdır. Zaman çizelgesi öğeleri, en basit haliyle yalnızca kısa bir metin mesajı içerir. Örneğin:
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()
İşlem başarılı olursa oluşturulan öğenin tam kopyasını içeren bir 201 Created
yanıt kodu alırsınız. Önceki örnekte başarılı bir yanıt şu şekilde 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 şekilde eklenen öğe şu şekilde görünür:
Ek içeren bir zaman çizelgesi öğesi ekleme
Bir resim binlerce kelimeye bedeldir. Bu da zaman çizelgesi öğesine sığdırabileceğinizden çok daha fazladır. Bu amaçla, zaman çizelgesi öğelerine resim ve video da ekleyebilirsiniz. Aşağıda, fotoğraf eki içeren bir zaman çizelgesi öğesinin nasıl ekleneceğine dair bir örnek verilmiştir:
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()
Ekli resim içeren bir zaman çizelgesi öğesi Glass'ta şöyle görünür:
Video ekleme
Zaman çizelgesi öğelerinize video dosyaları ekliyorsanız yükün tamamını bir kerede yüklemek yerine videoyu aktarmanızı öneririz. Google Mirror API, HTTP canlı yayını, aşamalı indirme ve gerçek zamanlı akış protokolü (RTSP) ile yayını destekler. RTSP genellikle güvenlik duvarları tarafından engellenir. Mümkün olduğunda diğer seçenekleri kullanın.
Video yayınlamak için yerleşik PLAY_VIDEO
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 başlıklı makaleleri inceleyin.
Sayfalara ayırma
Tek bir zaman çizelgesi kartına sığmayan ancak aynı kartla ilişkilendirilmesi gereken zaman çizelgesi öğelerini sayfalara ayırabilirsiniz. Sayfalandırılmış öğelerin tümü aynı timeline.id
öğesini paylaşır ve bu nedenle aynı menü öğelerine sahiptir. Kullanıcı sayfaya ayrılmış bir zaman çizelgesi öğesine dokunduğunda Daha fazla oku menü öğesi gösterilir.
Glass, text
görüntülenen zaman çizelgesi öğelerini otomatik olarak sayfalara ayırır. Glass'ın html
öğesini otomatik olarak sayfalara ayırmasını sağlamak için sınıf özelliği auto-paginate
olarak ayarlanmış article
etiketini aşağıdaki örnekte gösterildiği gibi 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>
Sayfaları manuel olarak bölmek için her kartta görüntülemek istediğiniz içerik için article
etiketini kullanın. Glass, her article
etiketinin içeriğini ayrı bir alt zaman çizelgesi kartında gösterir. Örneğin, aşağıdaki HTML ile sayfaya bölünmüş 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>
Sayfaya ayrılmış zaman çizelgesi öğesinin ilk kartı varsayılan olarak kapak kartı olarak gösterilir ve kullanıcı Daha fazla oku menü öğesini seçtiğinde tekrar gösterilir. Daha fazla bilgi'ye dokunduktan sonra ilk kartın tekrar görünmesini önlemek için ilk <article>
etiketi için cover-only
CSS sınıfını belirtebilirsiniz:
<article class="cover-only">
...
cover-only
sınıfı, otomatik olarak sayfaya bölünmüş zaman çizelgesi öğelerini de destekler:
<article class="auto-paginate cover-only">
...
Gruplandırma
Gruplandırma, ilgili ancak farklı öğeleri (ör. bir e-posta ileti dizisindeki ayrı iletiler) birlikte gruplandırmanıza olanak tanır. Paketlerin ana kapak kartı vardır. Kullanıcı, paketteki diğer kartları içeren bir alt zaman çizelgesi görüntülemek için bu karta dokunur. Paketler, paketin kapak kartının sağ üst köşesindeki köşe kıvrımı ile normal zaman çizelgesi kartlarından ayırt edilir.
Zaman çizelgesi öğelerini gruplandırmak için bundleId
için aynı değere sahip öğeler oluşturun. En son eklenen öğe paketin kapak kartıdır.
Aşağıdaki resimlerde, sağ üst köşesinde köşe kıvrımı olan bir paket kapak kartı ve altında iki paketlenmiş kart gösterilmektedir.
Zaman çizelgesi öğelerini okuma
Hizmetiniz, oluşturduğu tüm zaman çizelgesi öğelerine ve kendisiyle paylaşılan tüm zaman çizelgesi öğelerine erişebilir. Hizmetinize görünen zaman çizelgesi öğelerini listeleyebilirsiniz.
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 mülkü aracılığıyla erişebilirsiniz.
Ardından, ekteki contentUrl
mülkü veya ek uç noktası aracılığıyla ekin ikili verilerini elde edebilirsiniz.
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 ve iki türde bulunur: 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 mesajı yanıtlama gibi Glass'ın sunduğu özel işlevlere erişim sağlar:
Özel menü öğeleri, uygulamanızın Glassware'ınıza özgü davranışları göstermesine olanak tanır. Ayrıca markanızla eşleşen bir menü öğesi simgesi de sağlayabilirsiniz.
Yerleşik menü öğeleri ekleme
Zaman çizelgesi öğelerinize yerleşik menü öğeleri eklemek için menuItems array
öğesini doldurabilirsiniz.
Yerleşik bir menü öğesini kullanmak için her menuItem
öğesinin action
değerini doldurmanı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": "Hello world",
"menuItems": [
{
"action": "REPLY"
}
]
}
Özel menü öğeleri tanımlama
Yerleşik menü öğeleri size uygun değilse zaman çizelgesi öğesi eklerken veya güncellerken aşağıdakileri yaparak kendi işlemlerinizle özel menü öğeleri oluşturabilirsiniz:
menuItem.action
içinCUSTOM
değerini belirtin.- Bir
menuItem.id
belirtin. Kullanıcılar özel menü öğesine dokunduğunda, Cam eşyalarınızamenuItem.id
değerinin doldurulduğu bir bildirim gönderilir. Bu sayede bildirimin kaynağını belirleyebilirsiniz. - Glass'ta görünen bir
iconUrl
vedisplayName
eklemek içinmenuItem.values
'ü belirtin.iconUrl
için şeffaf arka planlı, beyaz renkli 50 x 50 PNG resmini seçin. Bir
displayTime
belirtin.displayTime
belirtmezseniz kullanıcılar özel menü öğesine 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ı sabitlemesine olanak tanıyan bir menü öğesi oluşturabilirsiniz. Bu öğe, zaman çizelgesi kartını ana saat kartının sol tarafında kalıcı olarak gösterir. Kullanıcılar aynı menü öğesini kullanarak kartın sabitlemesini de kaldırabilir.
Sabitleme menü öğesi yerleşik bir menü öğesidir. Bu nedenle, 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 öğesinde belirli işlemler yaptığında 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 gelen bir bildirim, abone olunan uç noktaya JSON
istek gövdesi içeren bir POST
isteği olarak 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 API'ye 200 OK
HTTP durum koduyla yanıt vermelidir.
Hizmetiniz hata koduyla yanıt verirse Mirror API, bildirimi hizmetinize yeniden göndermeyi deneyebilir.
Bildirim türleri
Mirror API, farklı etkinlikler için farklı bildirim yükü gönderir.
Yanıtla
Kullanıcı, yerleşik REPLY
menü öğesini kullanarak zaman çizelgesi öğenizi yanıtladı:
{
"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:
- Yanıtlandığı zaman çizelgesi öğesinin
ID
değerine ayarlananinReplyTo
özelliği. text
özelliği, metin transkriptine ayarlanır.- Yanıtladığı zaman çizelgesi öğesinin
creator
özelliğine ayarlanmışrecipients
özelliği (varsa).
Ö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 belirlenen bir özel menü öğesini seçtiyse:
{
"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 ele almalıdır.
Konum güncellemesi
Mevcut kullanıcı için yeni bir konum kullanılabilir:
{
"collection": "locations",
"itemId": "latest",
"operation": "UPDATE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer"
}
Glassware'ınız bir konum güncellemesi aldığında, bilinen en son konumu almak için glass.locations.get uç noktasına istek gönderin. Glassware'ınız on dakikada bir konum güncellemesi alır.
Sesli komut
Kullanıcınız bir sesli komutu etkinleştirmiştir. Örneğin: "Ok Glass, not al, Cat Stream, Chipotle'ın doğum günü yarın". Cam eşyalarınıza 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ünde bulunan LAUNCH
değeriyle diğer bildirimlerden ayırt edilir.
Ardından, zaman çizelgesi öğesini almak için itemId
içindeki değeri kullanabilirsiniz:
{
"id": "<ITEM_ID>",
"text": "Chipotle's birthday is tomorrow",
"recipients": [
{"id": "CAT_STREAM"}
]
}
recipients
mülkü, kullanılan sesli komutu temsil eden kişinin id
değerini içerir.