字幕组成品列表(Beta)
  • 写在前面
  • Android 平台
    • Game On! 游戏开发系列 - 031
      • Pie Noon - 1503060393
      • The Death of Base Game Activity - 1504030543
      • Surviving OpenGL Context Loss - 1504030546
      • WebP for Game Devs - 1504030547
      • Saved Games In-Depth (Part 1) - 1504070556
      • Saved Games In-Depth (Part 2) - 1504030548
      • Smaller Flipbook Textures with CRABBY - 1504030544
      • Google Tag Manager - 1504030545
      • Flatbuffers - 1505050794
      • Achievement Point Pointers - 1505050796
      • Frequency Scaling - 1505050797
      • Meet the Management APIs - 1501140367
      • Y U Ship Broken Games - 1505050795
    • Android 性能优化 - 088
      • Garbage Collection in Android - 1503170425
      • Performance Cost of Memory Leaks - 1503170424
      • Rendering Performance 101 - 1501130351
      • Understanding Overdraw - 1501130352
      • Understanding VSYNC - 1501130353
      • Tool - Profile GPU Rendering - 1501130354
      • Why 60fps? - 1501130355
      • Android UI and the GPU - 1501130356
      • Invalidations, Layouts, and Performance - 1501130357
      • Overdraw, Cliprect, QuickReject - 1501130358
      • Tool - Memory Monitor - 1501130363
      • Battery Performance 101 - 1501130364
      • Understanding Battery Drain on Android - 1501130365
      • Battery Drain and WakeLocks - 1501130366
      • Memory Performance 101 - 1504170661
    • I/O 2014 Android 开发专题 - 089
      • Activity Transitions - 1504020505
      • Building Apps For Android TV - 1504020520
      • Building great Android media experiences - 1504020510
      • Building a quality app from start to finish - 1504020515
      • App Indexing API - 1504020507
      • What's new in WebView - 1504010484
      • Bluetooth Low Energy - 1504010486
      • Building impressive Android media experiences - 1504010493
      • The next Generation of Authentication - 1504020497
      • Don't Alpha That Pixel! - 1504020523
      • NFC + HCE Your phone in an interactive world - 1504020509
      • Demystifying encodes and decodes of WebM - 1504020521
      • Google Cloud Messaging - 1504020524
      • Getting your Game on the Big Screen - 1504020518
      • I hear you like realtime memes - 1504020511
      • Offerize your App - 1504020506
      • Using the Android Job Scheduler - 1504020504
      • From Holo to Material - 1504020526
      • Under the Hood of Android Auto - 1504020501
      • Isolation for Android App Developers - 1504020498
      • Android Work - 1504010496
      • ExoPlayer: Adaptive video streaming on Android - 1504010489
      • Sample rates and resampling: Why can't we all just agree? - 1504010488
      • Drive Android API - 1504010485
    • Android Studio - 004
      • Layout Editor (Ep 3, Android Studio) - 1503290479
      • Introducing Gradle (Ep 2, Android Studio) - 1503170426
    • I/O 2014 Android 分发主题 - 091
      • Introduction to Google Play - 1504030534
      • Google Play: building your user community - 1504030535
      • Optimizing Apps for Education - 1504030536
      • Succeeding in Education Technology - 1504030530
      • Subscriptions Made Easy with Google Play - 1504030531
      • The world is your playground - go global with Google - 1504030533
      • Maximizing discoverability on Google Play - 1504030538
    • Android Auto - 003
      • Introduction to Android Auto - 1504130615
      • Android Auto Messaging - 1504130617
      • Android Auto Audio - 1504130616
    • Android Wear - 006
      • Designing for Android Wear - 1503210448
      • How We Customized Google Apps for Android Wear - 1503210450
      • Fullscreen apps for Android Wear - 1503210445
      • New Notification Features for Android Wear - 1503210446
      • Building Cloud-powered wearable Apps - 1503210449
      • An Introduction to Android Wear - 1503190435
      • Google I/O 2014 - Android Wear: The developer's perspective - 1503210442
      • Devoxx 2014 Interviews: Android Wear - 1503210440
      • DevBytes: Watch Faces for Android Wear - 1503210439
    • Android TV - 005
      • Using the Leanback library - 1504080588
      • Beach Buggy Racing Multiplayer with Nearby Connections (Play Services) - 1503060387
    • Android for Work - 106
      • Android for Work for Developers - 1503060390
      • App Configurations, Testing and Launchers - 1504110590
    • IO Bytes 2014 - Android - 066
      • Chrome Apps on Android and iOS - 1501080014
      • Perf Primer CPU, GPU and your Android game - 1501080017
  • Chrome 平台
    • IO Bytes 2014 - Chrome and Web - 067
      • Using the PageSpeed API - 1505070815
      • Fabulous Forms for the multi-device web - 1505070816
      • Testing multi-screen web pages - 1505070817
      • Responsive images today - 1505070819
      • Web Performance Testing at YouTube - 1505070828
      • Building sites for the multi-device web - 1505070820
      • Deep dive: Google Cloud Messaging for Chrome - 1505070827
  • Google 创业者资源
    • Coffee with a Googler - 012
      • Chat with Allen Huang of AndroidTV - 1503040384
      • Chat with Fred Chung about developer advocacy - 1503070395
      • Google Fit platform with Michelle Haq - 1503210443
      • Android Auto Product Manager Andrew Brenner - 1501120027
      • Chat with Francis Ma about Google Play services - 1501120028
    • Root Access For Startups - 077
      • What we learned building plug-ins for Android, with startup Magnet - 1503230453
      • How to use crowdfunding to your advantage, with startup Hale Devices - 1503280462
      • How to overcome customer objections when selling tech, with startup Guesswork - 1503280458
    • First Things First - 029
      • Getting started with Android: A crash-course in developing for Android - 1504120601
      • How to ask a question: conducting research for your startup - 1504120603
      • MVP Design Hacks: transform your hot idea into a validated prototype - 1504120602
      • Build something people want: Solving real problems - 1504120605
    • How I - 061
      • Use BigQuery to find my most valuable customers - 1504070573
      • Manage beta testing communities using Google Play - 1504070572
      • Use paper wireframing to build native prototypes - 1504070570
      • Used social media and $0 marketing to get 68 million users - 1504070568
      • Prep to fundraise with four questions - 1504070564
      • Validated my idea in 2 days (with no code) - 1504070562
      • Build open platforms on Android - 1504120596
      • Get cheap, automatic analytics for my business using BigQuery - 1504070571
      • Write press releases to get international media coverage - 1504070569
      • Test beta-product features using Google Apps - 1504070563
      • Use URL builder to measure ROI on social media - 1504070561
      • Use events to build DeadSocial's brand - 1504070557
      • Use BigQuery to visualize streaming data - 1503220452
      • Find, screen, and hire developers - 1503120406
      • Drive engagement with social challenges - 1504070558
  • 设计
    • DesignBytes - 017
      • Paper and Ink: The Materials that Matter - 1505050793
  • 云计算
    • DevBytes: Google Cloud Platform - 021
      • Powering the next killer app with the Google Cloud Platform - 1504210672
      • Introduction to Google Cloud Endpoints - 1504210675
      • The Beauty of Scale with Google Cloud Platform - 1504210678
    • Google Cloud Platform - Big Data - 105
      • GDELT & BigQuery: Understand the world - 1502200379
    • Uncategorized - 999
      • Introducing Google Cloud Platform Resources - 1501190370
  • Google 应用开发
    • Launchpad Online - 072
      • The Setup: Creating new apps using Google APIs - 1503190428
      • Listing your files in Google Drive - 1503190429
      • Customizing Google Analytics for your startup - 1503290473
      • The Launchpad Online series - 1503190427
      • Getting started with Google Analytics - 1503290472
      • Accessing Google Maps from a spreadsheet?!? - 1502220381
      • Change the world in 10 lines of code - 1503080398
    • Google Play Services - 054
      • Google Play services 6.1 - 1503290481
      • Google Play Services 7.0 - 1503200437
      • Google Play Services 6.5 - 1501080015
    • 谷歌地图 iOS SDK - 053
      • Maps Live: New Features in the Google Maps Mobile APIs for Android and iOS - 1504300777
    • Google 移动搜索开发 - 055
      • Is your app in the Google index? - 1504120598
      • Get more engaged users with Google Search for Developers - 1503070397
    • DevBytes: Google Cast - 020
      • Google Cast SDK for Android - 1504180666
      • Media Router Framework - Part 1 - Media Router API - 1504180667
      • Overview for Google Cast Receivers - 1504180664
      • Google Cast SDK for iOS - 1504180663
    • Getting Started with the Google Maps SDK for iOS - 035
      • Getting started with the Google Maps SDK for iOS, Part 1 - 1504270757
    • IO Bytes 2014 - Wearables - 070
      • Voice Driven GDK Glassware - 1505280836
    • Route 85 - 078
      • Introducing Route 85 - 1501120022
      • Quick Tip: Don't Default that Switch! - 1501190371
      • OpenInChrome on iOS, Part 1 - 1501120023
      • OpenInChrome on iOS, Part 2 - 1501120024
      • OpenInChrome on iOS, Part 3 - 1501120025
      • OpenInChrome on iOS, Part 4 - 1501120026
    • DevBytes 2014 - 019
      • Web Components - Template - 1505040789
      • Wearable DataLayer API - 1505050792
      • Using srcset for responsive images - 1505050790
      • The picture element for art direction - 1505050791
    • Uncategorized - 999
      • Sun Surveyor brings augmented reality to photographers using Google Maps APIs - 1504200668
      • Snappy travels with the Roads API - 1503060392
      • Easy Maps Apps in Java and Python - 1501140030
  • Google 广告平台
  • Polymer
    • Polycasts - 076
      • The Awesome Power of Auto-Binding Templates -- Polycasts #08 - 1502220382
      • Content Switcheroo with Core-Pages -- Polycasts #09 - 1502200380
      • Core Iconset -- Polycasts #02 - 1505040788
  • Web 平台
    • HTTP 203 - 062
      • Gotchas - 1501140368
      • Font Rendering - 1501080016
    • Web Components - 081
      • DevBytes: Web Components - Overview - 1504250709
  • 宣传视频
    • Uncategorized - 999
      • Google Developers - 1501150369
      • I/O Extended 2014 - Join me - 1502220383
  • Google 各类开发者会议
    • 2014 Chrome 开发者高峰会议 - 009
      • Keynote - Chrome Dev Summit 2014 (Darin Fisher) - 1503120407
      • TLS All the Things! - Security with Performance(Chris Palmer) - 1503140412
      • Let’s build some apps with Polymer!(Rob Dodson) - 1503150415
      • Day One Closing Remarks(Sundar Pichai) - 1503150417
      • Chrome Leadership panel - 1503160422
      • Fundamentals of Mobile Web Development(Matt Gaunt) - 1503150416
    • 2015 游戏开发者大会中 - 039
      • FlatBuffers - 1504150640
      • Games for Google Cast - 1504150637
      • Top 10 Things Android Game Developers Should Know v 3.0 - 1504150643
      • Automate Publishing for Google Play APIs - 1504150639
      • 3 Game Design Mistakes You're Making - 1504150636
      • Android TV - 1504150638
      • How to Go Viral Without Really Trying - 1504150641
    • Devoxx 2014 Interviews - 024
      • What's new in Android 5.0 Lollipop - 1504260740
      • Android Tools - 1504260743
      • BigQuery and user-defined functions - 1504260744
    • IO Bytes 2014 - 065
      • Dart in Google Cloud - 1505070810
      • Big genomic data on Google Cloud Platform - 1505070811
      • Easy International Checkout with Chrome - 1505070802
      • Google developer tools and APIs for iOS - 1503190436
      • Whet your appetite with IO Bytes - 1501080021
    • PlayTime@Shanghai - 095
      • 主题演讲 Chris Yerga - 1504060549
      • 如何成功地开发你的应用 Ellie Powers - 1504060550
      • 在Google上营利 Brahim Elbouchikhi - 1504060551
      • Playtime Shanghai event sizzle reel - 1504070552
    • Project Google I/O 2015 - 098
      • Project Tango Mobile 3D tracking and perception - 1506120857
      • Democratizing Education - 1506120868
      • Improve your Android app’s accessibility - 1506120864
      • Google Cloud Messaging 3.0 - 1506120844
      • Developers connecting the world through Google Play - 1506120862
  • 开源开放技术
    • Compressor Head - 013
      • The Trailer, Season 2 - 1503060385
      • Behind the Scenes - 1503210441
      • Arithmetic Compression (Ep 5, Compressor Head) Google - 1503070394
      • Introducing Compressor Head - 1502120372
      • Episode 1 (Variable Length Codes) - 1502120373
      • Episode 2 (The LZ77 Compression Family) - 1502120374
      • Episode 3 (Markov Chain Compression) - 1502120375
Powered by GitBook
On this page
  • 译者信息
  • 解说词中文版:

Was this helpful?

  1. Android 平台
  2. Android Wear - 006

Google I/O 2014 - Android Wear: The developer's perspective - 1503210442

PreviousAn Introduction to Android Wear - 1503190435NextDevoxx 2014 Interviews: Android Wear - 1503210440

Last updated 5 years ago

Was this helpful?

视频发布时间

2014年6月26日

视频介绍

Take a developer's tour of the Android Wear platform and Google's new wearable APIs. Learn about our simple and powerful tools for creating apps for Android Wear devices and bringing wearable experiences to your Android apps. We'll walk step-by-step through designing and building a small, contextual app for Android Wear.

视频推介语

暂无,待补充。

译者信息

翻译

润稿

终审

原始链接

中文字幕

翻译流水号

加入字幕组

任皓

Martin

--

1503210442

解说词中文版:

AUSTIN ROBISON:好

大家早上好

很高兴这里座无虚席

看上去只有站着的地方了

我们今天非常激动能和你们聊Android Wear

我是Austin Robison

团队的产品经理

JUSTIN KOH: 我是Justin Koh

团队的首席工程师

AUSTIN ROBISON: 非常好

我们已经非常的兴奋

因为感受到了你们在会议的其它部分

中表现的热情

三楼设备所在的那个地方

在我刚才经过时候一直都被大家围着

所以谢谢你们所有的支持

同时真的很激动能说说

关于Android Wear我们所做的

我想首先简要概述

Android Wear是怎么回事

然后我们将深入到一些代码中真正告诉你

如何构建Wear应用

我们都热爱我们的智能手机

他们丰富有趣 他们可以传递消息

这些都是非常引人入胜的体验

但是想象一个我们都会遇到的画面

坐在一起 但我们只盯着自己的手机

而不看身边的人

所以技术是能令人分散注意的

而这就是我们看到的机会

使用Android Wear让这变好

Android Wear只在你需要的时候

提供信息而且只需要看一眼

真的这意味着你可以更好的

和身边的人沟通

和不在你身边的人沟通

如果有一条时间线

下面是我们都经历过的情况

你感到手机在你的口袋中振动 所以你拿出来看

然后你会 好 好的 我收到一些邮件消息

你去查收 接下来的事情你知道的

你花费数几分钟时间

从你身处的世界中分心

的确影响了你正做的事情 但是

要发生的事情不是必须呈现的。

因此使用Android Wear 有了可在手腕上扫视的通知

你每天都可以有更多的交互

更短的时间 更少的从身处的世界分心

同时仍然能让你

获得发生事情的足够多信息

为实现这一新的交互模式

我们创建了全新的UI

现在 那就是按情景排列的卡片的垂直流

对你最重要的信息

在流的顶部

以备你快速浏览和查看

从Android的角度出发 通知完全自动地

让你的通知跨越多设备

它同时拥有Google Now卡片 重要的是

它支持你的第三方内容

就是我们今天要讲的东西

今年年初 我们推出了

一个开发者预览版 让你

得到使用的初步体验 它更像是

带你体验一下手腕的感觉

这让你获取到手机上的通知对象

并且真正能够增强这些对象

让它们附加信息页

能把这些打包到一起放到栈中

能有语音响应

所以我们今天要实现的是

一个SDK 让你更进一步扩展经验的SDK

在那里 使用你习惯并熟悉的Android工具

让你的代码直接运行在

可穿戴设备上

我们要介绍几个API

提供在可穿戴设备和手机间收发数据的功能

也能生成自定义的UI

并通过Intent过滤整合Voice Action

和手机上一样

我们一直与数十家第三方合作伙伴

实战测试这些API

并且我们已经有一些很棒的应用被开发出来

你已经在keynote中见过了其中一些的特色展示

也已经在以前的会议中见过其中一些应用

这里我会更进一步

提供你们一个关于此SDK可能支持

事物的类型的想法

Runtastic是一个健身社交平台

他们的可穿戴整合帮助用户 用手腕来

控制那些会话

所以你可以说OK Google开始跑步

他们会发一个通知到流中

这个流有一个正运行的跑步定时器

使用一中叫做Display Intents的平台新特性

人们可以在这些卡片中显示新UI

这个特性让你可以直接把activity

嵌入到这些卡片中来绘制自己的UI

在这里我们也看到了一块数据

在手机中生成的

是你的跑步路线 可以自动跨设备同步

我们将会深入到如何做到这一点的细节

再比如,Philips Hue

它们连到灯泡

从你的手机改变灯泡的颜色

在三楼有一个展示 真是妙不可言

可能搬到二楼了 抱歉

他们的应用所做的是 当你回到家中

情景卡片被发布到流中

这让你可以控制你的灯光

他们还可以启动全屏Activity

绘制自己的UI 当你控制应用的时候

会有更身临其境的体验

然后再返回到流

需要注意的重点是我们把应用

聚焦于微交互

我们希望用户能进入自己的功能

完成任务 然后尽可能快的

返回到流

如果需要更深层整合的行为

我们希望用户转发回手机

同时我们已经让这些更易于实现

再一个例子 Glympse

这是一个位置分享的社交应用

你可以把自己的位置发送给朋友

在可穿戴设备上 我们可以通过手机发送联系人信息

这样你就需要得到联系人列表

来浏览来发送地理位置

当您安装了Glympse 还可以看到

朋友正向你走来的实时过程

那么让我们再来看看

接下来要讨论的内容中会出现什么

Justin刚刚得到这只可爱的宠物狗

然后我们开发了一个小型幻灯片控制应用

用于展示小狗的一些照片

我们已经有了一个手机和一个可穿戴设备

当我们开始放这个幻灯片时

我们可以发布一个通知到这里的流

当你在左侧滚动ViewPager时

我们在右侧实时更新

幻灯片的标题 以及该幻灯片的编号

当然 我们还有一个动作支持回退

你可以通过轻触第一片

把手机上的幻灯片向前滑动

所以 我们拿他当个遥控器

同时我们使用这些新API

来提供跨越两个设备的无缝体验

让我们研究一下

开发这个应用需要准备什么东西

当我们写手机或平板电脑应用时 通常每个应用有一个APK

但对于Android Wear我们把概念

扩大到跨越所有设备

我们有直接运行在手机上的APK

我们也有直接运行在可穿戴设备上的APK

两者都是你应用的一部分

Google Play服务负责把两者连接到一起

我们将要讨论一套新的API

使你可以在两者之间发送数据

让通信更容易

可穿戴服务包括3套API Data API

Message API和Node API

这些API从两端都可调用

从可穿戴设备上或从手机上

连接中数据对于应用来说是私有的

如果我们先在这里深入 并且观察Node API

这对于研究节点何时进入

或离开连接状态非常有用

当手表和手机之间的配对建立时

例如 当我们进入连接范围内时

我们会被通知

可以在你自己的应用中用这个来了解

何时可穿戴设备的功能在打开和关闭状态切换

我们可能会显示一个图标

表明你已经连接到可穿戴设备

这个API非常简单

仅用来察觉可穿戴设备何时出现

建立在最顶层的是Message API

具有低延迟机制 为了在设备之间

来回发送字节数组

而且它们可以被加以过滤

关于这个Justin将在后面详细解释

在小狗的例子中 当我们轻触流中的卡片时

或轻触后退按钮回退时

我们会调用SendMessage来发送一个简单的控制

到接收该消息的手机

然后移动ViewPager

Data API是可穿戴服务中最大的一块

它是复制型的数据存储

你可以把它想作一个共享缓存

我们可以将数据放入和取出

当数据被在另一边被修改后

我们则注重

设备之间数据的同步

所以你并不需要担心非持续连接的设备

不需要担心当你超过未连接时间的时候

需要做些什么

困难的部分由我们来完成

你们要做的事情就是把数据

从外面放入存储中 并把它拿出来

例如 在小狗的例子中 我们可以

把幻灯片的标题和幻灯片号放入存储中

Google Play服务复制这些数据

到可穿戴设备 在那里

我们可以实时的更新通知

这样就可以来回传送数据了

现在我要把事情交给

Justin一些了

他将带我们一起使用这些API

并真正深入到一些代码中

我知道这是你们非常感兴趣的

交给你了 Justin

JUSTIN KOH 非常感谢 Austin

哇 水喝得有些少了

你们要原谅我

我们只是得到一只小狗而已 但我居然对她过敏了

所以我有点咳嗽

所以如果你看到我要这样 大家赶快把耳朵堵起来

让我们来看看组成应用

的整体构件模块

在左手边 我们看到

我们有个ViewPager 里面有一些Fragment

幻灯片Fragment

当从用户从左到右滑动

我们将更新数据项

将索引从1更新到2

我们把这些放到数据存储中

然后事件将会跨越到可穿戴设备

并且当这发生时 我们会更新通知

所以首先 我们需要下载Android Studio

创建一个新的项目

我已经创建了一个叫做Slide Control的新项目

你会发现Android Studio现在支持多种规格

所有我们昨天讨论过的规格

可穿戴是其中之一

你只需点击这里的复选框

Android Studio会负责打包

APK的可扫视部分 或这个手表APK

到你的手机应用中 这样它就可以在

Play Store上发布了

让我们从建立手机UI开始

如我所说,这个Activity是ViewPager

在其中有几个Fragment

带有背景图像 幻灯片的标题

这些就是组成两个不同的应用程序

的所有文件

再次,在左边,我们已经有用绿色表示的手机APK文件

在右边,我们已经有蓝色的可穿戴APK文件

让我们来看看显示Activity

就是ViewPager那一个

可以看到 我们需要做的第一件事

是创建一个Google API客户端

这是所有Google Play服务的入口

这里的新API是Wearable API

那么 我要建立我的客户端并在某处放好

这样 我可以在应用的整个生命周期中

使用它

接下来要做的事情是给我的ViewPager接上监听器

当事件发生时 我们可以更新Data Store

具体是创建一个OnPageChangedListener

并调用updateDataItem

让我们来看看数据项

如我们所说 URI在数据API中就是一切

我们这样做 因为创建它们真的很容易

使用现有的Android类解析他们也很容易

所以此例中 我建立一个数据项

将用来管理状态

我正在演示的幻灯片和索引

的标题是什么

我创建这个 /state 路径

在内部 Data API将创建完整的

符合规定的URI wear:// 节点号 状态

现在 你不必和开发者一样担心那么多

你只需要关注路径 等等

但是知道这是URI的格式

以后会有助于你 在另一边重构

这些URI的时候将对你有帮助

数据项是字节数组为基础的

但我们知道 使用字节数组灵活性不高

真正有用的是能够在键值对层面上操作

例如bundle

因此 我们创建了一个键值对对象

叫做Data Map 存储原始类型

和bundle不同 我们不会在里面存储

任何像是Parcelable(一种接口)或者Binder

因为这些项会被发送到

网络上的所有节点

在这种情况下 我创建数据映射

我会把这些基本类型

当前索引 幻灯片的总数

和当前所处幻灯片的标题放进去

最后 我只是把它插入到存储中

它就会同步到所有的连接的节点

在可穿戴设备这边 我们希望能够接收这些数据

我们想要运行一个服务来实现

我们不希望所有的不同的应用

都为了监听一个消息而

持续运行长期服务

所以我们创造了这个抽象类

这个类实现了全部的回调方法

这些回调方法是可穿戴API需要用到的

就是NodeListener,MessageListener和DataListener

我在PresentationListenerService中

子类化了这个

然后把它插到我的Android manifest中

通过这样做 Google Play服务APK

就会为我管理这个服务的生命周期

所以这个服务不会始终运行和消耗资源

宝贵的资源 在可穿戴设备中

让我们过一下PresentationListenerSerivce

你可以看到DataListener接口

有一个方法OnDataChanged

当运行到这里 要去检查路径 因为

在应用中可能有多个消息

我要确保对数据项

做了合适的操作

如果状态 还记得我们把这些组成状态

是数据项的路径

那么 如果它被改变了

我会创建或者更新通知

如果被删除了

我想要的是从流中删除该通知

因为它不再与用户相关

在handleStateChanged中 我们将抽取数据映射

从中得到所有的基本类型数据

然后 我们要发布通知

现在 我知道这里有很多代码

我们一步步地过一遍

我们到底想要做什么

我们希望 当用户触摸了第一张卡片时

把Intent返回到我们的服务

因要做到这一点 就像Android系统

我要创建一个PendingIntent到我们的服务

而且我要在这个intent上使用一个action

以确定用户想要做什么

他们想要向前滑动幻灯片呢 还是想要向后呢

接下来我要做的就是创建一个

NotificationManagerCompat对象 这个对象在支持库中

建立这个基础的通知

就像在手机上建立一个通知一样

我有了标题

我有了文字

而像Austin所说 我们要设置setOngoing

因为这表示一个持续的过程

最后 我们要使用支持库中新的API

增加或扩展我们的通知

所以我要创建一个新的Action

这是用来优先的Action

默认情况下 如果我已经创建了一个内容Intent

对Android Wear上 我们将画一个蓝色的圆圈

但如果你从演示中注意到

我们希望能够只需轻触卡片并优选幻灯片

所以我使用一个drawable和一些文本创建了我在这里的Action

我已经调用了setContentAction

这将把这个Action挂到卡片上

如果你看过Designing for Wearables,

在设计方面的讨论中

我们要让icon为蓝色 这样用户会知道

这是可以触摸卡片

这会是一个指示

当他们看到蓝色的 就知道这是一个可操作的东西

最后 我们扩展我们的建造器

而这将创建一个你看到的通知

现在当然 使用更多的代码可以丰富前面的Action

刚才我们用不同的Action创建不同的Intent

使用Intent上不同的Action

然后在通知上创建了一个不同的Action

作为读完这些代码的奖励

这有一张小狗的照片

在手机这边

我们要去获取一些消息

所以首先 我们必须发送消息

在这种情况下 我们将看到

我正轻触上一张幻灯片的按钮

然后它会回到那里

而这仍然进行在PresentationListenerService中

请记住 当等待处理的intent被启动

它会返回到我们的服务

并检查intent中的什么action来了

同时我只要使用Message API

发送一个控制消息

所以我使用Goolgle API客户端

那里 我已经添加了Wearable API 而我只要发送1个字节

所以要么是0来向前 要么是1来向后

同时我要发送这个给特定的节点 该节点

拥有该数据项

请记住 我可以通过分析数据项的路径得到这个

我要发送这些到它自己指定的路径

我们称之为控制路径

相对在手机这边 我们让ViewPresentationActivity

也实现MessageListener接口

这意味着将实现onMessageReceived接口

因此如果它是一个控制信息时 我们只要取得第一字节

然后决定 要向前滑动幻灯片

还是去上一张幻灯片

当这种情况发生 我们更新ViewPager

我们只需要调用在ViewPager上的setCurrentItem

然后那将引发OnPageChangeListener

这个监听器将更新的数据项同时从所有的分支返回

所以这是个很好的模式

你要确保你的数据项

被你的系统中的某一个节点拥有

在这种情况下 该数据项由手机拥有

我们可以尝试在可穿戴这边编辑

并让数据来回同步

这会有点凌乱

更好的做法是让数据项被节点之一拥有

然后你发送消息来更新它

然后你只要让这个良性循环一圈又一圈的运行

所以我们在这里看到 当我们得到消息

我们将只是回到以前的幻灯片

让我们讨论一下比这个复杂的情况

现在 如果我要给出较长的展示

让通知在流中会更好

我希望我的手表能超时返回到主屏幕

这样我不会太耗电

但如果我给一个更短

更简明的展示

我可能想要控制上层的activity

以便作为一个用户 我可以随意左右滑动

而不用真正考虑我正在做什么

同时为做到这一点 我要创建一个运行在可穿戴设备上

的自定义的activity

让我们来看看这个

在幻灯片上我们可以滑动

我们这里有另一个action称为全屏幕

我轻触它 我要调出可穿戴设备上的

拥有一个ViewPager的activity

并且这些是同步的

所以当我在这里切换

运行在手机上的ViewPager会更新

也有可能有一些

其他的我想要显示的事情 如当前时间

可能当超过时间后 会变红

或者此类的事情

那么让我们来谈谈如何让数据 图像

和标题 跨设备传送到可穿戴设备

我们要使用的数据层

我们要有效地做到这一点

我们可以仅仅不断的更新我们的状态数据项

但是这意味着 每一次一有变化

我们将不得不把所有的数据

一遍又一遍的重复发送

所以相反 我要把我的数据保存在多个数据项中

而且他们都将拥有自己唯一的路径

因此这将是wear://节点ID/索引

如你所见 这里我有三个不同的数据项

相对在可穿戴设备这里

我用它们来为我的activity填充一些卡片fragment

我们将称之为SlideControlActivity

因此让我们看看如何做到这一点

在我们的SlideControlActivity 我们有一个非常简单的layout

就是一个ViewPager

但请记住 我要确保

它不会超时回到主屏幕

我的方法是设置的android:keepScreenOn为true

同样 就像你手机上做的

如果你有某种媒体播放应用

现在 请记住 权力越大责任越大

你要对人们的电池友好些

你不会想要看到这样一种情况

用户可能会意外地

结束了这个全屏activity 同时 它没有有效的

进入休眠状态

因此我们要关注着 用keepScreenOn 你可能

想要跟踪用户的超时

你可能希望它可设置

如果用户和设备间

在一个特定长的时间内没有交互

那就结束你的activity

我们也想把Activity放入到用户的上下文中

所以请记住 用PresentationListenerService

当用户完成查看自己的手机上的幻灯片放映后

我们删除掉通知

类似地 当用户完成查看手机上的幻灯片放映后

如果这个Activity还在运行

我们也想退出它

而最后需要说明的是要关注wakelocks

这对于带有较小电量电池的可穿戴设备非常重要

只是真的要关注到用户的电池容量

好 让我们来看看这里 在SlideControlActivity中

我们已经配置很多

像PresentationListenerService

因此 我们有handleStateChanged方法在这里

我们将提取我们的演示数据

我们只是要设置运行在

可穿戴设备上的ViewPager的索引和

手机上的索引保持一致

我们还希望能够从可穿戴设备控制它

所以我创建另一个OnPageChangedListener

现在我要发送不同类型的消息

不是控制向前和向后的消息

我要发送一个新类型的

叫slide的在不同路径上的消息

这里的字节将只是表示

我想要的目标索引是多少

回到手机这边的ViewPresentaionActivity中

如果我看到从sldie路径上进来的消息

我会要从字节中解析出

然后发送它到那

再一次 我会触发OnPageChangedListener

这将触发Update Item 一切自然进行

良性循环

在这里 我们看到的结果

在那里

所以在默认情况下 Android Wear Activity

可以用左向右滑动来消除

这甚至对于ViewPager也起作用

如果我们多滑动几次然后滑动回来

所有事情如你所期望的那样发生

当我在第一张幻灯片 如果我从左到右滑动

我会消除掉这个activity

但请记住 我正在重要的展示中间

在这里 我不想再操作的时候

有意外产生

因此 如果我们希望重载这个行为的时候

这是绝对有可能

而且可以不需要一行Java代码就能实现

它只是更新style和你的Androidmanifest

所以我们一起来 你在你的应用程序中

创建一个从设备默认Theme

继承的Theme

我们在可穿戴设备上运行的仍是KitKat Adnroid 4.4

因此我们也没有这些material theme

所以我们现在是Theme.DeviceDefault

你绝对会在你的应用中使用这些

我们有一个称为android:windowSwipeToDismiss的新特性

通过把这个特性设置为false

你可以通过滑动Activity来

关闭默认行为

然后我刚把它设置为我的Activity的Theme

现在 我不希望用户被困到我的Activity中无法离开

虽然他们应该知道如何离开的

默认情况下 在所有的Android Wear设备上

可以把你的手掌放在屏幕上来

回到主屏幕 但是这并没有

我们想要做的那样优雅

我们想为这些全屏应用建立一个

方式

我们想出的是一个长按

所以当你长按时 我们要显示出这个红圈

然后如果你轻触它 我们会结束这个Activity

我们已经创建了一个支持类 使你很容易在你自己的应用

中做到这一点

所以我要更新我的布局

我要去创造一个DismissOverlayView这样

只悬在顶层的类

并且它默认会被隐藏

在SlideControlActivity中

我只需要得到那个覆盖视图的引用

然后用GestureDetector

我也可以使用长点击listener

如果有个不同类型的视图

但对于ViewPager 使用GestureDetector更加容易

所以再一次的 就像在手机上一样我创建了一个GestureDetector

我要把动作事件填充进去

当我长按的时候我显示出我的DismissOverlayView

DismissOverlayView负责管理其余的一切

当用户轻触它之后 它退出activity

然后返回到流中

我们要谈的最后一件事

是Assets 把图片数据转移到可穿戴设备

很明显 这就是我们想要做的

为我们的用户创建这些丰富的 精彩的体验

所以我们所做的每一件事情都

关注效率 电池续航效率 等等

所以假设我有一个使用联系人照片应用

这是一个很常见的用例

并假设其他人想要

使用相同的联系人图片

好了 我们不希望要传输图片的多个副本

因此通过将这些Asset放入到我们的数据层

我们将进行一次哈希运算 并只发送一个副本过来

现在在连接的另一边

这些应用并不真的知道其他应用正在使用

相同的Asset

他们只是把它当成自己的私有副本

所以这一切都很安全

这一切都在那里

这很棒

我们要在我们的小狗应用中使用这些Assets

尽管我自己也想不到其他还有谁会想用我的小狗图片

我们不想要传送完全分辨率的图片

无论如何

Nexus 5的分辨率比可穿戴设备上

的要高得多

所以我将会想要确保

发送更小的设备上显示所

必需的图像数据

因此为达这个目的 我们进入ViewPresentationActivity

在这里我们将为我们展示中的

所有幻灯片调用这个函数

我可能会在加载的时候

异步完成这个任务

我会在一个已知的URI创建我的数据项

所以这里是 slide/索引号

我要把标题放入

现在我要创建一个asset

我所有的幻灯片对象都知道如何创建

自己的小尺寸版本 就是一个字节数组

从那里 我把对象发送到Asset.createFromBytes

并且把它放入映射中

然后它会智能地发送到

可穿戴设备

在可穿戴设备边的SlideControlActivity中

我要再次使用异步任务 或者是一个加载器

来加载它

这里就是路径的重要性所在了

因为我知道 这将是wear://等等

我可以到处发送这些URI 并按次序构造他们

来查询这些数据项

所以在这里我要从数据层

加载不同的数据项目

我要提取这个Asset

并从这些字节中 我要创建一个bitmap

我可以用它来更新我的UI

这就是我们得到的

所以现在我把时间交回给Austin

AUSTIN ROBISON:好的

谢谢 Justin

[掌声]

那么 我们希望这能给你们一个印象

关于这些新的API和这个新的规格使用的可能性

并且对于自己的应用 能引发了出一些想法或者甚至想到新的应用

所以我们非常乐意看到你们去创造

欲了解更多信息 你们可以访问

developer.android.com/wear 下载SDK并从那里开始

这里有一个模拟器

你们可以用您赠品中拿到的设备使用它

你们可以在那里开始

我们也还有更多的关于这些API的信息

以I/O字节的方式提供

这些现在都上传到YouTube

你们可以去找来看看

这样 感谢你们 同时我们会答复问题

有麦克风就在过道这里

谢谢

[掌声]

请说

听众:你提到的可穿戴设备有赖于

Google Play服务

那么这是否意味着我们无法连接

到Kindle和其他的类似设备

AUSTIN ROBISON:连接由Google Play服务驱动

因此 我们兼容于任何

运行4.3或更高版本的装有Play Store的Android设备

听众:谢谢

AUSTIN ROBISON:这一边

观众:你好

是否有可能放着你的自定义Activity不管

后让该设备进入睡眠状态

或者 当wakelock被释放的时候 是否能自动退出到主屏幕

JUSTIN KOH:这将自动超时

30秒后回到主屏幕

听众:我明白了

所以没有办法就应用保持开着

假设 你正在做一个演示

你想让它在你说话的时候进入休眠状态

然后你打开 然后要想要再次滑动

JUSTIN KOH:所以这就是你可能会

使用我们在第一部分展示的通知的地方了

听众:哦,明白了

明白了

好的 很好

谢谢

AUSTIN ROBISON: 嗯哼

在这里

听众:你们谈到手表

基本上作为一个遥控器和UI

但当手表提供像陀螺仪

或运动和心跳之类的东西是怎么样的

你是如何处理传感器的

JUSTIN KOH:所以要时刻记得 运行在可穿戴设备上的是Android

所以 你注册一个传感器Listener 针对你想要处理的

传感器类型

然后记住 这些API是可以被

来自连接的两边的设备调用的

所以你可以收集可穿戴设备上的传感器数据

然后将其发送到您运行手机上应用的实例

听众:所以你提到 你可以安装独立的应用

在电话自身上

对不对

那么你如何在应用之间切换

Menu在哪里 如果你愿意的话

或者所有手机上会有的应用列表在哪里

AUSTIN ROBISON: 那么UI实际上是设计成帖子式网格布局

因此是故意设计去掉应用的网格

因此我们鼓励开发人员考虑把

相关卡片放到流中

或者注册Voice Actions

你可以说OK Google 启动应用名称

能够让应用按需求启动

您还可以通过提示卡做到

就是当你在设备上触摸时的触摸菜单

听众:还有一个跟进的问题

是否有预设的语音命令 或者你可以

定义你自己的语音命令么

AUSTIN ROBISON:语音命令是平台的组成部分

所以在developer.android.com

有一些文件 它可以告诉你

如何为可用的Action Intent注册

我们也愿意听到您的建议来

扩展这些Action到其他的短语或其他用例

听众:好的

谢谢

AUSTIN ROBISON: 嗯哼

听众:所以这可能是一个和传感器相关的问题

我可以访问语音时间序列么

JUSTIN KOH:对于什么样的应用

听众:假设我想要记录备忘录

JUSTIN KOH:你会希望确保

设备上的编解码器是可用的

可穿戴设备上的不同种类的

可用的编解码器比你在手机上预期的还多

所以我们做声音处理 实际上是

使用Message API把比特转换为流传到手机上

然后用手机来处理数据

只是为了更有效些

听众:作为一个开发者 我能够做到这一点吗

JUSTIN KOH:是的

所以你可以配置一个声音记录器 获得原始字节并发送

听众:完美

AUSTIN ROBISON: 您还可以 作为语音识别Intent的一部分

如果你只是想记录

让我们做转换来得到返回的字符串

但是如果你想要原始字节 那么你可以得到原始字节

JUSTIN KOH:但是小心编解码器的不同

AUSTIN ROBISON: 请说

观众:你好

所以我的问题是关于你实例化很多这些东西的方式

你在这里展示的触摸Acitivity和传送

这些事情

在我的印象里

通知一般大都在Acitivty之外 对不对

所以你传入的上下文

是否是一个Activity

或者我能否从服务或者一个应用运行它

JUSTIN KOH:它可以从一个服务运行

或者是的 应用程序上下文

事实上 使用该应用的上下文通常是一件好事

听众:OK

因此还有一个问题

也关于bitmap

我的意思是 在我的经验中

处理字节数组往往总是很危险的

特别是用BitmapFactory

除非你正在使用类似Picasa

的东西来为你处理很多bitmap

所以 按照你的建议

你说去启动一个异步任务在后台来处理bitmap

在那里 是否有任何潜在的

你正努力实现提供了的一个实际的框架

以帮助我们的内存管理

相反的我们不得不依靠外部资源

JUSTIN KOH:嗯 在developer.android.com

有一系列的关于

处理大位图的开发文章

例如 使用LRU(Least Recently Used)缓存 等等

这就是我们目前的建议

听众:OK

谢谢

AUSTIN ROBISON: 请说

听众:所以我的问题是关于Glass

Glass似乎独立于所有的可穿戴设备

所以针对Glass和Andorid可穿戴设备

是否需要单独开发

同时GDK Glass SDK 它似乎没有

这些我们刚才看到的能力

那么调和这的计划是什么

AUSTIN ROBISON: 确实

所以Wear团队和Glass团队非常密切的合作

事实上 昨天我们宣布

你可以获取Android Wear通知

所以增加的API会直接显示在Glass上

因此我们绝对完全合作

以确保我们有一组一致的API

贯穿公司的所有可穿戴设备

并且以后还有更多即将到来

听众:好的

所以Android Studio支持可穿戴[听不清]

在不同的规格

是否将也要扩展到Glass

所以有一个APK运行

或者也有支持Glass的组件

JUSTIN KOH:这将是一个项目 多个APK

并在我展示的幻灯片中 有Glass的复选框

听众:好的

太谢谢你了

JUSTIN KOH:我在刚才忘了提了

但是请注意 这些都将要发生 所有的Android项目

你可以创建一个Android库项目来存储共享代码

所以在我的例子中 我有一个演示文稿对象

和一个两边都用的幻灯片对象

我把那放入一个Android库项目中

和从手机项目和从我的可穿戴项目连接彼此

听众:你好 是的

我在想 是否有打算要在未来支持可穿戴设备

连接AndroidTV或Android Auto

或其他一些像这样连接设备的组件

AUSTIN ROBISON: 那么

我刚才谈到的关于Glass的那个通知也将在Android Auto上具有同样的功能

所以我们绝对会思考这个

泛Android的兼容性问题

所以我们现在无疑

和其他团队非常密切的合作

我们正在走向一个真正引人注目的特点

那就是关于未来我们可以告诉你的

JUSTIN KOH:对

我认为重要需要注意的

像我们昨天在keynote中说到

手机就像你的大脑

所以你可以控制你的手机

然后你的手机驱动你的电视

或者驾驶你的爱车

这才是真正把所有东西联系到一起

AUSTIN ROBISON: 请说

听众:我们将能够为IMU硬设置

采样率和灵敏度么

在可穿戴设备上

JUSTIN KOH:对于设备上的什么

听众:IMU

如加速计 陀螺仪和指南针

JUSTIN KOH:您可以使用用于设定更新速率Android API

听众:好 但我的意思是灵敏度本身

由于陀螺仪和加速度计

有内置的不同的灵敏度

并且它们的指示对于不同的运动状态

AUSTIN ROBISON: 如果你能在手机上做到这一点

您可以在可穿戴做到这一点

听众:好的

谢谢

JUSTIN KOH:你能在手机上做到吗

听众:不能

JUSTIN KOH:好的

AUSTIN ROBISON:好的 功能需求

请说

听众:两个小事情

您可以直接在可穿戴设备上请求互联网上的资源么

或者他们都只是经过设备

JUSTIN KOH:我们建议通过数据层传递

那是因为在可穿戴设备上我们不支持完整的

HTP协议栈

观众:我明白了

同时 你能从可穿戴设备得到屏幕开 屏幕关闭的事件么

JUSTIN KOH:你可以

听众:好的

只在manifest或者broadcast接收器

或其他上注册它们就可以了吗

JUSTIN KOH:可以

不过你想要做什么

听起来你试图要做一些事情

听众:是的 我有个想法在酝酿

JUSTIN KOH:好的

听众:后面会让你知道的

JUSTIN KOH:听起来不错

期待着它

AUSTIN ROBISON: 好的

请说

听众:关于测试你有什么建议

Espresso将支持可穿戴设备的自动化测试

或类似的事情么

或者是有什么会出现

JUSTIN KOH:类似于UI自动包之类的

听众:是的 Espresso和相似的东西

JUSTIN KOH:在我们的内部测试中 我们使用uiautomators

所以任何在手机上或平板电脑上可以

工作的相同的任意工具也可以在可穿戴设备上工作

听众:你需要同时拥有手机模拟器

和可穿戴设备运转或只要其中一个

JUSTIN KOH:你的意思 是不是你想建立一个使用手机和

可穿戴设备对话的集成测试环境

观众:[听不清]你们关于测试有什么建议

大概 就是对于那几样东西

AUSTIN ROBISON: 那么有几种不同的方法

你可以用SDK 让你的手机通过USB

连接到您的计算机

这也可以再和穿戴模拟器进行通信

这是一个非常好的测试配置或者

你可以有一个真正的装置然后与之通信

同样可以通过ADB连接

这样所有这些在不同状态的

不同的设备的支持都在SDK中

听众:好吧

谢谢

AUSTIN ROBISON: 请说

听众:你有没有方法把音频流

直接从穿戴设备传到手机上

所以如果我想做一个电话的应用 我能做到这点

JUSTIN KOH:好吧 在我们昨天公布的设备上

是没有扬声器的

所以你只能够说话 但不能得到任何东西

但我想刚才有一个关于如何获取访问原始字节

的较早的问题

听众:是的

但是那不是流媒体

或是可以成为流

JUSTIN KOH:通过[听不清]

我们在应用里用Message API来传输数据流

听众:好的

就是这样

谢谢

AUSTIN ROBISON: 请说

听众:请您多谈一点点

对现有的新的语音命令和

为了申请语音命令的过程

我只是想在网上看看

同时你的语音命令页的其中之一给出了404拒绝访问

AUSTIN ROBISON: 开发者页面

现在正在更新 至少

在我在台上之前

那里有一个页面

将列出所有的平台Intent

我想大概有十几个

在那里 支持从叫车

开始跑步或记笔记的事情

您注册这些和对注册任意其他的Intent是一样的

如果您想请求更多的东西

您可以和你的开发代表说

或者你可以到G+社区

在那里 我们会有一个你可以填写的申请表格来请求

额外的语音操作

所以这是+Android Wear Developers

听众:所以就是将要有

和Glass一样的同一套Vocie Actions

因为他们有自己的声音命令的应用处理

是么 AUSTIN ROBISON: 目前 他们是单独的

听众:好的

谢谢

AUSTIN ROBISON:嗯哼

观众:你好

什么是Android Wear的AOSP(Android Open-Source Project)故事

AUSTIN ROBISON: 你想要回答这个

你知道这个

好吧 我知道那个

好

这样Android Wear的部分是建立在KitKat的顶部的部分

并建立在现有的AOSP部分之上

将是开源的 就像任何其他Android的版本

Google Play服务和我们专有的第一方应用程序

将不会是开源的 它就像手机上的

听众:所以我不能够建立自己的基于AOSP的手机

手表,我说

AUSTIN ROBISON: 正确

听众:谢谢

听众:你好 所以我认为这是伟大的东西

我赞赏的是 谷歌正在考虑

有关把人和他们的设备断开来

这样最起码 他们可以更加人性化

但我的问题是 这些东西还是需要

手机在附近

但是我想知道如果手机不在附近将会发生什么

所以有一种场景是 假设我想要去跑步

我在那一刻不关心接听电话

或其他事情 但如果有朋友短信给我说

嘿 我下一件事可能要迟一些

那么我可能要看到这一点

或者可能要回答说 嘿 好吧

我要再跑远一些 在这种情况下

诸如此类吧

那么这个互动要如何发生

如果现在有空间来做这件事

或者是否有一个对未来的计划

AUSTIN ROBISON: 现在的设备使用蓝牙进行连接

所以当你与你的手机间超出蓝牙范围

那么你会失去连接 但你仍然可以

访问在数据存储中的数据项

例如 你仍然可以做一些动作

通过在装置本身触摸

在未来 我们绝对考虑了

在你的身体上的设备的连接图

所以在未来 我们将扩展这点

我认为这是工业的发展方向

连接性越来越好

这里面有电量的权衡

但它绝对是我们思考的东西

听众:好的

所以就一个问题

我的意思是 你说当超出蓝牙范围时

我们还是可以做一些事情

但无论我怎么做它都不会 我的意思是 如果我

假设发送短信给某人 它实际不会发送

因为它不能连接到电话

JUSTIN KOH: 这是正确的

听众:是的

好的,很棒

谢谢

听众:是的 紧接着HTP协议栈的问题

我知道这基本上是一个Android Wear OEM协议

诸如关于他们必须支持哪些硬件这样的事情

你们将要发布 我们可以期待一个GPS么

我知道心脏率将是在某些设备上有 有些没有

我只是好奇 有哪些特定的硬件是

保证在每一个可穿戴兼容的设备上都有的

AUSTIN ROBISON:在刚开始

具有加速计的IMU包是它的一部分

心脏速率是平台的组成部分

它是可选的

而在未来 我们将缩小范围

并释放出更多的信息

听众:好的

关于GPS 今天你有什么可以提到的么

AUSTIN ROBISON: 不是今天

听众:不是今天

行

谢谢

JUSTIN KOH:好的

最后一个问题 我想

我们得到结束信号了

听众:你要发布小狗应用么

JUSTIN KOH:是的

我要完成它

我想要

听众:这是一个好的开始点

谢谢

JUSTIN KOH:我们也还有足够的例子

像用小狗应用的不同部分

小狗应用类似于把它们绘制到了一起

但我们有一些例子 是我们伟大的团队成员

他们就坐在这里前排中

针对一些我们正在做的不同的事情写的

AUSTIN ROBISON: 好的

最后的最后一个问题

JUSTIN KOH:超级最后问题

听众:你提到在那上面没有扬声器

但我想知道 你们是否已经整合了对讲功能

以便它可以在的确有一个耳机插孔

的设备上工作

AUSTIN ROBISON:不是今天

听众:你们对任意种类的可访问性有计划么

AUSTIN ROBISON: 可访问性是绝对的东西

这对于平台非常重要

我们会在未来的版本改进

听众:好

JUSTIN KOH: 好的

AUSTIN ROBISON: 好的

JUSTIN KOH: 感谢大家

AUSTIN ROBISON:感谢大家

掌声

Youtube
Youtube
加入 GDG 字幕组
video_screenshot