2015-04-28 14 views
5

Ich entwickle eine Android-Anwendung, in der ich versuche, ein GIF-Bild anzuzeigen. Dafür verwende ich die Movie-Klasse und erstellt eine Klasse GIFView, die Ansicht erweitert. Ich erhalte eine Movie-Instanz von der Movie.decodeFile-Methode.Android Fehlersignal 11, wenn ein Film in eine Leinwand zeichnet

Ich erhalte einen Fehler, wenn Movie.draw (Canvas) aufgerufen wird.

04-28 13:44:18.001: A/libc(24883): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 24883 (mple.channel002) 

Es ist der betreffende Code:

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(); 
     } 
    } 

ich eine GIFView im Haupt erstellen, rufen Sie über setGIF Methode den Weg zu geben und sie in das Layout mit FillParent Parameter hinzuzufügen. Es funktioniert, wenn ich dieses Bild in einem ImageView drucke. Das Zeichnen eines Zeichenbereichs in der Zeichenfläche anstelle des GIF funktioniert auch. Also scheint das Problem mit der Movie-Instanz zu tun zu haben.

benutzen ich diese Links die GIFView zu machen http://weavora.com/blog/2012/02/07/android-and-how-to-use-animated-gifs/

ich es auf diese Weise auch versucht, aber gleichen Fehler auf movie.draw Info about the Movie class for Android

EDIT1: ich meine Tests auf einem Oppo 7a Auf Android 4.4.2/snapdragon 801/2GB Das Ändern von movie.draw (Leinwand, 10, 10) in movie.draw (Leinwand, 10f, 10f) ändert nichts.

EDIT2: ich nur getestet auf einem alten ZTE-Gerät mit Android 2.3.5 und es funktionierte .. So etwas falsch ist, wenn sie auf Find7a Gerät starten, aber ich kann nicht herausfinden, was :(

+0

Ich weiß nicht die Lösung, aber ich habe einige Fragen über das Problem: Haben wir etwas über Ihre Laufzeitumgebung wissen? Teste du es auf Emulator oder Telefon? Ich sah auch, dass movie.draw auf float statt int wartet. Hast du es mit Floaten versucht? wie: movie.draw (Leinwand, 10f, 10f); – kisstajmi

+0

Ich mache meine Tests auf einem Oppo Find 7a auf Android 4.4.2/Snapdragon 801/2GB und die Änderung von movie.draw (Leinwand, 10, 10) zu movie.draw (Leinwand, 10f, 10f) ändert nichts. – Vrong

+0

Vielleicht gibt es ein Problem mit dem Betriebssystem oder dem genauen Gerät. Bitte versuchen Sie es im Emulator, wenn es möglich ist. Sie können auch nach gerätespezifischen Problemen suchen. – kisstajmi

Antwort

5
!

ENDLICH ich die Antwort gefunden, scheint es, dass auf einigen Android-Version oder Geräte-Hardware-Beschleunigung deaktiviert werden muss
ich das dieses zu meinem Manifest gerade hinzugefügt:.

<application android:hardwareAccelerated="true" ...> 

Mor Informationen zur Aktivierung/Deaktivierung der Hardwarebeschleunigung finden Sie unter here.

5

Ich fand eine andere Lösung - Sie müssen Hardware-Beschleuniger nur auf dieser speziellen Ansicht deaktivieren, die Sie Film zeichnen. nächste Zeile verwenden:

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

Reference (Ansichtsebene) https://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling

+0

Diese 1 funktionierte für mich. – Braj

+0

Alter danke. Mein Herz setzte einen Schlag aus, als ich zum ersten Mal meine App in Lollipop lief. –