微软官方对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
2.App model
此外,以下记录实际操作中遇到的一些细节问题,供大家参考。特别注意,曾亲历过同样的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。
当前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设备可以成功获取。这一点也作为试出的当前差异,列此备忘。