首页 > 代码库 > Hololens开发初探踩的一些坑

Hololens开发初探踩的一些坑

  微软官方对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。

  1. 使用属性KnownFolders.CameraRoll
  2. 使用方法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设备可以成功获取。这一点也作为试出的当前差异,列此备忘。

 

Hololens开发初探踩的一些坑