Basit REST API'leri kullanarak statik kartlar ekleyebilir, bunları güncelleyebilir, okuyabilir ve silebilirsiniz. Buna ek olarak, statik bir karta (ör. konum veya medya) nesne ekleyebilirsiniz.
İşleyiş şekli
Statik kartlar varsayılan olarak Glass saatinin sağ tarafında yer alır ve teslimat sırasında kullanıcıyla alakalı bilgileri gösterir. Ancak canlı kartlar gibi hemen dikkat çekmeleri gerekmez ve kullanıcılar isterlerse kartı okumayı veya üzerinde işlem yapmayı seçebilirler.
Glassware, zaman çizelgesine statik kartlar taktığında Glass, kullanıcıları uyarmak için bir bildirim sesi çalabilir. Önceki tüm statik kartlar da sağa doğru yükselir ve 7 gün sonra veya 200 kart daha yeni olduğunda zaman çizelgesinden kaybolur.
Ne zaman kullanılır?
Statik kartlar, önemli olaylar meydana geldiğinde kullanıcılara düzenli bildirimler göndermek için idealdir.
Örneğin, en çok okunan haberleri gerçekleştiği sırada gönderen bir haber sunma hizmeti. Mirror API statik kartları, OPEN_URI
menü öğesi aracılığıyla canlı kartlar veya kapsama girmeye de başlayabilir. Bu sayede, daha etkileşimli bir deneyim için statik kartları bildirim olarak, canlı kartı veya yoğun bir şekilde kullanan karma etkileşimler oluşturabilirsiniz.
Zaman çizelgesi öğeleriyle ilgili olası işlemlerin tam listesi için referans belgelerine bakın.
Statik kartlar ekleme
Statik kartları (zaman çizelgesi öğeleri) eklemek için REST uç noktasına zaman çizelgesi öğesinin bir JSON temsilini yayınlayın.
Zaman çizelgesi öğesindeki alanların çoğu isteğe bağlıdır. En basit şekilde, bu örnekte olduğu gibi zaman çizelgesi öğesi yalnızca kısa metin 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ı bir şekilde, oluşturulan öğenin tam bir kopyasını içeren bir 201 Created
yanıt kodu alırsınız. Önceki örnekte başarılı bir yanıt aşağıdaki gibi 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österilecek şekilde eklenen öğe şu şekilde görünür:
Eki olan bir zaman çizelgesi öğesi ekleme
Bir resim bin kelimeye bedeldir. Bu, bir zaman çizelgesi öğesine sığdırabileceğinizden çok daha fazladır. Bu amaçla, bir zaman çizelgesi öğesine resim ve video da ekleyebilirsiniz. Aşağıda, fotoğraf eki olan 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()
Eklenen resme sahip bir zaman çizelgesi öğesi Glass'ta şöyle görünür:
Video ekleniyor
Zaman çizelgesi öğelerinize video dosyaları ekliyorsanız yükün tamamını 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 akışı destekler. RTSP genellikle güvenlik duvarları tarafından engellenir. Bu nedenle, mümkün olduğunda diğer seçenekleri kullanın.
Video yayınlamak 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çimlerini 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 hepsi aynı timeline.id
değerine sahiptir ve bu nedenle aynı menü öğesi grubuna sahiptir. Kullanıcı sayfalara ayrılmış bir zaman çizelgesi öğesine dokunduğunda Devamı menü öğesi görünür.
Glass, görüntülenen zaman çizelgesi öğelerini otomatik olarak sayfalara ayırır
text
. Glass'ın html
sayfasını otomatik olarak sayfalara ayırması için article
etiketini aşağıdaki örnekte olduğu gibi sınıf özelliği auto-paginate
olarak ayarlayı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>
Sayfayı manuel olarak sayfalara ayı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 zaman çizelgesi kartında gösterir. Ö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 engellemek isterseniz ilk <article>
etiketi için cover-only
CSS sınıfı belirtebilirsiniz:
<article class="cover-only">
...
cover-only
sınıfı, otomatik olarak sayfalara ayrılmış zaman çizelgesi öğelerini de destekler:
<article class="auto-paginate cover-only">
...
Gruplandırma
Gruplandırma, alakalı ancak farklı öğeleri (örneğin, bir e-posta ileti dizisindeki tekil iletiler için) gruplandırmanızı sağlar. Gruplarda, kullanıcının paketteki diğer kartları içeren bir alt zaman görüntülemek için dokunduğu bir ana kapak kartı vardır. Paketler, zaman çizelgesi kartlarından ayrı olarak paket kapak kartının sağ üst köşesine katlanarak ayrılır.
Zaman çizelgesi öğelerini paketlemek için aynı bundleId
değeriyle oluşturun. En son eklenen öğe
paketin kapak kartıdır.
Aşağıdaki resimlerde, sağ üst köşesi köşeyle katlanmış bir paket kapak kartı ve altında iki adet birleştirilmiş 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. Hizmetiniz tarafından görülebilen zaman çizelgesi öğelerini aşağıda açıklanan şekilde 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ı dizi özelliği aracılığıyla erişebilirsiniz.
Ardından 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ı ile ilgili işlemler istemesine olanak tanır ve iki tür halinde 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 özel davranışı göstermesini sağlar ve aynı zamanda markanıza uygun bir menü öğesi simgesi de sağlayabilirsiniz.
Yerleşik menü öğeleri ekleme
Zaman çizelgesi öğelerinize, eklerken menuItems array
öğesini ekleyerek yerleşik menü öğeleri ekleyebilirsiniz.
Yerleşik bir menü öğesini kullanmak için yalnızca her menuItem
'nin action
kısmını 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 yaramazsa zaman çizelgesi öğesi eklerken veya güncellerken aşağıdakileri yaparak kendi işlemlerinizle özel menü öğeleri oluşturabilirsiniz:
menuItem.action
içinCUSTOM
belirtin.- Bir
menuItem.id
belirtin. Kullanıcılar özel menü öğesine dokunduğunda GlasswaremenuItem.id
doldurulur. Bu sayede bildirimin kaynağını belirleyebilirsiniz. - Glass'ta görünen
iconUrl
vedisplayName
özelliklerini eklemek içinmenuItem.values
öğesini belirtin. İmleciiconUrl
için şeffaf bir arka plana sahip, beyaz renkte 50 x 50 boyutunda bir PNG resminin üzerine getirin. Bir
displayTime
belirtin. BirdisplayTime
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österir. Kullanıcılar, aynı menü öğesini kullanarak kartın sabitlemesini de kaldırabilir.
Sabitleme menü öğesi yerleşik bir menü öğesidir. Bu nedenle, tek yapmanız gereken bir menuItem
için TOGGLE_PINNED
action
sağlamaktı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": "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 gelen bildirim, JSON
istek gövdesi içeren abone uç noktaya 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 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 verdiği zaman çizelgesi öğesininID
değerine ayarlandı.text
özelliği, metne dönüştürme olarak ayarlandı.recipients
özelliği, yanıt verdiği zaman çizelgesi öğesinincreator
öğesi (varsa) olarak 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çti:
{
"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ği olarak ayarlanır.
userActions
dizisi, kullanıcının bu öğede gerçekleştirdiği özel işlemlerin listesini içerir. Hizmetiniz bu işlemleri uygun şekilde gerçekleştirmelidir.
Konum güncellemesi
Mevcut kullanıcı için yeni bir konum mevcut:
{
"collection": "locations",
"itemId": "latest",
"operation": "UPDATE",
"userToken": "harold_penguin",
"verifyToken": "random_hash_to_verify_referer"
}
Glassware bir konum güncellemesi aldığında, bilinen en son konumu alması için glass.locations.get uç noktasına bir istek gönderin. Glassware her on dakikada bir konum güncellemesi alır.
Sesli komut
Kullanıcınız bir sesli komutu etkinleştirdi. Örneğin: "Ok Glass, not al, Cat Stream, Chipotle'ın doğum günü yarın". Aşağıdaki bildirim, Glass yazılımınıza gönderilir:
{
"collection": "timeline",
"operation": "INSERT",
"userToken": "chipotle's_owner",
"verifyToken": "mew mew mew",
"itemId": "<ITEM_ID>",
"userActions": [
{“type”: "LAUNCH"}
]
}
Bu bildirim, userActions
özelliğindeki LAUNCH
değeriyle diğer bildirimlerden ayrılır.
Daha sonra, 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
özelliğini içerir.