"Die Oberfläche wurde freigegeben" innen "surfaceCreated"

Ich weiß, das ist eine gemeinsame Frage, aber diese Stack-Trace zeigt etwas anderes ist falsch. Sie können sehen, dass, obwohl setDisplay(holder) innerhalb von surfaceCreated aufgerufen wird, surfaceCreated es immer noch IllegalArgumentException . Dies ist nicht eine seltene Ausnahme entweder, gestern passiert ~ 125.000 mal in ~ 3.000.000 Clip-Ansichten. Ich kann Ihnen versichern, dass auch mCurrentPlayer korrekt initialisiert ist.

SurfaceCreated:

  • Android getText aus EditText-Feld
  • Intercept Zurück-Taste von der Softtastatur
  • Android: Wie kann ich einen Dialog ohne Titel erstellen?
  • Wie fügt man Android-Lesezeichen auf Homescreen von Web-Seite?
  • Wie man die Übersetzung einer Ansicht animiert
  • ViewPager in einem ScrollView scrollt nicht korrekt
  •  @Override public void surfaceCreated(SurfaceHolder holder) { mIsSurfaceCreated = true; mCurrentPlayer.setDisplay(holder); } 

    SurfaceDestroy:

     @Override public void surfaceDestroyed(SurfaceHolder holder) { mIsSurfaceCreated = false; // Could be called after player was released in onDestroy. if (mCurrentPlayer != null) { mCurrentPlayer.setDisplay(null); } } 

    Stacktrace:

     java.lang.IllegalArgumentException: The surface has been released at android.media.MediaPlayer._setVideoSurface(Native Method) at android.media.MediaPlayer.setDisplay(MediaPlayer.java:660) at com.xxx.xxx.view.VideoPlayerView.surfaceCreated(VideoPlayerView.java:464) at android.view.SurfaceView.updateWindow(SurfaceView.java:543) at android.view.SurfaceView.access$000(SurfaceView.java:81) at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:169) at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:590) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1644) at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2505) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:4945) 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) 

    Irgendwelche Ideen, was sonst falsch gehen könnte? Ist SurfaceHolder potenziell die Oberfläche auf einem Hintergrund-Thread zu zerstören und dann auf den Haupt-Thread zu warten (derzeit besetzt von surfaceCreated ), um seinen Block zu beenden, bevor er surfaceDestroyed auf dem Haupt-Thread aufrufen kann (was ich nicht einmal finde, dass Sperren beheben können)? Etwas anderes?

    Update – Nach dem Bohren ein wenig weiter fand ich heraus, welche Ursachen "Die Oberfläche wurde freigegeben" geworfen werden :

    Welche referenzen android_view_Surface_getSurface finden Sie hier :

    Dies ist, wo mein Mangel an C ++ Wissen tut weh, es sieht aus wie es versucht, auf die Oberfläche zu sperren, und wenn es nicht die Oberfläche zurückgegeben wird null . Sobald es als null , wird IllegalArgumentException geworfen.

  • Overriding onOptionsItemSelected von SherlockFragmentActivity
  • Android: Howto Parse URL String mit Leerzeichen für URI-Objekt?
  • ActionBar in PreferenceActivity
  • Wie kann man überprüfen, ob das Paket im Inneren des Annotationsprozessors existiert (in Kompilierzeit)?
  • Daten vom NFC-Tag lesen (IsoDep)
  • Wie bekomme ich App-Nutzung in Android? Wie kann man erkennen, wann eine Aktivität gestartet wird?
  • 2 Solutions collect form web for “"Die Oberfläche wurde freigegeben" innen "surfaceCreated"”

    Ich habe gerade ein ähnliches Problem erkannt.

    Und meine Untersuchung zeigt, dass es einen Bug in der SurfaceView gibt, was die Übergabe der ungültigen Oberfläche an die Oberfläche verursacht. Rückrufmethode.

    Dies ist das Commit in der Android Repo, die es behebt: Link .

    Es scheint, dass fix in Android-Quellen in 4.2 Version eingeführt wurde. Und von den Abstürzen der Anwendung sehe ich, dass der Unfall, der durch ungültige Oberfläche verursacht wurde, nur auf 4.0 und 4.1 auftauchte.

    Also, ich kann davon ausgehen, dass vor 4,0 war es gültig, um ungültige Oberfläche auf den MediaPlayer passieren. Und es gab eine Veränderung der Logik von SurfaceView / MediaPlayer in 4.0, die dazu führte, dass dies nicht mehr gültig war. Aber Code in SurfaceView wurde nicht vor 4.2 aktualisiert (in dem dieses Problem in SurfaceView behoben ist).

    Ich habe in Git Repo von Android und wirklich, Version getaggt android-4.0.1_r1 nicht enthalten fix und Version getaggt android-4.2.1_r1 enthält es.

    Also, um es für Plattformen zu beheben, die keine Fixierung für sie enthält, manuell überprüfen, ob die Oberfläche gültig ist, bevor sie auf den MediaPlayer eingestellt ist, wird nur für Plattformen 4.0 benötigt und danach:

     @Override public void surfaceCreated(final SurfaceHolder holder) { final Surface surface = holder.getSurface(); if ( surface == null ) return; // on pre Ice Scream Sandwich (4.0) versions invalid surfaces seems to be accepted (or at least do not cause crash) final boolean invalidSurfaceAccepted = Build.VERSION.SDK_INT < Build.ICE_CREAM_SANDWICH; final boolean invalidSurface = ! surface.isValid(); if ( invalidSurface && ( ! invalidSurfaceAccepted ) ) return; _mediaPlayer.setDisplay(holder); } 

    Auf diese Weise wird auf älteren Plattformen ungültige Oberfläche erfolgreich auf den Media Player eingestellt und das Video wird abgespielt, auf den Plattformen 4.0-4.1 wird es ungültige Flächen wegwerfen (und ich denke, dass surfaceCreated wird wieder mit gültiger Oberfläche aufgerufen) und auf 4.2 Und spätere Oberfläche wird nur nicht mit ungültiger Oberfläche aufgerufen werden.

    Ich hatte solche Probleme in der Vergangenheit mit Android VideoViews / MediaPlayers. Es stellte sich heraus, dass die zugrunde liegende SurfaceView wurde Müll gesammelt. Ich löste es, indem ich einen onPreparedLister zum MediaPlayer hinzufügte und dann einen expliziten Verweis darauf in meiner Klasse hielt, während ich ihn benutzte. Vielleicht hilft das.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.