Cần phải uỷ quyền
Chèn một mục mới vào dòng thời gian. Xem ví dụ.
Phương thức này hỗ trợ URI /upload và chấp nhận nội dung nghe nhìn đã tải lên có các đặc điểm sau:
- Kích thước tệp tối đa: 10 MB
- Các loại MIME nội dung đa phương tiện được chấp nhận:
image/*
,audio/*
,video/*
Nếu được cung cấp, thì nội dung nghe nhìn đã tải lên sẽ được chèn dưới dạng tệp đính kèm vào mục trong dòng thời gian.
Yêu cầu
Yêu cầu HTTP
Phương thức này cung cấp chức năng tải nội dung nghe nhìn lên thông qua 2 URI riêng biệt. Để biết thêm chi tiết, hãy xem tài liệu về cách tải nội dung nghe nhìn lên.
- URI tải lên đối với các yêu cầu tải nội dung nghe nhìn lên:
POST https://www.googleapis.com/upload/mirror/v1/timeline
- URI siêu dữ liệu đối với các yêu cầu chỉ dành cho siêu dữ liệu:
POST https://www.googleapis.com/mirror/v1/timeline
Tham số
Tên thông số | Giá trị | Mô tả |
---|---|---|
Tham số truy vấn bắt buộc | ||
uploadType |
string |
Loại yêu cầu tải lên đối với URI /upload.
Các giá trị được chấp nhận là:
|
Ủy quyền
Yêu cầu này cần có sự uỷ quyền với ít nhất một trong các phạm vi sau (đọc thêm về tính năng xác thực và uỷ quyền).
Phạm vi |
---|
https://www.googleapis.com/auth/glass.timeline |
https://www.googleapis.com/auth/glass.location |
Nội dung yêu cầu
Trong nội dung yêu cầu, hãy cung cấp một tài nguyên Dòng thời gian có các thuộc tính sau làm siêu dữ liệu. Để biết thêm thông tin, hãy xem tài liệu về cách tải nội dung nghe nhìn lên.
Tên tài sản | Giá trị | Mô tả | Ghi chú |
---|---|---|---|
Thuộc tính không bắt buộc | |||
bundleId |
string |
Mã nhận dạng gói của mặt hàng này. Các dịch vụ có thể chỉ định bundleId để nhóm nhiều mục lại với nhau. Chúng xuất hiện bên dưới một mục cấp cao nhất trên thiết bị. | có thể ghi |
canonicalUrl |
string |
URL chính tắc trỏ đến phiên bản chuẩn/chất lượng cao của dữ liệu được biểu thị bằng mục dòng thời gian. | có thể ghi |
creator |
nested object |
Người dùng hoặc nhóm đã tạo mục này. | có thể ghi |
displayTime |
datetime |
Thời gian sẽ xuất hiện khi người dùng xem mục này trong tiến trình, theo định dạng RFC 3339. Dòng thời gian của người dùng này được sắp xếp theo trình tự thời gian trong thời gian hiển thị, vì vậy, điều này cũng sẽ xác định vị trí mặt hàng được hiển thị trong dòng thời gian. Nếu dịch vụ không đặt thời gian hiển thị mặc định, thời gian hiển thị sẽ là thời gian updated . |
có thể ghi |
html |
string |
Nội dung HTML cho mục này. Nếu bạn cung cấp cả text và html cho một mục thì html sẽ hiển thị trong tiến trình. Phần tử HTML được phép – Bạn có thể sử dụng những phần tử này trong thẻ dòng thời gian của mình.
Các phần tử HTML bị chặn: Các phần tử này và nội dung trong đó bị xoá khỏi các phần tử HTML.
Các phần tử khác: Mọi phần tử không được liệt kê sẽ bị xoá, nhưng nội dung của các phần tử đó được giữ nguyên. |
có thể ghi |
isBundleCover |
boolean |
Mục này có phải là ảnh bìa theo gói hay không. Nếu một mặt hàng được đánh dấu là bìa theo gói, thì đó sẽ là điểm truy cập đến nhóm các mặt hàng có cùng bundleId với mặt hàng đó. Thông báo sẽ chỉ hiển thị trên dòng thời gian chính, không phải trong gói đã mở.Trên dòng thời gian chính, các mục được hiển thị là:
|
có thể ghi |
location |
nested object |
Vị trí địa lý liên kết với mục này. | có thể ghi |
menuItems[] |
list |
Danh sách các mục trong trình đơn sẽ được hiển thị cho người dùng khi mục này được chọn trong dòng thời gian. | có thể ghi |
menuItems[].action |
string |
Kiểm soát hành vi khi người dùng chọn một tuỳ chọn trong trình đơn. Các giá trị được phép là:
|
có thể ghi |
menuItems[].id |
string |
Mã nhận dạng cho mục này trong trình đơn. Mã này do ứng dụng tạo ra và được coi là mã thông báo mờ. | có thể ghi |
menuItems[].payload |
string |
Tải trọng chung có ý nghĩa thay đổi tuỳ thuộc vào thao tác của Mục trình đơn này.
|
có thể ghi |
menuItems[].removeWhenSelected |
boolean |
Nếu bạn đặt thành true cho một mục trong trình đơn CUSTOM , thì mục đó sẽ bị xoá khỏi trình đơn sau khi được chọn. |
có thể ghi |
menuItems[].values[] |
list |
Đối với các mục CUSTOM , danh sách giá trị kiểm soát giao diện của mục trong trình đơn ở mỗi trạng thái. Bạn phải cung cấp giá trị cho trạng thái DEFAULT . Nếu thiếu trạng thái PENDING hoặc CONFIRMED , các trạng thái này sẽ không xuất hiện. |
có thể ghi |
menuItems[].values[].displayName |
string |
Tên hiển thị cho mục trong trình đơn. Nếu bạn chỉ định thuộc tính này cho một mục trong trình đơn tích hợp sẵn, thì lệnh thoại theo ngữ cảnh mặc định cho mục đó trong trình đơn sẽ không hiển thị. | có thể ghi |
menuItems[].values[].iconUrl |
string |
URL của biểu tượng để hiển thị cùng với mục trong trình đơn. | có thể ghi |
menuItems[].values[].state |
string |
Trạng thái áp dụng giá trị này. Các giá trị được phép là:
|
có thể ghi |
notification |
nested object |
Kiểm soát cách hiện các thông báo về mục này trên thiết bị. Nếu thiếu thông tin này thì sẽ không có thông báo nào được tạo. | có thể ghi |
notification.deliveryTime |
datetime |
Thời điểm thông báo cần được gửi. | có thể ghi |
notification.level |
string |
Mô tả mức độ quan trọng của thông báo. Các giá trị được phép là:
|
có thể ghi |
recipients[] |
list |
Danh sách người dùng hoặc nhóm đã được chia sẻ mục này. | có thể ghi |
sourceItemId |
string |
Chuỗi mờ bạn có thể dùng để ánh xạ một mục dòng thời gian với dữ liệu trong dịch vụ của mình. | có thể ghi |
speakableText |
string |
Phiên bản có thể nói của nội dung của mục này. Cùng với mục trong trình đơn READ_ALOUD , hãy sử dụng trường này để cung cấp văn bản rõ ràng hơn khi được đọc to hoặc để cung cấp thông tin mở rộng về nội dung hiển thị trực quan trên Glass.Đồ thuỷ tinh cũng cần chỉ định trường SpeakableType. Trường này sẽ được nói trước văn bản này trong những trường hợp có ngữ cảnh bổ sung hữu ích, chẳng hạn như khi người dùng yêu cầu đọc to mục sau khi có thông báo. |
có thể ghi |
speakableType |
string |
Nội dung mô tả có thể nói về loại mục này. Thông báo này sẽ được thông báo cho người dùng trước khi đọc nội dung của mặt hàng trong trường hợp bối cảnh bổ sung hữu ích, chẳng hạn như khi người dùng yêu cầu đọc to mặt hàng sau khi có thông báo. Đây phải là một cụm danh từ ngắn, đơn giản như "Email", "Tin nhắn văn bản" hoặc "Tin tức hành tinh hằng ngày". Bạn nên điền sẵn trường này cho mọi mục trên dòng thời gian, ngay cả khi mục đó không chứa văn bản hoặc văn bản SpeakableText để người dùng có thể tìm hiểu loại mục mà không cần nhìn vào màn hình. |
có thể ghi |
text |
string |
Nội dung văn bản của mục này. | có thể ghi |
title |
string |
Tiêu đề của mục này. | có thể ghi |
Phản hồi
Nếu thành công, phương thức này sẽ trả về một Tài nguyên dòng thời gian trong nội dung phản hồi.
Ví dụ
Lưu ý: Các đoạn mã mẫu của phương thức này không phải là ví dụ cho mọi ngôn ngữ lập trình được hỗ trợ (xem trang thông tin về các thư viện dùng cho ứng dụng để biết danh sách các ngôn ngữ được hỗ trợ).
Java
Dùng thư viện ứng dụng Java.
import com.google.api.client.http.InputStreamContent; import com.google.api.services.mirror.Mirror; import com.google.api.services.mirror.model.NotificationConfig; import com.google.api.services.mirror.model.TimelineItem; import java.io.IOException; import java.io.InputStream; public class MyClass { // ... /** * Insert a new timeline item in the user's glass with an optional * notification and attachment. * * @param service Authorized Mirror service. * @param text timeline item's text. * @param contentType Optional attachment's content type (supported content * types are "image/*", "video/*" and "audio/*"). * @param attachment Optional attachment stream. * @param notificationLevel Optional notification level, supported values are * {@code null} and "AUDIO_ONLY". * @return Inserted timeline item on success, {@code null} otherwise. */ public static TimelineItem insertTimelineItem(Mirror service, String text, String contentType, InputStream attachment, String notificationLevel) { TimelineItem timelineItem = new TimelineItem(); timelineItem.setText(text); if (notificationLevel != null && notificationLevel.length() > 0) { timelineItem.setNotification(new NotificationConfig().setLevel(notificationLevel)); } try { if (contentType != null && contentType.length() > 0 && attachment != null) { // Insert both metadata and attachment. InputStreamContent mediaContent = new InputStreamContent(contentType, attachment); return service.timeline().insert(timelineItem, mediaContent).execute(); } else { // Insert metadata only. return service.timeline().insert(timelineItem).execute(); } } catch (IOException e) { System.err.println("An error occurred: " + e); return null; } } // ... }
.NET
Dùng thư viện ứng dụng.NET.
using System; using System.IO; using Google.Apis.Mirror.v1; using Google.Apis.Mirror.v1.Data; public class MyClass { // ... /// <summary> /// Insert a new timeline item in the user's glass with an optional /// notification and attachment. /// </summary> /// <param name='service'>Authorized Mirror service.</param> /// <param name='text'>Timeline Item's text.</param> /// <param name='contentType'> /// Optional attachment's content type (supported content types are /// "image/*", "video/*" and "audio/*"). /// </param> /// <param name='attachment'>Optional attachment stream</param> /// <param name='notificationLevel'> /// Optional notification level, supported values are null and /// "AUDIO_ONLY". /// </param> /// <returns> /// Inserted timeline item on success, null otherwise. /// </returns> public static TimelineItem InsertTimelineItem(MirrorService service, String text, String contentType, Stream attachment, String notificationLevel) { TimelineItem timelineItem = new TimelineItem(); timelineItem.Text = text; if (!String.IsNullOrEmpty(notificationLevel)) { timelineItem.Notification = new NotificationConfig() { Level = notificationLevel }; } try { if (!String.IsNullOrEmpty(contentType) && attachment != null) { // Insert both metadata and media. TimelineResource.InsertMediaUpload request = service.Timeline.Insert( timelineItem, attachment, contentType); request.Upload(); return request.ResponseBody; } else { // Insert metadata only. return service.Timeline.Insert(timelineItem).Fetch(); } } catch (Exception e) { Console.WriteLine("An error occurred: " + e.Message); return null; } } // ... }
PHP
Dùng thư viện ứng dụng PHP.
/** * Insert a new timeline item in the user's glass with an optional * notification and attachment. * * @param Google_MirrorService $service Authorized Mirror service. * @param string $text timeline item's text. * @param string $contentType Optional attachment's content type (supported * content types are "image/*", "video/*" * and "audio/*"). * @param string $attachment Optional attachment content. * @param string $notificationLevel Optional notification level, * supported values are {@code null} * and "AUDIO_ONLY". * @return Google_TimelineItem Inserted timeline item on success, otherwise. */ function insertTimelineItem($service, $text, $contentType, $attachment, $notificationLevel) { try { $timelineItem = new Google_TimelineItem(); $timelineItem->setText($text); if ($notificationlevel != null) { $notification = new Google_NotificationConfig(); $notification->setLevel($notificationLevel); $timelineItem->setNotification($notification); } $optParams = array(); if ($contentType != null && $attachment != null) { $optParams['data'] = $attachment; $optParams['mimeType'] = $contentType; } return $service->timeline->insert($timelineItem, $optParams); } catch (Exception $e) { print 'An error occurred: ' . $e->getMessage(); return null; } }
Python
Dùng thư viện ứng dụng Python.
import io from apiclient import errors from apiclient.http import MediaIoBaseUpload # ... def insert_timeline_item(service, text, content_type=None, attachment=None, notification_level=None): """Insert a new timeline item in the user's glass. Args: service: Authorized Mirror service. text: timeline item's text. content_type: Optional attachment's content type (supported content types are 'image/*', 'video/*' and 'audio/*'). attachment: Optional attachment as data string. notification_level: Optional notification level, supported values are None and 'AUDIO_ONLY'. Returns: Inserted timeline item on success, None otherwise. """ timeline_item = {'text': text} media_body = None if notification_level: timeline_item['notification'] = {'level': notification_level} if content_type and attachment: media_body = MediaIoBaseUpload( io.BytesIO(attachment), mimetype=content_type, resumable=True) try: return service.timeline().insert( body=timeline_item, media_body=media_body).execute() except errors.HttpError, error: print 'An error occurred: %s' % error
Ruby
Dùng thư viện ứng dụng Ruby.
## # Insert a new Timeline Item in the user's glass. # # @param [Google::APIClient] client # Authorized client instance. # @param [String] text # Timeline item's text. # @param [String] content_type # Optional attachment's content type (supported content types are 'image/*', # 'video/*' and 'audio/*'). # @param [String] filename # Optional attachment's filename. # @param [String] notification_level # Optional notification level, supported values are nil and 'AUDIO_ONLY'. # @return [Google::APIClient::Schema::Mirror::V1::TimelineItem] # Timeline item instance if successful, nil otherwise. def insert_timeline_item(client, text, content_type, filename, notification_level) mirror = client.discovered_api('mirror', 'v1') timeline_item = mirror.timeline.insert.request_schema.new({ 'text' => text }) if notification_level timeline_item.notification = { 'level' => notification_level } end result = nil if filename media = Google::APIClient::UploadIO.new(filename, content_type) result = client.execute( :api_method => mirror.timeline.insert, :body_object => timeline_item, :media => media, :parameters => { 'uploadType' => 'multipart', 'alt' => 'json'}) else result = client.execute( :api_method => mirror.timeline.insert, :body_object => timeline_item) end if result.success? return result.data else puts "An error occurred: #{result.data['error']['message']}" end end
Go
Dùng Thư viện ứng dụng Go.
import ( "code.google.com/p/google-api-go-client/mirror/v1" "fmt" "io" ) // InsertTimelineItem inserts a new timeline item in the user's glass with an // optional notification and attachment. func InsertTimelineItem(g *mirror.Service, text string, attachment io.Reader, notificationLevel string) (*mirror.TimelineItem, error) { t := &mirror.TimelineItem{Text: text} if notificationLevel != "" { t.Notification = &mirror.NotificationConfig{Level: notificationLevel} } req := g.Timeline.Insert(t) if attachment != nil { // Add attachment to the timeline item. req.Media(attachment) } r, err := req.Do() if err != nil { fmt.Printf("An error occurred: %v\n", err) return nil, err } return r, nil }
HTTP thô
Không sử dụng thư viện ứng dụng.
## A very simple timeline item 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" } ## A more complete timeline item with an attachment POST /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": "Hello world", "menuItems": [ { "action": "REPLY" }, { "action": "CUSTOM", "id": "complete" "values": [{ "displayName": "Complete", "iconUrl": "http://example.com/icons/complete.png" }] } } --mymultipartboundary Content-Type: image/jpeg Content-Transfer-Encoding: binary binary image data --mymultipartboundary--