2017-06-24 7 views
-2

bekomme ich eine IllegalStateException auf einigen der neueren Android-Modelle, wenn ich den Mediaplayer aufrufe. Seine meist Android 6. und 7 Telefone. Ich kann mir nicht vorstellen, wie ich das beheben kann, und die anderen "Fragen" scheinen sich nicht auf mein Problem zu übertragen.Schwerwiegende Ausnahme: java.lang.IllegalStateException bei android.media.MediaPlayer

Am immer diese Stacktrace:

Fatal Exception: java.lang.IllegalStateException 
    at android.media.MediaPlayer._prepare(MediaPlayer.java) 
    at android.media.MediaPlayer.prepare(MediaPlayer.java:1369) 
    at org.my.app.IntroVideoSurfaceView.surfaceCreated(IntroVideoSurfaceView.java:51) 
    at android.view.SurfaceView.updateWindow(SurfaceView.java:712) 
    at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:316) 
    at android.view.View.dispatchWindowVisibilityChanged(View.java:10434) 
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1330) 
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1330) 
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1330) 
    at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1330) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1751) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1438) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7398) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:695) 
    at android.view.Choreographer.doFrame(Choreographer.java:631) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:158) 
    at android.app.ActivityThread.main(ActivityThread.java:7224) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

Dies ist meine Klasse:

public class IntroVideoSurfaceView extends SurfaceView implements SurfaceHolder.Callback { 

private MediaPlayer mp; 
private boolean has_started = false; 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) public IntroVideoSurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
    super(context, attrs, defStyleAttr, defStyleRes); 
    init(); 
} 

public IntroVideoSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    init(); 
} 

public IntroVideoSurfaceView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 

public IntroVideoSurfaceView(Context context) { 
    super(context); 
    init(); 
} 

private void init() { 
    mp = new MediaPlayer(); 
    getHolder().addCallback(this); 
} 

@Override public void surfaceCreated(SurfaceHolder holder) { 
    AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.onboarding); 
    try { 
     if (!has_started) { 
      has_started = true; 
      mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); 
     } 


     mp.prepare(); 


     android.view.ViewGroup.LayoutParams lp = getLayoutParams(); 
     lp.height = getHeight(); 
     lp.width = getWidth(); 

     setLayoutParams(lp); 
     mp.setDisplay(getHolder()); 
     mp.setLooping(true); 
     mp.start(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
} 

@Override public void surfaceDestroyed(SurfaceHolder holder) { 
    mp.stop(); 
    } 
} 

Dies ist meine XML-Datei i in der Aktivität rufen Sie das Video zeigen:

 <org.my.app.IntroVideoSurfaceView 
     android:id="@+id/surface" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
+0

Welche Zeile ist in der Nummer 51? – Sanoop

+0

Zeilennummer 51 ist: mp.prepare(); – datasmurfen

+2

Sind Sie sicher, dass, wenn Sie das mp.prepare() erreichen, der mp im Status "initialisiert" – Alex

Antwort

1

Am Ende der Testschleife, Sie start() der Media Player (Started Zustand). Wenn Sie prepare() später rufen dann würde eine IllegalStateException geworfen werden, weil Sie nur prepare() von einem Initialized Zustand nennen kann (der Stopped Zustand, dass Sie den Media-Player setzen mit surfaceDestroyed() ist nicht ein gültiger Zustand prepare() aus anrufen). Siehe state diagram here, und beachten Sie, dass gemäß the surface life-cycle, surfaceCreated() kann mehrmals aufgerufen werden. Daher sollten Sie mindestens mp.prepare() in den if Block setzen.

Verwandte Themen