開發(fā)原生的 Google 眼鏡應(yīng)用
與谷歌眼鏡打交道時(shí),在開發(fā)者預(yù)覽版本或先睹為快狀態(tài)版本里,谷歌有兩個(gè)可用的API / SDK。第一個(gè)是谷歌眼鏡的 Mirror API,這是一個(gè)基于RESTful接口,從遠(yuǎn)程服務(wù)器發(fā)送卡片到谷歌眼鏡timeline的云。第二個(gè)是眼鏡的開發(fā)工具包,構(gòu)建在Android SDK上,用來開發(fā)直接運(yùn)行在眼鏡的應(yīng)用程序。這些應(yīng)用程序還可以利用Android NDK和原生代碼協(xié)作。由于它是建立在Android SDK上,盡管原生應(yīng)用程序開發(fā)時(shí)不需要它,但確實(shí)公開了一些很好的額外特性。
英巴卡迪諾科技的 Appmethod 應(yīng)用開發(fā)平臺(tái)和 RAD Studio 開發(fā)工具支持Android應(yīng)用程序開發(fā),包括支持原生谷歌眼鏡的應(yīng)用程序。你可以用你選擇的C++或Object Pascal編程語言。這種支持同時(shí)基于Android SDK和NDK。一旦谷歌眼鏡的Android ADB驅(qū)動(dòng)加載完畢,你可以對(duì)待它就像任何其他Android設(shè)備一樣。本文使用RAD Studio開發(fā)工具來貫穿谷歌眼鏡的方方面面。本文示例使用Object Pascal,也涉及到RAD Studio,但是你在這看到的所有示例,也適用于C + +,或個(gè)別的C++ Builder和Delphi的產(chǎn)品(用移動(dòng)附加包)。同樣地,這大部分示例也能在Appmethod上工作。你可以按照本文中的步驟,下載一個(gè)RAD Studio或 Appmethod 的 免費(fèi)30天許可 。
谷歌眼鏡說明
谷歌眼鏡除是一個(gè)Android平臺(tái)的設(shè)備外,還意味著更多。本質(zhì)上來說,它是你穿戴在頭上的小型平板。它有一個(gè)運(yùn)行ARM v7 NEON指示的雙核ARM Cortex-A9 CPU,一個(gè)照相機(jī),和典型的移動(dòng)設(shè)備的傳感器。對(duì)虧最近的升級(jí),它運(yùn)行Android 4.4 KitKat(API 19)系統(tǒng)。它能夠運(yùn)行許多原生的Android應(yīng)用程序,但這僅僅是個(gè)開始。
眼鏡的主要輸出是640x360顯示屏,看起來出奇的好。谷歌號(hào)稱相當(dāng)于在8英尺處有一個(gè)25英寸的屏幕。它還有一個(gè)骨傳導(dǎo)揚(yáng)聲器和可選的耳機(jī)用做 放音。它有一大堆的輸入傳感器:麥克風(fēng),加速計(jì),陀螺儀,磁力計(jì)(指南針),環(huán)境光感器,接近傳感器和一個(gè)向前可以捕捉5百萬像素照片或720p的視頻的 廣角相機(jī)。此外,有一個(gè)右太陽穴的觸摸板,還有一個(gè)傳感器針對(duì)眼睛進(jìn)行眨眼檢測(cè),以及“頭檢測(cè)”的傳感器。后兩者的支持仍在測(cè)試。
Google Glass并不是第一個(gè)Android 系統(tǒng)供電光學(xué)頭戴式電腦,但它可能是最具革新性的。相比于其他Android設(shè)備上的通用輸入模塊:一塊觸摸屏或者鍵盤,Google Glass的主要輸入設(shè)備采用的是聲音和位于右側(cè)太陽穴附近的一塊非常小的觸控式控制板。這塊觸摸板不能用于點(diǎn)擊特定窗口小部件或應(yīng)用程序,但通常會(huì)提供 四個(gè)基本手勢(shì): 向前和向后導(dǎo)航、選擇、或者后退按鈕,如果沒有做過其他操作,回退按鈕將退出你的應(yīng)用程序。
Google Glass的主要用戶界面是一系列卡片組成的時(shí)間線的概念。一次輕擊喚醒Google Glass。向左或向右移動(dòng)可以使時(shí)間軸向前或向后移動(dòng)。從首頁卡上,輕擊或使用聲音控制可以打開已安裝應(yīng)用程序的列表,當(dāng)啟動(dòng)某個(gè)已安裝的應(yīng)用時(shí),通常 會(huì)繼續(xù)使用左側(cè)到右側(cè)的導(dǎo)航模式。
Figure 1 - Google Glass首頁屏幕
安裝ADB USB驅(qū)動(dòng)
在windows上開發(fā)Android應(yīng)用之前需要安裝ADB USB驅(qū)動(dòng). 在以前,對(duì)于Google Glass這一過程更加復(fù)雜. 在 Google USB 驅(qū)動(dòng)第9版出來后, Google Glass提供官方的支持. 只需要運(yùn)行Android Tools工具集(和RAD Studio在一起安裝的) 就會(huì)打開 Android SDK 管理界面. 在Package列表Extra的最下部安裝Google USB 驅(qū)動(dòng)即可.
Figure 2 - Android SDK管理界面
在設(shè)備管理界面你會(huì)在Other devices看到一個(gè)以黃色三角打頭的詞條,這就是Glass 1.可以在Android SDK 的安裝目錄下找到extras\google\usb_driver. 下面示例為安裝了 Android SDK 以及RAD Studio后默認(rèn)的安裝路徑:
C:\Users\Public\Documents\Embarcadero\Studio\14.0\PlatformSDKs\adt-bundle-windows-x86-20131030\sdk\extras\google\usb_driver
建立第一個(gè)原生的Glassware App
RAD Studio 可以建立跨終端的各種應(yīng)用,不論Android或是iOS. 由于Glass的特殊性,這里假設(shè)你即將創(chuàng)建的就是該應(yīng)用. 如果需要在多終端上使用,可以使用混合開發(fā)技巧.
RAD Studio提供創(chuàng)建應(yīng)用的多種模板. 先從空白應(yīng)用開始, 這也是大多數(shù)Glassware的入口點(diǎn), 當(dāng)然了3D應(yīng)用的廣泛性也是不言而喻的.
Figure 3 - FireMonkey Mobile Application Wizard
為谷歌眼鏡設(shè)置IDE
主顯示屏的實(shí)際分辨率是640x360, 而它的像素密度是1.5。這就意味著一個(gè)有效分辨率為472x240的控制布局 (實(shí)際像素除以像素密度)。 RAD Studio 包含一個(gè)針對(duì)谷歌眼鏡,尺寸已經(jīng)精準(zhǔn)的設(shè)備布局器。您可以在IDE的設(shè)計(jì)圖面上從下拉列表中選擇它。
Figure 4 - Design Surface with Google Glass Layout
這種布局將谷歌眼鏡的任一顏色都有效。同樣的,您可以在設(shè)備管理中通過(Tools -> Options -> Environment Options -> Form Designer -> Device Manager)定義你自己的谷歌眼鏡設(shè)備。為Android平臺(tái)添加一個(gè)新的設(shè)備。您只需激活景觀左方向。您將需要提供一個(gè)至少472x240像素的背 景圖片。如果你愿意,你可以指定狀態(tài)欄的大小,但是你將通常把它隱藏在眼鏡應(yīng)用里 (更多關(guān)于這一點(diǎn))。
聲控啟動(dòng)支持
當(dāng)運(yùn)行你的應(yīng)用時(shí)它會(huì)自動(dòng)啟動(dòng),但是一旦你關(guān)閉了應(yīng)用,你將不會(huì)再菜單中找到它。這是因?yàn)楣雀柩坨R和其他傳統(tǒng)安卓應(yīng)用相比,采用了不同的啟動(dòng)機(jī)制。不過,這個(gè)問題很容易添加支持。
一旦你第一次創(chuàng)建了你的應(yīng)用程序,RAD Studio會(huì)創(chuàng)建一個(gè)AndroidManifest.template.xml文件。這個(gè)模版文件是用來為你的安卓應(yīng)用生成實(shí)際使用的AndroidManifest.xml文件。
我發(fā)現(xiàn)添加該文件到項(xiàng)目中使得按需打開并編輯該文件其實(shí)非常簡單。右鍵點(diǎn)擊你的項(xiàng)目文件,選擇Add...這會(huì)打開一個(gè)文件瀏覽對(duì)話框使得你可以選擇AndroidMainfest.template.xml。這時(shí),你可以通過Project Manager雙擊該文件打開編輯。
這有兩個(gè)編輯操作需要保證在你的操作清單中。第一個(gè)在<intent-filter>標(biāo)簽中。你需要指定你想要回應(yīng)聲音觸發(fā)器的操作??梢酝ㄟ^添加下面的標(biāo)簽實(shí)現(xiàn):
- <action android:name="com.google.android.glass.action.VOICE_TRIGGER" />
然后,你需要在<activity>標(biāo)簽中為這個(gè)響應(yīng)添加元數(shù)據(jù):
- <meta-data android:name="com.google.android.glass.VoiceTrigger" android:resource="@xml/voice_trigger_star
此參數(shù)指定 了XML 文件 voice_trigger_start.xml 將定義你的聲音觸發(fā)器。此文件可以具有任何名稱, 雖然它應(yīng)該在 XML 目錄中,但當(dāng)你添加文件時(shí)它需要和此處指定的名稱匹配
關(guān)于聲音觸發(fā)器的需要注意一點(diǎn):Google有一個(gè)核準(zhǔn)的 voice triggers 列表,但是如果你想使用一個(gè)不同的,你只能被允許在開發(fā)中使用,并且需要在你的manifest中添加特殊的權(quán)限。直接將下面的內(nèi)容添加到 <%uses-permission%> 的后面:
- <uses-permission android:name="com.google.android.glass.permission.DEVELOPMENT" />
你可以提交自己的推薦聲音觸發(fā)器到Google,如果被批準(zhǔn)了將會(huì)添加到這個(gè)列表中。
現(xiàn)在你需要?jiǎng)?chuàng)建一個(gè) voice_trigger_start.xml 文件。
-
右鍵 Project Manager 然后選擇 Add New > Other > Web Documents > XML File來添加一個(gè)新的XML文件到你的項(xiàng)目中。
-
重命名這個(gè)XML文件為voice_trigger_start.xml 或者任何你在manifest中指定的名字. manifest不包含 .xml 后綴.
-
保存XML文件到你的項(xiàng)目目錄下.
-
像下面這樣編輯XML文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <trigger keyword="Your keyword here" />
如果你有指定的開發(fā)許可,你可以用任意你想要的短語或關(guān)鍵字來替換 Your keyword here。現(xiàn)在當(dāng)你的應(yīng)用被部署后,它將會(huì)與應(yīng)用圖片一起顯示在菜單系統(tǒng)上。
最終, 你需要配置你的部署使得voice_trigger_start.xml 文件被放在Android應(yīng)用apk包的正確位置。 可以通過部署管理器來完成這一配置,具體參看 Project > Deployment 菜單選項(xiàng)。簡單的點(diǎn)擊添加文件按鈕(左邊第二個(gè))然后瀏覽并選擇 voice_trigger_start.xml 文件。 添加文件后你需要編輯 res/xml的 Remote Path, 這將會(huì)將它放到apk包的正確位置。
通用Glass App配置
通常來講,安卓應(yīng)用中都會(huì)在屏幕上方放置一個(gè)狀態(tài)欄。在Google Glass中,狀態(tài)欄是隱藏的。在你的應(yīng)用中隱藏工具欄需要進(jìn)行兩個(gè)步驟的處理。首先,你可以在設(shè)計(jì)階段講表格的BoarderStyle設(shè)置為None。接著,為了在運(yùn)行階段移除狀態(tài)欄,需要依次點(diǎn)擊Project->Options->Version Info,在最上面的下拉框中選擇All configurations – Android Platform,然后將鍵theme的值從TitleBar修改為No TitleBar。
Figure 5 - 工程選項(xiàng) - 主題無標(biāo)題欄
默 認(rèn)的安卓主題是灰色和黑色字體配合白色背景的Halo Light。對(duì)于手機(jī)或者平板來講,這個(gè)主題是不錯(cuò)的,但是在Google Glass上面,白色像素非常亮,導(dǎo)致黑色像素基本上是透明的一樣。距離你的眼睛非常近的一塊幾乎全白的屏幕就像拿一個(gè)手電筒照你的眼睛,非常不舒服。幸 好RAD Studio還有一款Halo Dark主題,和一款為Google Glass量身打造的一款風(fēng)格主題。這款風(fēng)格主題背景為黑色,字體采用淡淡的彩色并具有稍大的字號(hào)。這是一款基于推薦的Google Glass風(fēng)格主題。
為了改變你的應(yīng)用的風(fēng)格,可以從工具面板中添加一個(gè)TStyleBook到表格中。在項(xiàng)目管理器中,確保Android被選為目標(biāo)平臺(tái)。為你的應(yīng)用 (空白的設(shè)計(jì)面)選擇TForm,并在對(duì)象檢查器中設(shè)置StyleBook屬性為你剛剛放置到表格中的TStyleBook?,F(xiàn)在雙擊 TStyleBook然后點(diǎn)擊加載按鈕,并導(dǎo)航到styles文件夾下。默認(rèn)情況下該文件夾可以在這個(gè)路徑下被找到:
C:\Users\Public\Documents\Embarcadero\Studio\14.0\Styles\Android
Glass應(yīng)用通常有一個(gè)能在透明背景下顯示出輪廓的白色應(yīng)用圖標(biāo)。你可以在工程選項(xiàng)對(duì)話框的Application選項(xiàng)中改變應(yīng)用的啟動(dòng)圖標(biāo)。
構(gòu)建你的應(yīng)用
這個(gè)時(shí)候你已經(jīng)準(zhǔn)備好去為Google眼鏡構(gòu)建一個(gè)與Glass一體化的應(yīng)用。Glass與傳統(tǒng)的移動(dòng)應(yīng)用相較而言,是一種不同的使用范例,因此你需要在應(yīng)用設(shè)計(jì)中投入一些思考。下面是一些有關(guān)如何與Glass的不同元素交互從而達(dá)到更好的用戶體驗(yàn)的小技巧。
使用傳感器
Glass沒有鍵盤或觸摸屏,但仍然具有移動(dòng)設(shè)備所有的標(biāo)準(zhǔn)的傳感器。你可以使用標(biāo)準(zhǔn)的傳感器組件來訪問這些傳感器。
定位和GPS
Glass內(nèi)置有GPS。TLocationSensor具有一個(gè)OnLocationChanged事件,這一事件在GPS組件被激活時(shí)產(chǎn)生,在 有除Distance性質(zhì)的以外的位置信息改變時(shí)也會(huì)產(chǎn)生這一事件。在OnLocationChanged事件的處理方法中,有一個(gè) NewLocation參數(shù),這一參數(shù)包含新位置的經(jīng)緯度。
運(yùn)動(dòng)和方向追蹤
要追蹤Glass和穿戴者的運(yùn)動(dòng)和方向,需要使用TMotionSensor和TOrientationSensor組件。它們提供設(shè)備的加速度、角度狀態(tài)、前進(jìn)方向、速度和運(yùn)動(dòng)等信息。由于Glass被用戶穿戴在頭上,因此設(shè)備的這些運(yùn)動(dòng)信息實(shí)際上被翻譯成用戶如何張望、頭部如何運(yùn)動(dòng)等信息。
實(shí)際上信息是從很多不同的傳感器中獲取的,包括陀螺儀、磁力計(jì)、加速計(jì)。你可以在一段時(shí)間內(nèi)使用一個(gè)TTimer來輪詢傳感器的運(yùn)動(dòng)和方向信息,也可以只讀取某一個(gè)時(shí)刻的信息。
Camera處理
TCameraComponent 可以操作相機(jī)中的幀. 可以一次抓取多個(gè)幀作為預(yù)覽,也可以一次一幀. Google在抓取圖像時(shí)需要保持設(shè)備的打開狀態(tài),但不一定需要展示正在捕獲的圖像 (盡管展示當(dāng)前圖像更有利于使用者).
調(diào)用 TCameraComponent, 設(shè)置 Active屬性為true, 接著相應(yīng)OnSampleBufferReadyevent. 記住這一過程不是在 UI 線程里, 所以要想U(xiǎn)I 顯示更新的圖像,需要使用下述代碼:
- // 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;
使用觸摸板
與touchpad進(jìn)行交互的最簡單的方式是交互式手勢(shì)。Pan 交互式手勢(shì)提供了一系列事件當(dāng)你的手指在觸摸板上滑動(dòng)時(shí)。舉個(gè)例子,你可以使用Pan手勢(shì)的水平移動(dòng)來完成不同選項(xiàng)之間的切換。
為響應(yīng)交互式手勢(shì),只需簡單的拓展表單的觸摸屬性,然后指定獨(dú)特的你想接受事件的交互式手勢(shì)。 之后,當(dāng)用戶進(jìn)行交互式手勢(shì)操作時(shí),OnGesture事件會(huì)觸發(fā)這里有一個(gè)手勢(shì)處理器的例子,允許用戶基于交互式手勢(shì)的水平位置來設(shè)置屏幕的超時(shí)時(shí)間。
- 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;
注意一點(diǎn),如果用戶在觸摸板上滑下那么除了Pan手勢(shì)之外后退按鈕事件也會(huì)被觸發(fā)。你可以 自己捕獲并處理后退按鈕事件。用下面的代碼在你的表單中簡單的添加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;
如果你總是設(shè)置Key為0,那么用戶將不能退出應(yīng)用,因此適當(dāng)?shù)目紤]考慮。
結(jié)論
RAD Studio 和Appmethod為開發(fā)原生Glassware提供了極大的便利,加上支持 C++ 和 Object Pascal,選擇的余地大大增加r. RAD Studio還提供了原生的示例應(yīng)用演示了上述的種種特性。文檔也詳細(xì)說明了操作步驟。此外還提供了 使用其它多種感應(yīng)器,手勢(shì)動(dòng)作等等的示例,想直接進(jìn)入GDK 查看相關(guān)的細(xì)節(jié)也很方便,而且GDK也在一直持續(xù)更新,可以在我后續(xù)的Delphi.org的博文中看到相關(guān)GDK的說明。
英文原文:Developing Native Google Glass Apps
參與翻譯(7人):petert, 0x0bject, GoodLoser, AndyLam, Pupa, winnieS, it瞌睡蟲
譯文原文:http://www.oschina.net/translate/developing-native-google-glass-apps