最近发现,有很⼩⼀部分海外的玩家在⾕歌商店下载游戏之后,进游戏⿊屏。从bugly上⾯查看报错⽇志,发现是读取obb⽂件失败了。⾕歌商店规定超过100m的apk,需要分离obb上传。所以这种情况只会出现在⾕歌商店的游戏包⾥⾯。
我的项⽬⾥⾯读取obb是分成2种情况的,第⼀种,是unity本⾝的api读取,⽐如Resources.Load()⽅法。另⼀种,是通过java原始⽅法,到obb⽂件的路径,然后通过getInputStream⽅法,把obb⽂件当作是zip包⼀样读取。
经过多⽅⾯的排除,发现是某些特定的机型,在READ_EXTERNAL_STORAGE(读取外部存储)的权限禁⽌的情况下,会出现⼀个外部存储没挂载的情况,从ExternalStorageState()⽅法返回了"unmounted"。
为啥网页打不开在这种情况下,getObbDir()得到的路径会访问不了,所以导致了obb⽂件加载不到。很神奇的是,如果不⽤obb,单纯⽤unity本⾝的Application.persistentDataPath,获取的路径是可操作的,这个路径按正常的理解,是在
data/storage/emulated/0/Android/x/files下,⽽obb的路径⼀般是在
data/storage/emulated/0/Android/x下,难道是Android/data/不需要权限,⽽Android/obb/需要权限?
带着这个疑问,我尝试着把Application.persistentDataPath在unity⾥⾯⽤OnGUI显⽰出来,然后分别打开和禁⽤
赵丽颖结婚了吗READ_EXTERNAL_STORAGE权限。终于发现了问题的所在。
当有读权限的时候,应⽤默认访问的路径是data/storage/emulated/0/Android/⽂件夹
当读写权限被禁⽌的时候,storage⽬录被禁⽌访问,就是所谓的没有挂载,所以会分配了另外⼀个⽬录作为程序的默认访问⽬录:
data/user/0/ 其中0是⽤户序号,据说安卓6.0之后⽀持多⽤户,所以有这个⽂件夹。
Unity的api对obb读取⽅式应该是独⽴于正常资源的,persistentDataPath可以正常的获取到路径,但obb的路径估计还是通过getObbDir 之类的⽅法得到的,所以导致了路径不能访问,加载obb失败了。
我们⼀直讨论的都是某部分特殊的⼿机,正常的⼿机不会这样,正常⼿机在禁⽤了READ_EXTERNAL_STORAGE权限之后,还是能正常访问data/storage/emulated/0/Android/⽂件夹
的,ExternalStorageState()获取也是"mounted"的。然后,这种问题当然只会出现在安卓6.0及以上的⼿机,因为6.0以下的⼿机不存在动态申请权限的操作。
大陆男演员于是尝试获取权限去解决这个问题。正常的思路很简单,只需要在游戏启动的时候,判断⼀下是否拥有这个权限,如果没有权限就弹出动态权限申请的弹窗,让⽤户同意授权就⾏了。
然⽽实际操作中,发现这部分的⼿机,在设置⾥⾯的权限授权状态如果是禁⽌的,那么他就根本不会弹出授权窗⼝,直接就返回了拒绝。这个情况,我个⼈的猜测是,安卓6.0以后的系统,对于权限⼀般会有允许,询问,禁⽌三种,然后在禁⽌的时候,⼀般会有个⼩选项,“禁⽌后不再提⽰”。但在出问题的⼿机系统⾥⾯,实际上是没有询问这种状态的,如果在设置⾥⾯禁⽌了,等同的效果是禁⽌后不再提⽰。
中药学就业前景所以,我们还是不能通过权限弹窗去解决这个问题。我们可以帮助玩家跳转到⼿机设置⾯板去,让玩家⼿动去修改设置。跳转的⽅法是:极限挑战停播原因
Intent myAppSettings = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse(“package:” + getPackageName()));
刘德华儿子startActivityForResult(myAppSettings, REQUEST_APP_SETTINGS);
但这种操作⽐较的不友好,玩家也不⼀定知道怎样操作。
最终我们想达到的⽬的是让伤害降低到最⼩,让⼤部分正常的玩家还是可以通过权限弹窗去授权权限,让⼩部分不会弹窗的⽤户,跳转去⼿机设置⾯板。于是不能通过权限去直接判断是否需要弹窗。幸好之前我们在判断挂载⽅式的时候,发现了这种⼿机的特点是如果禁⽌读取外部存储权限时,挂载⽅式是"unmounted"的,所以我们可以通过挂载⽅式,先判断⼀下。如果发现了"unmounted"的,就先提⽰玩家去⼿动设置授权。
发布评论