解決部分手機讀取obb失敗的問題

      最近發現,有很小一部分海外的玩家在谷歌商店下載遊戲之後,進遊戲黑屏。從bugly上面查看報錯日誌,發現是讀取obb文件失敗了。谷歌商店規定超過100m的apk,需要分離obb上傳。所以這種情況只會出現在谷歌商店的遊戲包裏面。
      我的項目裏面讀取obb是分成2種情況的,第一種,是unity本身的api讀取,比如Resources.Load()方法。另一種,是通過java原始方法,找到obb文件的路徑,然後通過getInputStream方法,把obb文件當作是zip包一樣讀取。
      經過多方面的排除,發現是某些特定的機型,在READ_EXTERNAL_STORAGE(讀取外部存儲)的權限禁止的情況下,會出現一個外部存儲沒掛載的情況,從Environment.getExternalStorageState()方法返回了"unmounted"。
在這種情況下,getObbDir()得到的路徑會訪問不了,所以導致了obb文件加載不到。很神奇的是,如果不用obb,單純用unity本身的Application.persistentDataPath,獲取的路徑是可操作的,這個路徑按正常的理解,是在data/storage/emulated/0/Android/data/com.xxx.xxx/files下,而obb的路徑一般是在data/storage/emulated/0/Android/obb/com.xxx.xxx下,難道是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/文件夾的,Environment.getExternalStorageState()獲取也是"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"的,就先提示玩家去手動設置授權。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章