65.9K
CodeProject 正在变化。 阅读更多。
Home

开发原生Google Glass应用程序

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2014年5月29日

CPOL

13分钟阅读

viewsIcon

19459

本文将详细介绍使用 RAD Studio 开发 Google Glass 应用的方方面面。

Google 提供了两个处于开发者预览或试用阶段的 API/SDK,用于开发 Google Glass 应用。第一个是 Google Glass Mirror API,它是一个基于云的 RESTful 接口,用于从远程服务器向 Google Glass 时间线发送“卡片”。第二个是 Glass Development Kit,它建立在 Android SDK 之上,用于开发直接在 Glass 上运行的应用。这些应用还可以利用 Android NDK 来集成原生代码。由于它基于 Android SDK,因此不需要它来进行原生应用开发,但它确实提供了一些不错的新增功能。

Embarcadero Technologies 的 AppmethodRAD Studio 支持 Android 应用开发,包括对原生 Google Glass 应用的支持。您可以使用 C++ 或 Object Pascal 编程语言。该支持基于 Android SDK 和 NDK。一旦为 Google Glass 加载了 Android ADB 驱动程序,您就可以像对待其他 Android 设备一样将其作为目标进行开发。本文将详细介绍使用 RAD Studio 开发 Google Glass 应用的方方面面。本文中的演示均使用 Object Pascal 语言,并引用了 RAD Studio,但您在此看到的所有内容也适用于 C++,或单独的 C++Builder 和 Delphi 产品(需配备 Mobile Add-On Pack)。同样,其中大部分内容也适用于 Appmethod。您可以下载 RAD Studio 的免费 30 天试用版许可证Appmethod 来跟随本文的步骤进行操作。

Google Glass 规格

Google Glass 是一款 Android 平台设备,并且远不止于此。本质上,它是一台穿戴在头上的微型平板电脑。它配备双核 ARM Cortex-A9 CPU,支持 ARM v7 NEON 指令,带有一个摄像头和典型的移动设备传感器。得益于最近的更新,它运行的是 Android 4.4 KitKat (API 19)。它能够运行许多原生 Android 应用,但这仅仅是开始。

Glass 的主要输出是 640x360 的显示屏,看起来出奇地好。Google 声称它相当于从 8 英尺外看一个 25 英寸的屏幕。它还有一个骨传导扬声器,并可选配耳塞用于音频输出。它拥有大量输入传感器:麦克风、加速度计、陀螺仪、磁力计(指南针)、环境光传感器、距离传感器以及一个前置广角摄像头,可以拍摄 500 万像素的照片或 720p 视频。此外,右侧镜腿上有一个触摸板,一个面向眼睛的传感器用于眨眼检测,以及用于“头部佩戴检测”的传感器。后两个传感器的支持仍处于测试阶段。

Glass 并非首款 Android 驱动的光学头戴式计算机,但可能是最具创新性的。与其他 Android 设备上常见的触摸屏或键盘不同,它的主要输入方式是语音和右侧镜腿上的小型触摸板。触摸板不用于点击特定的控件或应用,而是通常提供四种基本手势:向前向后滑动进行导航,点击进行选择,或向下轻扫作为返回按钮,如果未被其他方式处理,则会退出您的应用。

Glass 的主要用户界面是时间线的概念,由一系列卡片组成。轻按一下可唤醒 Glass。左右滑动可在时间线上向前或向后移动。从主卡片开始,点击或使用语音命令可调出已安装应用的列表,启动这些应用后,通常会继续左到右的导航模式。

图 1 - Google Glass 主屏幕

安装 ADB USB 驱动程序

在 Windows 上为任何 Android 设备进行开发之前,您需要安装 ADB USB 驱动程序。以前,Google Glass 的安装过程要复杂得多。现在,随着 Google USB 驱动程序的第 9 版更新,Google Glass 获得了官方支持。只需运行 **Android Tools** 工具(随 RAD Studio 一起安装),它将打开 Android SDK Manager。在“Packages”列表底部的“Extras”部分选择并安装 Google USB Driver。

图 2 - Android SDK Manager

在设备管理器中,您会在“Other devices”(其他设备)下看到一个带有黄色三角形的条目,名为 **Glass 1**。您可以从 Android SDK 安装目录下的 *extras\google\usb_driver* 文件夹加载驱动程序。如果您使用 RAD Studio 安装了 Android SDK 并使用了默认设置,则文件夹路径如下:

C:\Users\Public\Documents\Embarcadero\Studio\14.0\PlatformSDKs\adt-bundle-windows-x86-20131030\sdk\extras\google\usb_driver

创建您的第一个原生 Glassware 应用

RAD Studio 非常适合创建可在 Android 和 iOS 设备上运行的真正原生多设备应用。由于 Glass 是一种特殊的形态因素,具有独特的界面模式,因此我假设您将仅为 Glass 创建此应用。如果您确实希望让此应用在多个设备上运行,当然也可以通过使用典型的多设备技术来实现。

RAD Studio 提供了多种不同的模板来帮助您开始创建应用程序。我们将从一个 Blank Application(空白应用程序)开始,这可能是大多数 Glassware 最常见的起点,尽管 3D Application(3D 应用程序)也可能非常有用。

图 3 - FireMonkey Mobile Application Wizard

为 Google Glass 设置 IDE

虽然主显示屏的实际分辨率为 640x360,但其像素密度为 1.5。这意味着控件放置的有效分辨率为 472x240(实际像素除以像素密度)。RAD Studio 已包含一个尺寸正确的 Google Glass 设备布局。您可以在 IDE 中的设计表面上方的下拉框中选择它。

图 4 - 带有 Google Glass 布局的设计表面

此布局适用于任何颜色的 Google Glass。同样,您也可以在 Device Manager(设备管理器)(Tools -> Options -> Environment Options -> Form Designer -> Device Manager)中定义自己的 Google Glass 设备。为 Android 平台添加新设备。您只需要启用 Landscape Left(左横屏)方向。您需要提供一个至少 472x240 像素的背景图像。如果需要,您可以指定状态栏大小,但通常会在 Glass 应用中隐藏它(稍后会详细介绍)。

语音启动支持

当您运行应用时,它会自动启动,但一旦关闭,您将在菜单中找不到它。这是因为 Glass 使用的启动机制与传统 Android 应用不同。不过,添加支持很容易。

首次构建应用后,RAD Studio 会生成一个 *AndroidManifest.template.xml* 文件。这是一个用于生成 Android 应用实际 *AndroidManifest.xml* 的模板。

我发现最简单的方法是将此文件添加到项目组中,以便轻松打开和编辑。只需右键单击项目文件并选择 **Add . . .**。这将打开文件浏览对话框,以便您可以选择 AndroidMainfest.template.xml。现在,您可以从 Project Manager(项目管理器)中双击它来编辑模板。

您需要在清单文件中进行两项编辑。第一项是在 <intent-filter> 元素内部。您需要指定要响应 Voice Trigger(语音触发器)操作。通过添加以下元素来实现:

<action android:name="com.google.android.glass.action.VOICE_TRIGGER" />

然后,您需要在 <activity> 元素中添加此操作的元数据:

<meta-data android:name="com.google.android.glass.VoiceTrigger" android:resource="@xml/voice_trigger_start" />

这指定了 XML 文件 *voice_trigger_start.xml* 将定义您的语音触发器。此文件可以命名为任何名称,但添加文件时需要与此处指定的名称匹配。它应该放在 XML 目录下。

关于选择语音触发器的一点说明:Google 有一个 已批准的语音触发器列表,但如果您想使用其他触发器,只允许在开发期间使用,并且需要为您的清单文件添加特殊权限。在 <%uses-permission%> 之后立即添加以下内容:

<uses-permission android:name="com.google.android.glass.permission.DEVELOPMENT" />

您可以将您建议的语音触发器提交给 Google,如果获得批准,他们会将其添加到列表中。

现在您需要创建一个 *voice_trigger_start.xml* 文件。

  1. 通过右键单击 Project Manager(项目管理器)并选择 Add New > Other > Web Documents > XML File(添加新文件 > 其他 > Web 文档 > XML 文件)来为项目添加新的 XML 文件。
  2. 将 XML 文件重命名为 *voice_trigger_start.xml* 或您在清单中指定的任何名称。清单中不包含 .xml 扩展名。
  3. 将 XML 文件保存到项目的文件夹中。
  4. 编辑 XML 文件,使其如下所示:
<?xml version="1.0" encoding="UTF-8"?>

<trigger keyword="Your keyword here" />

将 **Your keyword here**(此处输入您的关键字)替换为您想要使用的短语或关键字,前提是您已指定了 Development 权限。现在,当您的应用部署到 Glass 时,它将在菜单系统中显示应用图标。

最后,您需要配置 *voice_trigger_start.xml* 文件的部署,以将其部署到 Android 应用的 apk 包的正确位置。这通过部署管理器完成,可以通过 **Project > Deployment** 菜单选项访问。只需单击“Add files”(添加文件)按钮(从左数第二个),然后浏览并选择您创建的 *voice_trigger_start.xml* 文件。添加文件后,您需要将 **Remote Path**(远程路径)编辑为 *res/xml*,这将将其放置在 apk 包内的正确位置。

常见的 Glass 应用配置

通常 Android 应用在屏幕顶部有一个状态栏。在 Google Glass 上,此状态栏是隐藏的。为您的应用隐藏它需要两个步骤。首先,您可以在设计时通过将窗体的 **BoarderStyle** 设置为 **None** 来隐藏它。要在运行时删除状态栏,请转到 Project -> Options -> Version Info(项目 -> 选项 -> 版本信息),然后在顶部选择 _All configurations – Android Platform_(所有配置 – Android 平台)。然后将 **theme**(主题)键的值从 **TitleBar** 更改为 **No TitleBar**。

图 5 - Project Options - Theme No TitleBar

默认的 Android 主题是 Halo Light,即白色背景上的黑色和灰色。对于手机或平板电脑来说这很好,但在 Glass 上,白色像素非常明亮,而黑色像素基本上是透明的。一块靠近您眼睛的、大部分是白色的屏幕,就像有一盏手电筒照进您的眼睛,这很不舒服。幸运的是,RAD Studio 包含 Halo Dark 和专门的 Google Glass 样式。Google Glass 样式是黑色背景,带有浅色多彩文本和稍大的字体大小。它基于推荐的 Google Glass 样式。

要更改应用样式,请从 Tool Palette(工具面板)向窗体添加一个 TStyleBook。在 **Project Manager**(项目管理器)中确保已选择 **Android** 作为 Target Platform(目标平台)。选择您应用程序的 TForm(空白设计表面),然后在 **Object Inspector**(对象检查器)中将 StyleBook 属性设置为您刚刚添加到窗体的 TStyleBook。现在双击 TStyleBook,然后单击 Load(加载)按钮并导航到 styles 文件夹。默认情况下,它位于:

C:\Users\Public\Documents\Embarcadero\Studio\14.0\Styles\Android

Glass 应用通常还有一个透明背景上的剪影白色应用图标。您可以在 Project Options(项目选项)对话框的 Application(应用程序)节点下更改应用的启动器图标。

构建您的应用

此时,您就可以为 Google Glass 构建一个能够集成到 Glass 环境中的应用了。由于 Glass 的使用模式与典型移动应用不同,因此您需要仔细考虑应用的设计。以下是一些关于如何与 Glass 的不同元素进行交互以提供用户体验的技巧。

使用传感器

Glass 缺少键盘或触摸屏,但仍然拥有所有标准的移动设备传感器。您可以使用标准的传感器组件来访问这些传感器。

位置和 GPS

Glass 内置 GPS。当组件处于活动状态且位置变化超过 Distance(距离)属性设定的值时,TLocationSensor 会触发 OnLocationChanged 事件。在 OnLocationChanged 事件处理程序中,有一个 **NewLocation** 参数,其中包含新位置的纬度和经度。

运动与方向跟踪

要跟踪 Glass 和佩戴者头部的运动和方向,请使用 **TMotionSensor** 和 **TOrientationSensor** 组件。它们提供有关设备的加速度、角度、状态、航向、速度和运动的信息。由于 Glass 佩戴在用户的头上,因此这些信息会转化为头部运动以及用户正在看向何处以及头部如何移动。

它实际上会访问包括陀螺仪、磁力计和加速度计在内的多个不同传感器。您可以使用 **TTimer** 来轮询传感器信息,以发现随时间变化的运动和方向信息,或者仅读取一次数据以获取瞬时信息。

访问摄像头

**TCameraComponent** 让您能够从摄像头捕获帧。您可以每秒捕获多个帧以提供预览,或者只捕获单个帧。Google 要求在您拍照时屏幕必须开启,但不要求屏幕显示您正在捕获的图像(尽管这对用户来说更方便)。

要使用 **TCameraComponent**,请将 Active(活动)属性设置为 true,然后响应 OnSampleBufferReady 事件。请记住,此事件不是在 UI 线程中发生的,因此如果您想更新 UI 以向用户显示图像,您将需要使用类似以下的代码:

// Event handler for the CameraComponent’s SampleBufferReady event
procedure TMainForm.CameraComponent1SampleBufferReady(
  Sender: TObject; const ATime: Int64);
Begin
  // Use Synchronize to move the execution to the main UI thread.
  TThread.Synchronize(TThread.CurrentThread, GetImage);
end;
 
procedure TMainForm.GetImage;
begin
  // imgCameraView is a TImage component on the UI for displaying the image
  CameraComponent1.SampleBufferToBitmap(imgCameraView.Bitmap, True);
end;

使用触摸板

与触摸板交互的最简单方法是通过交互式手势。Pan(平移)交互式手势在用户在触摸板上滑动手指时会触发一系列事件。例如,为了允许用户在应用中导航选项,您可以查找平移手势的水平移动。

要响应交互式手势,只需展开窗体的 Touch(触摸)属性,然后指定您要接收事件的各个交互式手势。之后,当用户进行交互式手势时,将发生 OnGesture 事件。以下是一个手势处理程序示例,它允许用户根据交互式手势的水平位置设置屏幕超时。

procedure TMainForm.FormGesture(Sender: TObject;
  const EventInfo: TGestureEventInfo; var Handled: Boolean);
var
  x: Integer;
begin
  // Handle the Pan Interactive Gesture
  if EventInfo.GestureID = igiPan then
  begin
    // Specific processing for the beginning of the gesture – save the start location
    if TInteractiveGestureFlag.gfBegin in EventInfo.Flags then
    begin
      fPanStart := EventInfo.Location;
      fStartVal := pbTimeOut.Value;
    end
    else
    // Specific processing at the end of the gesture – set the timeout
    if TInteractiveGestureFlag.gfEnd in Eventinfo.Flags then
    begin
      SetScreenOffTimeout(Trunc(pbTimeOut.Value * 1000));
    end
    else
    // Update the display based on the current gesture position
    begin
      if not (TInteractiveGestureFlag.gfInertia in EventInfo.Flags) then
      begin
        x := Trunc((fPanStart.X - EventInfo.Location.X)/10) * 10;
        pbTimeOut.Value := fStartVal + x;
      end;
      DisplayTimeOut(Trunc(pbTimeOut.Value));
    end;
  end;
end;

请注意,如果用户在触摸板上向下滑动,则会触发返回按钮事件,以及平移手势。您可以通过捕获此返回按钮事件来自己处理它。只需为您的窗体添加一个 OnKeyUp 事件处理程序,并包含以下代码:

if Key = vkHardwareBack then
begin  
  // Do whatever you want to do here  
  Key := 0;
  // Set Key = 0 if you want to prevent the default action
end;

如果您始终将 Key 设置为 0,那么用户将无法退出您的应用,请妥善规划。

结论

RAD StudioAppmethod 对 Android 的支持,特别是对 Google Glass 的支持,使其成为开发原生 Glassware 的绝佳选择。通过对 C++ 和 Object Pascal 的支持,您可以使用您喜欢的语言。RAD Studio 附带了一个 原生 Glassware 示例应用,演示了此处提到的许多内容。文档还包含一份 Google Glass 入门指南,其中详细介绍了开发过程。还有其他 示例和代码片段 演示了不同传感器、手势等的用法。还可以调用 GDK 来访问时间线或其他 Glass 特有功能。GDK 仍在不断更新中。请关注未来关于如何在 我的 Delphi.org 博客 上使用 GDK 的文章。

© . All rights reserved.