¿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.

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.

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!

  • Intent.ACTION_USER_PRESENT no recibido en dispositivos HoneyComb o ICS (Samsung)
  • Widget de aplicación no se muestra en el cajón de aplicaciones de ICS
  • Android - Navegación con pestañas en orientación horizontal
  • Nombre del paquete no mostrado en Logcat en ICS
  • Error de construcción: emulador de emparedado de helado en Ubuntu
  • AssertionFailedError en ApplicationTestCase.createApplication () en versiones más recientes de Android cuando se utiliza MockContext
  • Cómo grabar el video usando la vista previa de la cámara en TextureView
  • Haga clic en Eventos que no funcionan en Nexus S ICS (4.0.4) en Todos los navegadores
  • Error en la entrega de resultados de la galería
  • Mi aplicación funciona en Gingerbread ... Crash en ICS y HC
  • ¿"Borrar datos" también matan a la aplicación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.