V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Xbathy
V2EX  ›  Android

Unity 编译的 Android 应用,访问 Application.PersistentDataPath: Access Denied

  •  
  •   Xbathy · 356 天前 · 7290 次点击
    这是一个创建于 356 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现象:App 编译出来之后,大概率可以正常运行,也就是可以访问这个路径。可以正常运行的情况下,运行几次之后或者过段时间就会报错 Access Denied.

    Application.PersistentDataPath:在安卓平台的路径为 Storage/emulated/0/Android/data/包名/files.

    设备:小米平板,系统 Android13.

    注:通过文件管理器查看,在 Storage/emulated/0/Android/data/包名/files 路径下目标文件是存在的,也不是文件占用问题,因为应用重启和设备重启都不起作用.

    请大佬提点可能是哪里的问题导致的!

    13 条回复    2023-11-20 16:25:07 +08:00
    dvsilch
        1
    dvsilch  
       356 天前
    不是很懂 Android ,猜测是 AndroidManifest.xml 里需要一些配置项,之前权限相关我看同事一般是通过修改这个文件来实现的
    sunny352787
        2
    sunny352787  
       356 天前
    没见过,Application.PersistentDataPath 一般不会有问题,大概率是你添加的文件路径写的有问题,输出一下检查看是不是有非法字符或者斜杠反斜杠之类的错误
    Xbathy
        3
    Xbathy  
    OP
       355 天前
    @dvsilch 是的,这里个里面也配置了,奇怪的就是这个权限会在运行几次之后失效,也就是没有权限访问了.
    Xbathy
        4
    Xbathy  
    OP
       355 天前
    @sunny352787 路径没问题,因为他可以正常读取文件,只是读取几次之后,或者过段时间就会没有权限了,很奇怪.
    vyronlee
        5
    vyronlee  
       355 天前
    我们项目也出现过类似问题,表现就是 AB 包文件是存在的( Load 之前我们会自己用接口先判断文件是否存在),也是能加载的,但是运行一段时间后某个时刻却又无法加载进来,非常怪异;
    社区里问过大佬,他们说是各家的安卓系统文件操作接口各种魔改作妖,未必是按照规范来,建议都加上 READ/WRITE_EXTERNAL_STORAGE 自己再测试验证(我没实测过,不做保证,因为副作用很大,APP 启动时会弹相册权限请求所以就放弃了)
    jetkeey
        6
    jetkeey  
       355 天前
    @vyronlee 最后你们是怎么解决这个问题呢
    vyronlee
        7
    vyronlee  
       355 天前
    没解决,发行方不让加权限。因为发生概率不是很大(大概 1w 次启动里有几十次发生)就搁置了。
    janus77
        8
    janus77  
       355 天前
    0 是 root 用户吧?这里应该用你当前用户的 uid 的,你这个看起来是硬编码,当然访问不了了,不能这样写,要用 Android 提供的 API
    Xbathy
        9
    Xbathy  
    OP
       355 天前
    @janus77 不是硬编码,这个是 Unity 的接口,会根据平台自动生成相应的路径.
    Xbathy
        10
    Xbathy  
    OP
       355 天前
    现在发现可能不是权限问题了,是 Unity 的 Application.PersistentDataPath 在安卓平台的值会变 大概率是 Storage/emulated/0/Android/data/包名/files. 偶尔会变成 data/user/0/包名/files. 这是什么情况...
    x13945
        11
    x13945  
       355 天前
    @Xbathy #10 前者是外置存储,后者在系统的 data 分区上。现象看起来像是外置存储的访问状态出了问题,才切换到了 data 分区。可以在出问题的时候,检查一下外置存储的状态。
    Xbathy
        12
    Xbathy  
    OP
       355 天前
    @x13945 这是不是得写 Java 了?
    x13945
        13
    x13945  
       355 天前
    @Xbathy #12 如果只是为了验证问题,可以在出现问题的时候执行 adb 命令:adb shell ls /sdcard/ 看看能否正常访问

    至于运行期间检测,我不太了解 Unity ,Java 有专门的 api:boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1507 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 17:19 · PVG 01:19 · LAX 09:19 · JFK 12:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.