java - reproducir - Señal de error 11 de Android cuando una película se dibuja en un lienzo
play view ha ocurrido un error (2)
Estoy desarrollando una aplicación de Android en la que estoy tratando de mostrar una imagen GIF. Para eso estoy usando la clase Movie y creé una clase GIFView que extiende View. Obtengo una instancia de Película del método Movie.decodeFile.
Me aparece un error cuando se llama Movie.draw (canvas).
04-28 13:44:18.001: A/libc(24883): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 24883 (mple.channel002)
Existe el código en cuestión:
public void setGif(File gif)
{
movie = Movie.decodeFile(gif.getAbsolutePath());
}
@Override
public void draw(Canvas canvas) {
// TODO Auto-generated method stub
super.draw(canvas);
canvas.drawColor(0xFFCC3C6C);
if(movie != null)
{
if(movieStart == 0)
movieStart = android.os.SystemClock.uptimeMillis();
int duration = Math.max(movie.duration(), 1000);
movie.setTime((int)(duration - ((android.os.SystemClock.uptimeMillis() - movieStart)%duration)));
movie.draw(canvas, 10, 10);//TODO CRASH
invalidate();
}
}
Creo un GIFView en el principal, llame al método setGIF anterior para darle la ruta y agregarlo al diseño con el parámetro FillParent. Funciona cuando imprimo esta imagen en un ImageView. También dibuja un dibujante en el lienzo en lugar del GIF. Entonces el problema parece tratarse con la instancia de la Película.
Utilicé estos enlaces para hacer GIFView http://weavora.com/blog/2012/02/07/android-and-how-to-use-animated-gifs/
También lo intenté de esta manera, pero el mismo error en movie.draw Información sobre la clase de película para Android
EDIT1: hago mis pruebas en un Oppo Find 7a en Android 4.4.2 / snapdragon 801 / 2GB Cambiar movie.draw (canvas, 10, 10) a movie.draw (canvas, 10f, 10f) no cambia nada.
EDIT2: Acabo de probar en un viejo dispositivo ZTE con Android 2.3.5 y funcionó ... Algo está mal cuando se inicia en el dispositivo Find7a pero no puedo entender qué :(
¡FINALMENTE! Encontré la respuesta, parece que en algunas versiones o dispositivos de Android la aceleración de hardware debe deshabilitarse.
Acabo de agregar esto a mi manifiesto:
<application android:hardwareAccelerated="true" ...>
Puede encontrar más información sobre el uso de la habilitación / deshabilitación de la aceleración de hardware aquí .
Encontré otra solución: tienes que deshabilitar el acelerador de hardware solo en esta vista específica para dibujar una película. Use la siguiente línea:
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
Referencia (nivel de vista) https://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling