Problemas encontrados por la apk empaquetada de Unity en la caja de Android 4.4.2

Escenario del proyecto:

Los proyectos desarrollados con Unity deben ejecutarse en Android 4.4.2.


Descripción del problema

1、会出"Deslícese hacia abajo desde la parte superior para salir del modo de pantalla completa." cuadro emergente,这是android4.4的一个特性,叫做沉浸模式(Full-screen Immersive Mode),当app启用该模式时,应用程序的界面会占据整个屏幕,屏幕上方的状态栏和下方的导航栏会被隐藏,从屏幕顶端向下滑动就可以再次呼出状态栏和导航栏,系统为了提醒用户就多加了一个提示装口。需要去掉这个弹框,否则用户无法进行下面的操作。
2、部分项目在启动过程中加载很慢,经测试有三款项目在启动过程有20-30秒的加载时间;加载时间过长需要优化。


Análisis de causa:

1. Es causado por las características de Android 4.4 y superiores, pero la mayoría de las cajas han sido optimizadas para esta característica. Algunos modelos de cajas no han sido optimizados, por lo que ocurrirá este problema.

2. Posibles causas de los problemas de carga: recursos demasiado grandes, problemas con los métodos de empaquetado y problemas con los métodos de carga.


solución:

1 、

El primer método: ( Este método no funciona después de la prueba, puede ser un problema de mi parte )

Este mensaje puede causar problemas en algunas situaciones especiales. Por ejemplo, algunos sistemas Android profundamente personalizados no pueden usar el mouse o la pantalla táctil. Al abrir una aplicación de pantalla completa, una vez que aparece este mensaje, no se puede eliminar, lo que afecta en gran medida la experiencia del usuario. . Por lo tanto, es necesario eliminar esta ventana de aviso.


Esto no significa eliminar la función del modo inmersivo de Android, sino solo eliminar la ventana de aviso.


El código relevante se encuentra en el archivo ImmersiveModeConfirmation.java en el directorio frameworks/base/policy/src/com/android/internal/policy/impl/. Abra este archivo y busque:
 


private final class H extends Handler {
         private static final int SHOW = 0;
         private static final int HIDE = 1;
 
         @Override
         public void handleMessage(Message msg) {
             switch(msg.what) {
                 case SHOW:
                     handleShow((String)msg.obj);
                     break;
                 case HIDE:
                     handleHide();
                     break;
             }
         }
     }

La función de este código es llamar y ocultar la ventana de aviso. Solo necesitamos bloquear handleShow((String)msg.obj) y handleHide() en el método handleMessage.

El segundo método: volver a crear el método onWindowFocusChanged (este método se puede eliminar después de probar con cocos, pero no con unity)

public void onWindowFocusChanged(boolean hasFocus){
 super.onWindowFocusChanged(hasFocus);
if(hasFocus){
showSystemUI();
}
}

public void showSystemUI(){

Handler mHandler = new Handler(){
public void handleMessage(Message msg){

getWindow().getDecorView().setSystemUiVisibility()(

View.SYSTEM_UI_FLAG_STABLE|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
);

}

};
mHandler.sendEmptyMessageDelayed(0,100);
}

Después de reescribir, el proyecto cocos puede eliminar el cuadro emergente y ejecutarse normalmente, pero el proyecto Unity aún no funciona, continúe buscando otras soluciones;

Soporte técnico de otras empresas sugiere modificar el tema de la actividad: a "@android:style/Theme.Translucent.NoTitleBar.Fullscreen"

El tema de Aplicación se modifica a;

<style name="titleTheme" parent="android:Theme" >
        <!-- <item name="android:windowTitleSize">30dp</item>  -->
        <item name="android:windowTitleBackgroundStyle">@style/CustomWindowTitleBackground</item>
        <item name="android:windowTitleStyle">@style/CustomWindowTitle</item>
        <item name="android:windowTitleSize">0sp</item>
    </style>

Incluso después de modificar el tema, todavía no funciona;

Tercer método: utilizar el complemento de Unity (unityShowAndroidStatusBar.aar)

Debería poder buscar este complemento en línea. Alguien lo empaquetó y lo compartió. Cuando encontré este problema antes, la tecnología de la compañía usó complementos para resolver problemas similares, pero aún así no funcionó después de usar los complementos. Sospeché que era un problema de la versión de Unity. Ahora estoy usando unity2019.4.9f1 , y antes usaba unity5.4.5f1; entonces, use la versión 5.4.5 de Unity para crear un proyecto vacío, agregue el complemento y ejecútelo en el cuadro, eliminando exitosamente el cuadro emergente. Por lo tanto, todos los proyectos se degradarán de 2019 a 5.4.5 (degradar la versión es muy doloroso).

2. Solución al problema de carga: (Los proyectos con problemas de carga son proyectos de Unity, y hay tres modelos sin problemas de carga, y tres modelos sí) Primero optimice el cuerpo del paquete, el cuerpo del paquete se optimiza de 38 MB a 15 MB, y el tiempo de carga es el mismo; continúe modificando el Método de empaquetado, cambie el método de empaquetado para que sea consistente con el proyecto sin problema, pero todavía no funciona; use el empaquetado de Unity para exportar y luego empaquete con android studio, pero todavía no funciona; puedo ver en el registro que el progreso de carga es del 4% y esperé 20 segundos antes de continuar con la carga, y no se informó ningún error en el medio; sospeché que fue causado por un gran archivo de recursos. Revisé el proyecto y descubrí que había un archivo de audio que era grande, 2,5 M. Eliminé directamente el paquete de audio y lo probé. El tiempo de carga fue de 3 segundos. El problema debería estar en el audio. El archivo es subido, y continúo mirando los otros dos juegos. Efectivamente, ambos tienen archivos de audio más grandes. Comprimí los archivos de audio a 300 Kb de tamaño y los probé después del empaquetado. La carga sigue siendo muy rápida. En este punto, el El problema está resuelto. Todos los archivos de audio están comprimidos y reempaquetados. Todo pasó después de las pruebas.

Subiré el complemento a csdn más tarde o simplemente me enviaré un mensaje privado para recibirlo.

Supongo que te gusta

Origin blog.csdn.net/leo347/article/details/130430265
Recomendado
Clasificación