¿Hay una manera de desactivar la aceleración de hardware sólo para android 4.0.3?
Recientemente he tropezado con un problema con Android 4.0.3, donde Im obtener la siguiente excepción tan pronto como la aplicación se inicia (en otras versiones de Android que funciona bien):
java.lang.NullPointerException at android.view.GLES20RecordingCanvas.drawPatch(GLES20RecordingCanvas.java:97) at android.graphics.NinePatch.draw(NinePatch.java:125) at android.graphics.drawable.NinePatchDrawable.draw(NinePatchDrawable.java:189) at android.widget.ImageView.onDraw(ImageView.java:892) at android.view.View.draw(View.java:10978) at android.view.ViewGroup.drawChild(ViewGroup.java:2887) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) at android.view.ViewGroup.drawChild(ViewGroup.java:2885) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) at android.view.View.getDisplayList(View.java:10415) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597) at android.view.View.getDisplayList(View.java:10380) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597) at android.view.View.getDisplayList(View.java:10380) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597) at android.view.View.getDisplayList(View.java:10380) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597) at android.view.View.getDisplayList(View.java:10380) at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:842) at android.view.ViewRootImpl.draw(ViewRootImpl.java:1910) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634) at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4424) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at dalvik.system.NativeStart.main(Native Method)
Esto está relacionado con la aceleración de hardware habilitada, tan pronto como lo deshabilite en el manifiesto la aplicación comienza a funcionar muy bien.
- Caché de ubicación en android ICS?
- Cómo cambiar el color de texto del conmutador en Android
- Tema del holo del uso en Android <
- Icono de pestaña que no se muestra
- ICS-buscando botones: ¿qué dibujable tengo que elegir en ICS SDK?
Al hacer una búsqueda encontré un registro (dentro de esa búsqueda de doc "drawPatch") en alguna conversación de Romain Guy, donde discute un poco de lo que podría estar causando esto, aunque no hay ninguna solución o solución propuesta, me pregunto si Debo desactivar la aceleración de hardware sólo para esta versión de Android, o si hay una solución para ello?
Gracias por tu tiempo.
- Cómo utilizar una función sólo si la versión es 11+
- Quitar heighlight del área del mapa de imágenes en la aplicación de Android 4.x a través de PhoneGap Build
- ImageView no escala en dispositivos de pantalla grande
- Android - botón del menú de la demostración en el nexo de la galaxia
- autolink no funciona en HTC - HtcLinkifyDispatcher
- Proteger un socket en VpnService
- Iniciar una intención de mensaje SMS ya no funciona para el nuevo sistema operativo RAZR ICS de Droid
- ¿Cómo pueden las fuentes provocar errores OpenGL fuera de la memoria?
Así que AC menciona esto en su comentario, pero permítanme elaborar.
Puede crear un booleano en un archivo de valores y pegarlo en la carpeta de versión correcta. En su manifiesto bajo
Consulta esta publicación: https://plus.google.com/+AndroidDevelopers/posts/DcsFABkyuYM .
Parece que va a querer orientar los valores-v15 / bools.xml
http://developer.android.com/reference/android/os/Build.VERSION_CODES.html#ICE_CREAM_SANDWICH_MR1
Actualmente, no puede deshabilitar la aceleración de hardware en el nivel de ventana por código.
Sólo habilítelo. Le sugiero que lo deshabilite de forma predeterminada en su manifiesto:
<application android:hardwareAccelerated="false"> <activity ... /> <activity android:hardwareAccelerated="false" /> </application>
Y luego habilitarlo a todas las otras versiones:
if (Build.VERSION.SDK_INT != Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); }
Puede desactivar la aceleración de hardware para una vista individual en tiempo de ejecución con el código siguiente:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
Esta información está disponible en Android – Controlling Hardware Acceleration
Me gusta la respuesta relacionada con @sgarman porque tiene un impacto mínimo en el código y es fácilmente mantenible. Sólo para expandir ese enlace, aquí es lo que hice para desactivar la aceleración de hardware sólo para Android v4.0.3 y sólo para una cierta actividad y funcionó para mí (recuerde agregar los encabezados xml especificando la versión y la codificación de los distintos archivos bool.xml , Ya que el editor de wiki no me dejó pegarlo):
AndroidManifest.xml: identifica la actividad que aloja la vista ofensiva e inserta esto en esa actividad:
<activity android:hardwareAccelerated="@bool/isNotIceCreamSandwich" ... </activity>
Ruta de acceso del archivo: res / values / bool.xml:
<resources> <bool name="isNotIceCreamSandwich">true</bool> </resources>
Ruta del archivo: res / values-v14 / bool.xml:
<resources> <bool name="isNotIceCreamSandwich">false</bool> </resources>
Ruta del archivo: res / values-v16 / bool.xml:
<resources> <bool name="isNotIceCreamSandwich">true</bool> </resources>
Este es un error gracioso causa aceleración de hardware está funcionando (a veces). He estado buscando la respuesta a esto durante los últimos dos días. Está documentado en ICS pero lo he notado en uno de mis teléfonos de prueba un Samsung Galaxy S3 que ejecuta 4.1.2 La mayoría de la gente sugiere desactivar la aceleración de hardware. Yo no quería hacer que la aceleración de hardware causa hace que mis animaciones tan suave. Por lo tanto, lo que encontré fue que si anulaba dibujar () intentamos capturar la excepción de puntero nulo, las funciones de hardware acelerado funcionan (la mayoría de las veces) y lo suficiente para que nunca se den cuenta de que no funcionan o lanzan la excepción. En mi caso estaba haciendo una vista personalizada y tenía algún dibujo personalizado para hacer. La comprobación simple para null no funciona (lienzo == null) que es por qué este error es un dolor. Así que lo que hice fue esto:
@Override public void draw(Canvas canvas) { try{ super.draw(canvas); mCanvas=canvas; }catch(java.lang.NullPointerException e){ Log.e("mytag","MyCustomView::draw():"+e); } if(mCanvas==null) return; ...
Entonces silenciosamente intento y atrapado cualquier NPE en declaraciones de dibujo individuales. La primera vez que vi este fallo rodeé todo el código draw () en un try y catch. Eso funcionó para la mayoría de los teléfonos, pero en el Samsung S3 que ejecuta 4.1.2 estaba causando un parpadeo. Así que utilicé el método anterior y lo intenté silenciosamente en cada llamada a someObject.draw (mCanvas) y eso resolvió el problema eliminando completamente el parpadeo (disparidad entre el caché de vista acelerada por hardware y el nuevo lienzo). ¡Espero que esto ayude! ¡Es mucho mejor que desactivar HWA!