Resuelve el problema de que algunos teléfonos móviles no pueden leer obb

      Recientemente, se descubrió que un número muy pequeño de jugadores extranjeros ingresaron al juego con una pantalla negra después de descargarlo de Google Play Store. Verifique el registro de errores de bugly y descubrió que falló la lectura del archivo obb. La tienda de Google estipula que las apk de más de 100 m deben cargarse por separado del obb. Entonces esta situación solo aparecerá en el paquete del juego en la tienda de Google.
      La lectura de obb en mi proyecto se divide en dos situaciones: la primera es leer la API de Unity en sí, como el método Resources.Load (). La otra es encontrar la ruta del archivo obb a través del método original de Java y luego usar el método getInputStream para leer el archivo obb como un paquete zip.
      Después de varias exclusiones, se descubrió que para algunos modelos específicos, cuando se prohibía el permiso de READ_EXTERNAL_STORAGE (lectura de almacenamiento externo), habría una situación en la que el almacenamiento externo no se montaba y se devolvía desde el método Environment.getExternalStorageState() " desmontado".
En este caso, la ruta obtenida por getObbDir() no será accesible, por lo que no se podrá cargar el archivo obb. Lo sorprendente es que si no usa obb, simplemente puede usar la propia Application.persistentDataPath de Unity, y la ruta obtenida es operativa. Según el entendimiento normal, esta ruta está en data/storage/emulated/0/Android/data /com.xxx .xxx/files, y la ruta de obb generalmente está en data/storage/emulated/0/Android/obb/com.xxx.xxx. ¿Podría ser que Android/data/ no requiera permisos, pero Android /obb/ ¿lo hace?
      Con esta pregunta, intenté mostrar Application.persistentDataPath usando OnGUI en Unity, y luego abrí y deshabilité el permiso READ_EXTERNAL_STORAGE respectivamente. Finalmente encontré el problema.
Cuando hay permiso de lectura, la ruta de acceso predeterminada de la aplicación es la carpeta data/storage/emulated/0/Android/.
Cuando el permiso de lectura y escritura está prohibido, se prohíbe el acceso al directorio de almacenamiento, que es el llamado desmontado, por lo que se asignará Se utiliza otro directorio como directorio de acceso predeterminado del programa: datos/usuario/0/ donde 0 es el número de serie del usuario. Se dice que Android 6.0 admite múltiples usuarios, por lo que existe esta carpeta.
      La API de Unity debe ser independiente de los recursos normales para la lectura de obb. persistenteDataPath puede obtener la ruta normalmente, pero la estimación de la ruta de obb aún se obtiene mediante métodos como getObbDir, por lo que no se puede acceder a la ruta y la carga de obb falla.
      Hemos estado discutiendo algunos teléfonos móviles especiales. Este no es el caso de los teléfonos móviles normales. Después de desactivar el permiso READ_EXTERNAL_STORAGE, los teléfonos móviles normales aún pueden acceder a la carpeta data/storage/emulated/0/Android/ normalmente. Environment.getExternalStorageState( ) también está "montado". Entonces, por supuesto, este tipo de problema solo aparecerá en teléfonos móviles con Android 6.0 y superiores, porque los teléfonos móviles inferiores a 6.0 no tienen la operación de solicitar permisos dinámicamente.
      Entonces intenté obtener permiso para resolver este problema. La idea normal es muy simple. Solo necesitas juzgar si tienes este permiso cuando comienza el juego. Si no tienes permiso, aparecerá una ventana emergente para la aplicación de permiso dinámico y permitirá que el usuario acepte la autorización. .
      Sin embargo, en la operación real, se descubrió que si el estado de autorización de permiso en la configuración de esta parte del teléfono móvil está prohibido, no aparecerá la ventana de autorización en absoluto y devolverá directamente el rechazo. En este caso, mi suposición personal es que los sistemas Android 6.0 y posteriores generalmente tienen permiso, consulta y prohibición para tres tipos de permisos, y al prohibir, generalmente hay una pequeña opción, "Sin mensaje después de la prohibición". Pero en el sistema de telefonía móvil problemático, este estado en realidad no se solicita. Si está deshabilitado en la configuración, el efecto equivalente es que no se solicitará después de la prohibición.
      Por lo tanto, todavía no podemos resolver este problema a través de la ventana emergente de permisos. Podemos ayudar a los jugadores a saltar al panel de configuración del teléfono móvil, permitiéndoles modificar la configuración manualmente. El método de salto es:
Intent myAppSettings = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse(“package:” + getPackageName())); startActivityForResult
(myAppSettings, REQUEST_APP_SETTINGS);       Al final, lo que queremos lograr es minimizar el daño, de modo que la mayoría de los jugadores normales aún puedan autorizar permisos a través de la ventana emergente de permisos y permitir que una pequeña cantidad de usuarios que no abren la ventana salten a la ventana emergente. Panel de configuración del teléfono móvil. Por lo tanto, no es posible juzgar directamente si se necesita una ventana emergente mediante permisos. Afortunadamente, cuando estábamos juzgando el método de montaje antes, descubrimos que la característica de este tipo de teléfono móvil es que si está prohibido leer el permiso de almacenamiento externo, el método de montaje se "desmonta", por lo que podemos juzgarlo primero por el método de montaje. método. Si se encuentra "desmontado", primero solicite al reproductor que configure manualmente la autorización.

Supongo que te gusta

Origin blog.csdn.net/liweizhao/article/details/104892628
Recomendado
Clasificación