微軟官方對HoloLens的開發提供了兩種常用方法,使用VS2015和Unity HoloLens專用版本。其中VS方式可以利用通用Windows模版Holographic DX11 App生成框架代碼,Unity方式可以導入HoloToolkit這個官方推薦的工具集加速開發。
HoloLens運行在Win10系統,其應用程序為UWP App,這種App的權限受到比較大的限制,使用API時務必在Package.appxmanifest或unity設置里申請對應權限。此外,由於HoloLens生態還未成熟,微軟目前對其做出了更多的限制,這些限制通常是由於設備特殊性或功能暫未集成造成,有些限制會在未來的版本解除。當前限制可參考:
1.Current limitations for apps using APIs from the shell
此外,以下記錄實際操作中遇到的一些細節問題,供大家參考。特別注意,曾親歷過同樣的API在舊版系統拋異常,但更新系統后可用的情況。因此在不同版本環境下可能出現不同結果,記錄問題時使用的環境如下:
開發環境:Win10 X64 10586版本, VS 2015 update3, Unity 5.4.0b24-HTP
HoloLens:10.0.14342.1018版本
一、文件系統
a.KnownFolder路徑獲取方式的異同
UWP程序的文件操作使用Windows.Storage命名空間的API,其中最常用的一個類為KnownFolders。這個類包括常用目錄的屬性和獲取目錄的方法,例如相機膠卷目錄這個常用目錄,可以使用兩種方式獲取,返回類型都為StorageFolder。
- 使用屬性KnownFolders.CameraRoll
- 使用方法KnownFolders.GetFolderForUserAsync(null, KnownFolderId.CameraRoll); 第一個參數為User,通過微軟在Github的Sample Code可知指定null代表當前用戶。
當前MSDN文檔並未說明二者的區別,實際使用時會發現返回值中的路徑域有所不同:
方法1為C:\Data\Users\DefaultAccount\Pictures\Camera Roll
方法2為C:\Data\Users\DefaultAccount\AppData\Roaming\Microsoft\Windows\Libraries\ CameraRoll.library-ms
注意:
如使用Windows.Storage的文件類StorageFile來操作枚舉目錄中的文件,則兩者沒有區別,文件的路徑並不受目錄路徑影響,都會得到形如方法1的路徑。如(xxxFolder設為前步返回值):
IReadOnlyList<StorageFile> fileList = await xxxFolder.GetFilesAsync();
foreach (StorageFile file in fileList) { /* file.path is the same */ }
但是,如果需要使用目錄路徑來拼路徑,則需注意!例如Unity的WWW需要路徑參數,這里的目錄路徑需使用方法1的返回路徑,使用b會導致無效參數的錯誤。
b.暫不能操作的常見目錄
結果:讀取即可導致拋異常。
KnownFolderId.HomeGroup
KnownFolderId.MediaServerDevices
KnownFolderId.RemovableDevices
c.拷貝API的異常
結果:目標目錄已含被拷貝文件,會導致異常。
如拷貝xFile到xFolder:
xFile.CopyAsync(xFolder) // Exeption if xFolder already has xFile
如需強行拷貝需使用如下方法:
xFile.CopyAsync(xFolder, xName, NameCollisionOption.ReplaceExisting);
但有個例外,即xFile就在xFolder目錄時,上述API仍然會異常。
d.DP權限問題
使用DevicePortal從電腦傳入HoloLens的文件,權限設置存在問題,普通App無權訪問。訪問即拋System.UnauthorizedAccessException。
如:向相機目錄傳入一張合格照片,Hololens的內置Photo應用是看不到此照片的。
二、權限問題
a.位置權限
調用GPS相關API,程序的manifest指定了Location權限,在首次運行時仍然需要一次確認,Hololens App可以調用Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"))把系統設置的隱私頁彈出,讓用戶選擇允許。操作之后,在模擬器下才可以得到准確的經緯度信息。
b.用戶賬戶信息權限
雖然此功能並未列在Hololens官方的限制列表,實測時發現用戶賬戶信息枚舉不到,但同樣代碼在普通Win10設備可以成功獲取。這一點也作為試出的當前差異,列此備忘。