本節書摘來自異步社群《windows 8 開發權威指南:html5 和javascript卷》一書中的第2章,第2.4節,作者:尹成 , 李亞男 , 王騰 , 丁寬帥 , 尹子磊著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
2.4.1 html5添加音頻
通過使用html5,無需任何第三方插件或外接程式,你就可以向你的網頁添加音樂播放器。
1.< audio>元素簡介
html5 audio元素提供一個可編寫腳本的對象,無需外接程式或插件即可播放音頻檔案。簡單地說,使用單個标簽和一組屬性在網頁上為使用者提供播放器。通過使用javascript,你可以管理audio對象和配置設定事件,以提供全方位的控制和狀态跟蹤。
html5 audio元素與html5 video元素共享媒體屬性和方法,是以你可能發現你用于監視進度、檔案加載或播放查找等項目的代碼是可以彼此互換的。除了方法和屬性之外,與大多數javascript對象一樣,有許多可以進行注冊的事件,可以簡化你的代碼。
2.最簡單的音頻播放器
與大部分新的html5支援一樣,如果使用者的浏覽器不支援html5 audio元素,則audio元素允許你使用錯誤消息或其他播放技術進行復原。你可以在audio标記之間放置一個錯誤消息,或者插入外部播放器控件的代碼。下面的代碼示例顯示了播放音頻檔案的簡單網頁。
将audio元素直接添加到html代碼中,使用src屬性指定要播放的音頻檔案,并使用controls特性以使用内置的播放器控件。如果你使用的是浏覽器的内部播放器,則無需其他腳本。各個浏覽器中的内部播放器可能會在樣式或功能上有所不同。
在windows internet explorer 9中的音頻元素支援兩個其他特性:autoplay和loop。autoplay告訴windows internet explorer在加載audio對象後立即加載并播放音頻檔案。這與使用bgsound html元素相似。與bgsound不同的是,pause和play控制讓網頁使用者關閉聲音。loop特性會從頭開始連續播放聲音檔案。如果你不需要任何内部控件,則不要使用這些特性。
在該示例中,檔案“demo.mp3”是你自己的占位符。如果音頻檔案與網頁的源代碼在同一目錄,則隻需檔案名即可。如果音頻檔案位于其他目錄中,請包括路徑,例如,“musicdemo.mp3”。如果檔案位于其他站點上,則使用完全限定的域名和路徑,如“http:www.contoso.commusicdemo.mp3”。
3.使用源元素指定多種音頻檔案格式
在将html5 audio元素添加到網頁中時,可以指定一條在浏覽器不支援audio标記時顯示的錯誤資訊。代碼如下:
如果你的浏覽器根本不支援audio,這将很有效。但是,如果支援audio元素,但不支援檔案格式,則不會顯示你指定的錯誤消息。由于在支援html5的所有浏覽器中僅存在幾種支援的格式,是以要赢得最大範圍的閱聽人,則可以使用source元素指定要嘗試的多種檔案格式。下面的代碼示範了3種格式。浏覽器将自動選擇它支援的格式,如果根本就不支援音頻,則它将調用錯誤消息。
2.4.2 html5添加視訊
直到現在,仍然不存在一項旨在網頁上播放視訊的标準。大多數的視訊是通過插件(如flash)來播放的。然而并非所有浏覽器都擁有同樣的插件。
html5規定了一種通過video元素來包含視訊的标準方法。
1.支援的視訊格式
目前,video标簽支援3種視訊格式,如表2.12所示是各個浏覽器對3種格式的支援。

說明:
ogg:帶有theora視訊編碼和vorbis音頻編碼的ogg檔案。
mpeg4:帶有h.264視訊編碼格式和aac音頻編碼的mpeg4檔案。
webm:帶有vp8視訊編碼和vorbis音頻編碼的webm檔案。
2.如何工作
用以下代碼就可以實作在網頁中顯示視訊:
以上代碼在網頁中的效果如圖2-34所示。
3.< video>标簽的屬性
< video>标簽的屬性說明如表2.13所示。
4.其他說明
與audio元素一樣,video元素也支援多個source元素。
2.4.3 html5添加位置感覺
地理定位是html5提供的最令人激動的特性之一。用相對簡單的javascript代碼,可以建立出能确定使用者地理位置詳細資訊的web應用,包括經緯度和海拔等。一些web應用甚至能通過監控使用者位置随時間的移動來提供導航功能。
下面我們來看一下如何一步一步地實作此功能。
(1)先建立一個html5頁面,代碼如下。
說明:這裡需要用到javascript腳本語言。
(2)把javascript地理定位函數放到頁面< head>< /head>裡面的腳本位置,代碼如下。
代碼首先會檢查導航器地理位置對象是否顯示出來,如果顯示出來則浏覽器支援。如果地理位置對象被支援,那麼代碼會使用它來調用getcurrentpostion方法。
getcurrentpostion方法有兩個參數。第一個參數是在地理位置資訊被擷取時調用的函數,第二個參數是産生錯誤時調用的函數。
如果地理位置對象不被支援,那麼函數就會把錯誤資訊寫入頁面的div要素中。
(3)向html主體部分添加下列代碼。
使用按鈕調用函數而且會把位置資料寫入div要素中,div要素最初具有簡單的占位符文本。
當一個網站首次試圖檢索使用者的位置資料時,浏覽器會詢問使用者是否同意共享資料。隻有在使用者同意的情況下,檢索使用者位置的函數才會執行。
(4)關于getcurrentposition方法中的第一個參數displaylocation。
當浏覽器接收到這個函數時,使用者位置資料會傳給下面所示的函數。将其添加到getlocation函數後面。
說明:這個代碼先建立兩個變量,用來表示緯度和經度。然後這個函數會把經緯度文本寫入頁面。當然你也可以用這些地理位置資料用作其他作用。
(5)關于getcurrentposition方法中的第二個參數displayerror。
使用地理位置裝置的時候可能會出現錯誤。例如,使用者或許不同意共享自己的地理位置資料,浏覽器可能不能檢索資料等。是以我們需要添加一個函數來處理對應的錯誤。
在getlocation函數後面添加以下所示的代碼:
說明:該函數首先會擷取頁面div要素的引用,以便寫入合适的錯誤資訊。
(6)至此,一個最基本的html5地理位置定位的代碼就完成了。代碼概覽如下。
(7)運作結果(筆者用的是ie10 rp版本)。
首先詢問你是否同意站點跟蹤你的實際位置,如圖2-35所示。這裡我們單擊“允許一次”按鈕。
接下來,需要幾秒鐘的時間,出現你的地理位置資訊,如圖2-36所示。
(8)其他說明。
内置的position對象屬性如表2.14所示。
說明:隻有3個屬性是必須有值的:coords.latitude,coords.longitude和coords.accuracy。其餘的可以是null,這取決于你的裝置和後端位置伺服器的能力。其中,heading和speed屬性則需要根據你先前的位置計算出來。
2.4.4 捕獲照片和視訊
本節介紹如何通過捕獲裝置(例如,攝像頭)捕獲照片和視訊,以及如何在使用javascript的microsoft design風格應用中呈現音頻流資訊。
1.使用相機對話框捕獲照片或視訊
使用cameracaptureui api,從你嵌入或附加相機捕獲照片或視訊的最簡單方法。
(1)打開visual studio 2012。
(2)建立新項目,在“建立項目”對話框中,從javascript項目類型中選擇一個空白應用程式。
(3)插入javascript和html。打開你的檔案default.html,将其内容修改為以下代碼。
(4)聲明錄影機功能。
使用程式清單設計器添加錄影機功能。選擇“功能”頁籤,然後從清單中選擇“錄影機”。
(5)生成應用。
選擇“生成”>“生成解決方案”以生成項目。
(6)測試應用。
選擇“調試”>“開始調試”測試該方案。單擊“拍照”按鈕拍攝照片。
2.使用mediacapture api捕獲視訊
可以使用windows.media.capture api控制異步捕獲操作,選擇編碼配置檔案,并發送最終視訊到檔案中。
(1)聲明錄影機功能。
使用應用程式清單設計器添加錄影機功能。選擇“功能”頁籤,然後從清單中選擇“錄影機”。
(2)初始化mediacapturesettings。
mediacapturesettings屬性為mediacapture對象提供配置設定。使用mediacaptureinitialization settings類初始化這些屬性,如下面的示例代碼所示。
(3)建立并初始化mediacapture對象。
mediacapture對象包含捕獲視訊需要的方法和異步操作。使用mediacapture.initializeasync方法可以初始化mediacapture對象。預設情況下,initializeasync使用預設的視訊捕獲裝置并且将捕獲音頻或視訊。
(4)建立編碼配置檔案。
編碼配置檔案包含有關如何對目标檔案進行編碼的所有設定。mediapropertiesapi提供了幾個用于建立mediaencodingprofile對象的選項。以下代碼為mp4視訊建立配置檔案。
(5)開始錄制。
要開始将視訊捕獲到檔案中,請為捕獲到的視訊建立一個檔案。然後調用startrecordtostorage fileasync方法,并傳入目标存儲檔案和mediaencodingprofile中。
(6)停止錄制。
要停止捕獲視訊,請調用stoprecordasync方法,代碼如下所示。
2.4.5 html5本地存儲的應用
localstorage用于持久化本地存儲,除非主動删除資料,否則資料是永遠不會過期的。通過前面小節的學習,我們了解了本地存儲的基本特性,下面我們就通過具體的例子來講解html5 localstorage的用法。
1.localstorage的用法
localstorage是以鍵值對(key/value)的形式存儲的,每個鍵值對稱為一個項(item)。其屬性如表2.15所示。
2.如何使用localstorage
(1)并不是所有的浏覽器都支援html5的本地存儲,是以在使用它之前,你需要一點點檢測工作,來確定你的應用正常運作。下面的代碼可以用來測試浏覽器是否支援html5本地存儲。
在下面的html代碼中調用此函數。
<code><button type=”button” onclick=”checkifsupport()”>check</button></code>
說明:以上兩段代碼比較簡單,就不作過多的解釋了。
(2)接下來,對localstorage中存儲的項的數目進行檢查。利用下面的代碼可以實作。
說明:這裡主要是運用了localstorage的length屬性來擷取localstorage的長度。運作結果是0。
(3)接下來向localstorage中寫入項。利用如下所示的代碼可以向本地存儲中寫入資料。
說明:這裡主要利用了localstorage.setitem方法來建立一個項放到本地存儲。此時若執行第二步中的getlength方法,運作結果為1。
(4)既然本地存儲裡已經存放了一個項,那麼我們可以通過以下所示的代碼将此項删除。
說明:這裡主要利用localstorage.removeitem方法來删除本地存儲的項。此時若執行第二步中的getlength方法,運作結果又變成了1。
(5)為了讓讀者有一個清晰的架構,以下代碼是本小節所有javascript代碼的集合。
(6)總結,通過執行個體,我們示範了localstorage的基本用法。對于其他未提及的用法,你可以自己搜集資料學習。
2.4.6 管理啟動、挂起和回複
當使用者将應用移下螢幕時,windows 8會在記憶體中挂起應用。這樣可允許其他應用在前台運作。當應用挂起時,它駐留在記憶體中,并且windows已停止其運作。
當使用者将挂起的應用帶回至前台時,他們希望應用在他們停止的位置恢複運作。隻要應用保持挂起,windows就會在記憶體中自動保留應用的資料,然後在應用恢複時還原該資料。應用偶爾還會終止,是以你的應用應使用挂起事件來儲存其目前的狀态。
1.如何激活應用
(1)注冊激活的事件。
每次應用啟動時,都會引發activated事件。如果系統需要将相關的應用參數傳遞到新激活合約,當應用運作時,也會引發此事件。你可以使用activated事件來還原應用的先前狀态,并檢索與應用要為其激活的合約相關的激活參數。
在全局範圍内注冊activated事件。下面所示的代碼将activehandler設定為激活處理程式,可以檢索之前的applicationexecution狀态和激活參數:
(2)在應用挂起然後終止的情況下還原應用程式資料。
在應用挂起後windows可以由于多種原因将其終止。發生這種情況的示例如下:使用者手動關閉應用,使用者登出或者系統的運作資源不足。如果使用者在windows已終止應用後啟動該應用,則會收到activated事件。使用sessionstate對象确定你是否需要還原應用的資料或使用其預設值啟動。如果定義了sessionstate變量,則使用這些變量還原應用的資料并重新整理其顯示的内容。如果未定義,則加載預設值。
當使用者切換到已終止的應用時,系統将發送 activated 事件檢查sessionstate對象,檢視是否已定義了會話狀态變量。如果已定義,則應用應該加載其儲存的應用程式資料并重新整理顯示的内容,代碼如下所示。
(3)檢索激活參數。
當系統激活應用時,可能存在其他用于激活的上下文。每種類型的激活合約都有一組自己獨一無二的參數,用于向你提供有關你的應用的更多資訊。每個合約的eventargs類都在windows.ui. webui命名空間中定義。以下代碼展示了如何從預設磁貼啟動中檢索參數。
如果要處理初始啟動的激活,則系統将顯示你的初始螢幕直至應用完全激活。在某些情況下,應用必須異步工作(例如,從檔案中讀取設定)以便正确初始化其 ui。這項工作需要在激活期間完成,以便初始螢幕在ui完成前不會關閉。你可以使用激活eventargs上的setpromise()方法推遲激活的完成。在上述代碼段中,setpromise()用于推遲激活的完成,直至對 processall() 的異步調用完成為止。
如果使用vs模闆,則會為你調用 setpromise()。如果在初始螢幕關閉前存在需要完成的異步工作,則在新的頁面片段的“已處理”事件期間完成此工作。確定從此異步活動中傳回promise以延遲“已處理”事件的完成直至活動完成。在應用導航到特定頁面片段時調用已處理事件,以便確定特定于激活的所有代碼僅在激活觸發的導航上運作。在正常導航中,應跳過該代碼。
2.如何挂起應用
(1)注冊checkpoint事件。
在全局範圍内注冊checkpoint事件,代碼如下所示。此事件訓示系統将挂起你的應用。在應用挂起後,系統将确定釋放系統資源。出于此原因,是以在檢查點事件期間儲存你的應用資料尤為重要。
(2)在挂起之前儲存應用程式資料。
當你的應用處理 checkpoint 事件時,它将有機會将其重要的應用程式資料儲存到 checkpoint 事件的處理程式函數中。應用可以使用 sessionstate 對象來同步儲存簡單的應用程式資料。sessionstate 對象會保留資料,以便應用在終止後激活期間可以通路這些資料,代碼所下示。
(3)釋放獨占資源和檔案句柄。
當你的應用處理checkpoint 事件時,它還将有機會釋放獨占資源和檔案句柄。獨占資源的示例為攝相機、i/o 裝置、外部裝置以及網絡資源。顯式釋放獨占資源和檔案句柄有助于確定你的應用未使用它們時其他應用可以通路。當在終止後又激活應用時,它應該打開其獨占資源和檔案句柄。
3.如何恢複應用
每當使用者切換到桌面或其他應用時,系統都會挂起你的應用。每當使用者切回到你的應用時,系統就會恢複你的應用。當系統恢複你的應用時,你的變量和資料結構的内容與系統将你的應用挂起之前的内容相同。系統會将你的應用完全恢複到你離開時的狀态,使使用者感覺你的應用好像一直在背景運作一樣。但是,應用可能已挂起很長一段時間,是以,它應當重新整理在應用挂起之後可能已發生更改的任何顯示内容(如新聞源或使用者位置)。
如果你的應用沒有任何需要重新整理的顯示内容,則它無需處理 resuming 事件。
(1)注冊resuming事件
該事件訓示應用在挂起後已恢複。
windows.ui.webui.webuiapplication.addeventlistener(“resuming”, resuminghandler, false);
(2)挂起之後重新整理顯示的内容。
當你的應用收到resuming事件時,它将有機會重新整理其顯示的内容,代碼如下所示。
2.4.7 支援裝置
你可以在你的應用中支援許多裝置。運動和方向傳感器可讓你的應用響應移動。光傳感器可讓你的應用響應周圍光的變化。地理位置可讓你的應用響應使用者的位置。
下面分别介紹支援的裝置及其功能。
1.枚舉裝置
使用windows.devices.enumeration和windows.devices.enumeration.pnp命名空間,可枚舉裝置。枚舉裝置主要是因為選擇應用要使用的裝置;有關裝置的發現和通知;檢索資訊。
2.加速計
使用加速計可以檢測一個或兩個軸上運動的變化。可以使用加速計和javascript編寫的應用響應使用者移動。基于加速計的應用通常僅使用一個或兩個軸進行輸入。但是,它也可以使用振動事件作為另一個輸入源。
3.陀螺測試儀
使用陀螺測試儀可以檢測方向和轉數的變化。加速計和陀螺測試儀在一起使用可作為遊戲控制器。可以使用陀螺測試儀和用 javascript 編寫的應用檢測使用者移動變化。陀螺測試儀補充加速計作為遊戲控制器;加速計可以測量線性運動,而陀螺測試儀測量角度矢量(或旋轉運動)。
4.傾斜計
使用傾斜計可以檢測x軸、y軸和z軸上運動的變化。可以使用測斜儀和用 javascript 編寫的應用确定俯仰、滾轉和偏航。一個常見的示例是飛行模拟器,它将測斜儀的三條軸(x、y 和 z)映射到飛行器的升降舵、副翼和方向舵輸入。
5.光傳感器
使用光傳感器可以檢測和響應氛圍光的變化。開發人員可以建立使用傳感器檢測和響應氛圍光變化的應用。 例如,當使用者拿着平闆電腦走到門外時,應用程式可通過增加文本和背景之間的對比度來做出響應。
6.地理位置
檢測使用者的地理位置。開發人員可以建立檢測使用者地理位置的 microsoft design 風格應用。例如,某個應用程式可以繪出使用者在地圖上的位置、在照片或電子郵件中附加地理坐标标記,或通過更新興趣點清單響應使用者位置的更改。
7.列印機
使用列印機功能可以改進使用者的列印體驗。從 windows 8 release preview 開始,列印模型經過了重新設計,更便于向 microsoft design 風格應用中添加列印功能。另外,新的列印模型提供了一個可擴充的開發人員平台,該平台允許開發人員自定義列印體驗。自定義操作包括更改列印設定在列印視窗中的顯示順序或者添加特定于應用的自定義設定。特定于應用的列印機設定使開發人員能夠展示對于其應用非常重要的設定,進而幫助開發人員與其使用者進行更好的連接配接。
8.可移動存儲
windows 8支援通路使用 windows 便攜裝置(wpd)的媒體和儲存設備上的内容,包括媒體傳輸協定(mtp)裝置和大容量存儲類(msc)裝置。
2.4.8 通路檔案和檔案夾
1.使用檔案選取器通路檔案
microsoft design 風格應用可以調用檔案選取器視窗,以便使使用者可以浏覽其系統并選取檔案或檔案夾以供應用在其上操作,或者使使用者可以使用新名稱、新檔案類型或新位置儲存檔案(“另存為”)。應用還可以将檔案選取器用作一個接口,進而使應用能夠向其他應用提供檔案、儲存位置,甚至檔案更新。
2.檔案選取器視窗
應用調用檔案選取器視窗,使使用者可以選擇檔案以供應用在其上操作。如圖 2-37所示為一個已調用的檔案選取器,使用該選取器可以選擇照片。
所有檔案選取器視窗在螢幕頂部和底部都有一個公共ui區域,該區域向使用者顯示重要資訊(如視窗的标題、使用者可以浏覽的位置清單和使用者已選擇的項目)。位于檔案選擇器視窗頂部和底部的這些公共ui區域就像電影周圍的上下黑邊,并且這些區域為使用者浏覽的頁面添加邊框。使用者可以從檔案選取器上下黑邊左上部分的清單中選擇位置,如圖2-38所示。
3.調用檔案選取器以通路檔案
通過調用檔案選取器,使用者可以選取檔案和檔案夾以供應用處理。當使用者為應用提供對檔案夾的通路權限時,該應用還會擷取對其子檔案夾的通路權限。檔案選取器為使用者提供對于你的應用可以通路哪些檔案和檔案夾的顯式控制。而如果你的應用像大多數應用一樣處理單獨的檔案或很小的檔案清單,則可能将檔案選取器用作你的應用通路檔案和檔案夾的主要方式,進而使你能夠避免在應用清單中聲明功能,并且很可能會在将你的應用送出給windows應用商店時簡化應用的稽核流程。
下面通過一個示例來說明如何使用檔案選取器讓使用者選取一個或多個檔案以供應用打開。
(1)建立檔案選取器并進行自定義,以顯示可供使用者從中選取的檔案。
通過設定檔案選取器的屬性viewmode、suggestedstartlocation、filetypefilter來自定義檔案選取器。
因為我們需要一種對使用者可以選取的檔案的豐富直覺的顯示,是以我們在該示例中将viewmode設定為thumbnail。如果使用檔案選取器來顯示諸如圖檔或視訊等可視檔案,則應考慮将viewmode設定為thumbnail;否則,請使用pickerviewmode.list。
因為這裡要顯示使用者的圖檔檔案,是以可以将suggestedstartlocation屬性設定為pictureslibrary(圖檔庫)。當然,它隻是一個起始位置,使用者可以從檔案選取器内部浏覽到其他位置。
因為我們希望顯示特定類型的圖檔檔案,是以我們使用filetypefilter.replaceall()方法來指定要在檔案選取器中顯示的檔案類型。
(2)顯示檔案選取器以選取一個檔案。
說明:在建立并自定義某個檔案選取器之後,讓使用者通過使用fileopenpicker.picksinglefileasync調用顯示檔案選取器來選取一個檔案。使用者選取檔案時,fileopenpicker.picksinglefileasync傳回一個表示已選取檔案的storagefile對象,通過使用then或done來捕獲和處理此檔案。
4.擷取檔案和檔案夾清單
擷取某個特定位置(如檔案夾、庫、裝置或網絡位置)的檔案和檔案夾。
(1)擷取包含檔案夾。
如果要擷取特定檔案夾的内容清單,則必須首先擷取該檔案夾。下面的代碼為擷取圖檔庫的代碼:
<code>var picturelibrary = windows.storage.knownfolders.pictureslibrary;</code>
以上代碼中,我們使用knownfolders擷取圖檔庫。可以使用knownfolders屬性擷取表示某些使用者資源的檔案夾。
如果希望使用knownfolders屬性通路庫、裝置或網絡位置,則應在其應用部件清單中聲明相應的功能。
(2)擷取檔案夾内容的清單。
如上面的一行代碼所示,可以調用getitemsasync()來擷取檔案夾中所有内容的清單。若不需要全部項,則可以調用getitemsasync(startindex,maxitemstoretrive)來按索引擷取某個範圍内的檔案夾内容。
在檔案夾上調用 getitemsasync 方法時,會将要接收的項清單限于該檔案夾中的檔案和子檔案夾,且該清單不包括那些子檔案夾中包含的所有檔案和檔案夾。
如果需要檔案夾中的檔案清單,則可以調用**getfilesasync 方法。如果需要檔案夾清單,則可以調用getfoldersasync方法。
(3)使用清單。
上面的幾行代碼在整個項清單中循環通路來執行其他任務,用foreach來循環通路清單中的項。傳遞給foreach的函數将項清單視為一個參數,并将對清單中的每個item執行此函數。
可以通過分别在每個 item 上調用方法來處理它們。在上一示例中,我們通過将 isoftype 方法的結果(同時存在于檔案和檔案夾上)與 storageitemtypes 枚舉值相比較,确定item是檔案夾(storagefolder對象)還是檔案(storagefile 對象)。我們使用此比較将關于項的不同資訊傳遞給 output 幫助程式函數,但也可以同時執行許多其他任務。
5.啟動檔案的預設應用
了解如何啟動檔案的預設應用。
(1)擷取檔案。
首先,擷取該檔案的windows.storage.storagefile對象。如果該檔案包含在程式包中,則可以使用package.installedlocation屬性擷取windows.storage.storagefolder,并且使用getfileasync方法擷取storagefile對象。如果該檔案在已知的檔案夾中,則可以使用windows.storage.knownfolders類的屬性storagefolder,并且使用getfileasync方法擷取storagefile對象。
(2)以預設方式啟動該檔案。
調用 windows.system.launcher.launchfileasync(istoragefile)方法以啟動預設的應用。如下所示的代碼會調用launchfileasync 方法啟動應用包中包含的圖像檔案 test.png:
(3)利用“打開方式”啟動檔案。
當使用者希望選擇預設應用以外的應用來打開某個特定檔案時,你應該使用“打開方式”對話框。例如,如果你的應用允許使用者啟動某個圖像檔案,則預設的處理程式将可能是檢視器應用。在某些情況下,使用者可能需要編輯圖像而不隻是檢視圖像。使用“打開方式”選項及應用欄或上下文菜單中的備用指令,讓使用者在此類情況下打開“打開方式”對話框以選擇編輯器應用。
如下所示的代碼示範了在launcheroptions.displayapplicationpicker 設定為true的情況下調用 launcher.launchfileasync(istoragefile, launcheroptions)方法以啟動使用者從“打開方式”對話框中選擇的應用:
(4)未安裝用以處理所啟動檔案的應用。
在某些情況下,使用者可能未安裝用以處理所啟動檔案的應用。預設情況下,為處理此類情況,windows 會向使用者提供一個連結,幫助其在應用商店中搜尋相應的應用。如果你希望為使用者提供具體的建議,告知他們在此情況下應擷取何種應用,則可以随啟用的檔案傳遞該建議。調用 launcher.launchfileasync(istoragefile, launcheroptions)方法,将launcheroptions.preferred applicationpackagefamilyname 設定為應用商店中推薦的應用的包系列名稱。然後,将launcheroptions的preferredapplicationdisplayname屬性設定為該應用的名稱。windows 會使用此資訊将在應用商店中搜尋應用這一正常選項替換為從應用商店中擷取推薦的應用這一具體選項。
(5)注意事項。
應用不能選擇啟動的應用。使用者通過為協定方案設定預設的處理程式來确定啟動哪個應用。使用者可以選擇 microsoft design 風格應用或桌面應用。
啟動檔案時,你的應用必須是前台應用,即對于使用者必須是可見的。此要求有助于確定使用者保持控制。為滿足此要求,需確定将檔案的所有啟動都直接連結到應用的ui中。 無論何種情況下,使用者都必須采取某種操作來發起檔案啟動。 如果檔案所包含的代碼或腳本由系統自動執行(如 .exe、.msi和.js檔案),則你無法啟動這些檔案類型。此限制可防止使用者遭受可能修改系統的潛在惡意檔案的損害。如果包含的腳本由可隔離腳本的應用程式來執行(如 .docx 檔案),則你可以使用此方法來啟動這些檔案類型。word 等應用程式可防止 .docx 檔案中的腳本修改系統。
如果該應用不可見,則該調用将引發拒絕通路異常。
6.讀取和寫入檔案
(1)建立檔案。
在讀寫之前,應先建立一個全局變量samplefile,此變量表示寫入和讀取的檔案。利用以下代碼會建立sample.txt檔案,并存儲傳回的storagefile對象。
在文檔庫中建立檔案之前,必須在應用清單中聲明必要的功能。
(2)寫入檔案。
通過第一步我們建立了一個可寫入的檔案并擷取到了表示該檔案的storagefile對象。
下面介紹3種不同的寫入檔案方式。
直接将文本寫入檔案
通過使用fileio類的writetextasync方法,将文本寫入檔案。以下代碼主要是調用wirtetextasync (file,contents)來将一些随機的文本寫入sample.txt。
windows.storage.fileio.writetextasync(samplefile, “swift as a shadow”).then(function (){});
盡管writetextasync方法沒有傳回值,但仍可以在将文本寫入檔案之後使用then或done來聲明函數并執行其他任務。
使用緩沖區将位元組寫入檔案
首先要擷取寫入檔案的位元組緩沖區。以下代碼示例中我們通過使用convertstringtobinary來擷取基于随機字元串的位元組緩沖區。
然後我們通過調用fileio類的writebufferasync方法,将位元組從你的位元組緩沖區寫入檔案。以下代碼是将位元組緩沖區寫入到samplefile。
盡管writebufferasync方法沒有傳回值,但仍可以在将文本寫入檔案之後,使用then或done來聲明函數并執行其他任務。
使用事物處理流将文本寫入檔案
首先,通過調用 storagefile.opentransactedwriteasync 方法,打開到檔案的流。打開操作完成後,它将傳回檔案的内容流。如下所示的代碼示範了如何打開到samplefile的檔案流。
samplefile.opentransactedwriteasync().then(writetostream);
可以看到,上面的一行代碼中有一個函數writetostream,我們接下來需要聲明并定義此函數,以便可以在流打開之後對檔案進行寫操作。如下所示的代碼使用transaction建立新的datawriter對象并調用該對象的writestring方法,進而将文本寫入流:
最後通過調用datawriter.storeasync和transaction.commitasync方法将文本儲存到檔案中并關閉流。
(3)從檔案讀取。
接下來我們講解當你有一個可讀取的檔案以及一個表示該檔案的storagefile時從該檔案讀取的方法。
下面主要介紹3種不同的從檔案讀取方式。
從檔案讀取文本
通過使用fileio類的readtextasync方法,從檔案讀取文本。如下所示的代碼仍以samplefile為例,示範從檔案讀取文本。可以使用 then 或 done 來聲明函數以捕獲和處理從檔案讀取的文本。在 readtextasync 方法完成之後,會将該文本作為 string 對象(示例中的 contents)傳遞給此函數。
通過使用緩沖區從檔案讀取位元組
通過調用 fileio 類的 readbufferasync 方法,将位元組從你的檔案讀入到緩沖區。可以使用 then 或 done 來聲明函數以在 readbufferasync 方法完成之後捕獲和處理 buffer(類型 ibuffer)資料。如下所示的代碼捕獲 buffer 并使用 datareader 對象來讀取 buffer 的長度:
使用流從檔案讀取文本
首先,通過調用 storagefile.openasync 方法,從檔案打開流。打開操作完成後,它将傳回檔案的内容流。必須確定聲明某個函數(這裡是readfromstream)以捕獲流(類型irandomaccessstream),以便可以在該方法完成後從該流進行讀取。
samplefile.openasync(windows.storage.fileaccessmode.readwrite).then(readfromstream);
接着,我們就要聲明函數readfromstream。從readstream擷取要讀取的對象datareader,然後通過調用datareader的loadasync和readstring方法讀取文本。最後不要忘記關閉流。