HarmonyOS 鸿蒙Next中关于setPathAllowingUniversalAccess允许设置路径的疑问

HarmonyOS 鸿蒙Next中关于setPathAllowingUniversalAccess允许设置路径的疑问 1、参考文档:setPathAllowingUniversalAccess 允许设置跨域访问本地文件的路径,可以通过如下代码设置允许跨域访问的本地文件路径

this.controller.setPathAllowingUniversalAccess([
  this.uiContext.filesDir + '/example',
]);

2、参考文档:获取和修改加密分区,允许应用自定义文件的存储分区,实测通过如下代码修改应用文件分区后,再调用this.controller.setPathAllowingUniversalAccess设置允许跨域会报401的路径访问错误

this.context.area = contextConstant.AreaMode.EL1;

观察日志中context.filesDir的路径输出已经改成了 /data/storage/el1/base/haps/entry/files

3、疑问是setPathAllowingUniversalAccess的目录是否有特定的限制,this.context.area的设置是否无法应用于setPathAllowingUniversalAccess中?如果是建议在文档中注明


更多关于HarmonyOS 鸿蒙Next中关于setPathAllowingUniversalAccess允许设置路径的疑问的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

开发者你好,

this.context.area获取到的路径不在上述路径支持列表中,无法应用于setPathAllowingUniversalAccess

请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。

文档中已对路径要求做出说明,可参考:

当设置了路径列表时,file协议仅允许访问路径列表中的资源(fileAccess的行为将会被此接口行为覆盖)。路径列表中的路径必须满足以下路径格式之一:

1.应用文件目录的子目录(应用文件目录通过Ability Kit中的Context.filesDir获取),例如:

/data/storage/el2/base/files/example
/data/storage/el2/base/haps/entry/files/example

2.应用资源目录及其子目录(应用资源目录通过Ability Kit中的Context.resourceDir获取),例如:

/data/storage/el1/bundle/entry/resources/resfile
/data/storage/el1/bundle/entry/resources/resfile/example

3.从API version 21开始,还包括了应用缓存目录及其子目录(应用缓存目录通过Ability Kit中的Context.cacheDir获取),例如:

/data/storage/el2/base/cache
/data/storage/el2/base/haps/entry/cache/example

设置的目录路径中,不允许包含cache/web,否则会抛出异常码401。如果设置目录路径是cache,cache/web也不允许访问。

4.从API version 21开始,还包括了应用临时目录及其子目录(应用临时目录通过Ability Kit中的Context.tempDir获取),例如:

/data/storage/el2/base/temp
/data/storage/el2/base/haps/entry/temp/example

当路径列表中有其中一个路径不满足以上条件之一,则会抛出异常码401,并且设置路径列表失败。当设置的路径列表为空,则file协议可访问范围以fileAccess的行为为准。

更多关于HarmonyOS 鸿蒙Next中关于setPathAllowingUniversalAccess允许设置路径的疑问的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


两个问题:

  1. setPathAllowingUniversalAccess文档上的描述是“路径列表中的路径必须满足以下路径格式之一:1.应用文件目录的子目录(应用文件目录通过Ability Kit中的Context.filesDir获取),例如:” ,“例如”的描述会以为路径目录是举例,路径可改而不是固定;

  2. this.context.area按官网的描述是修改应用文件的存储路径,实际也确实能修改应用的文件存储路径,但是修改后,使用setPathAllowingUniversalAccess会报错,两者不一致,

尊敬的开发者,您好,该功能正在规划中,还请关注后续版本,感谢您的理解与支持。

尊敬的开发者,您好!您的问题已受理,请您耐心等待,感谢您的理解与支持!

在HarmonyOS Next中,setPathAllowingUniversalAccessFilePicker模块中的一个方法,用于设置文件选择器允许访问的路径。该方法可以指定一个目录路径,使得文件选择器在启动时默认打开该路径,并允许用户访问该路径及其子目录下的文件。这有助于提升应用的文件访问效率和用户体验。使用时需确保应用已获得相应的文件访问权限。

setPathAllowingUniversalAccess 方法用于配置WebView允许通过 file:// 协议访问的本地文件系统路径,以实现跨域访问。根据你的描述和代码分析,问题核心在于应用上下文(Context)的存储区域(Area)设置与 setPathAllowingUniversalAccess 的路径解析机制之间存在兼容性限制

问题分析:

  1. 默认行为:当未修改 context.area 时,应用使用默认的EL2加密分区。此时 context.filesDir 的路径格式为 /data/storage/el2/base/haps/entry/files。此路径可以被 setPathAllowingUniversalAccess 正常识别和处理。
  2. 修改Area后的异常:当你将 context.area 设置为 AreaMode.EL1 后,context.filesDir 的路径变更为 /data/storage/el1/base/haps/entry/files。此时调用 setPathAllowingUniversalAccess 设置该路径,WebView内部在尝试解析和授权此路径时,可能因安全策略或路径映射机制未完全适配自定义的Area模式,导致权限校验失败,从而引发401路径访问错误。

根本原因:

  • 安全沙箱限制:HarmonyOS的应用沙箱和WebView的本地文件访问机制之间存在严格的隔离策略。setPathAllowingUniversalAccess 的设计初衷是允许访问应用标准存储分区(EL2) 下的特定路径,以确保文件访问的安全性。
  • EL1分区兼容性:EL1分区通常用于存储敏感或加密数据,其访问控制策略可能更为严格。当前 setPathAllowingUniversalAccess 的实现可能未完全支持对非默认Area(如EL1)路径的授权,导致WebView无法正确映射和访问该路径下的文件。

结论:

是的,setPathAllowingUniversalAccess 对目录存在特定限制。它主要适用于应用默认的EL2加密分区路径。修改 context.area 为EL1后,该设置无法直接应用于 setPathAllowingUniversalAccess,因为WebView的跨域文件访问机制可能尚未适配自定义Area的路径解析和安全策略。

建议解决方案:

  1. 优先使用默认Area:如果无需强制使用EL1分区,建议保持 context.area 为默认的EL2模式,以确保 setPathAllowingUniversalAccess 的正常功能。
  2. 路径映射或代理:若必须使用EL1分区,可考虑以下替代方案:
    • 将需要跨域访问的文件复制或链接到EL2分区的路径下,然后授权该路径。
    • 通过WebView的拦截器或本地服务器(如ohos.net.http)代理文件请求,将EL1分区的文件以HTTP方式提供给WebView加载,避免直接使用 file:// 协议。

此问题反映了API在自定义存储分区场景下的兼容性限制,建议在开发中注意Area设置与WebView文件访问的协同。

回到顶部