2017-06-24 1 views
-2

Je reçois une exception IllegalStateException sur certains des nouveaux modèles Android lorsque j'appelle le Mediaplayer. C'est principalement Android 6. et 7 téléphones. Je n'arrive pas à comprendre comment résoudre ce problème, et les autres "Questions" ici ne semblent pas s'appliquer à mon problème.Exception fatale: java.lang.IllegalStateException à android.media.MediaPlayer

reçois ce 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) 

Ceci est ma classe:

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

Ceci est mon fichier xml j'appelle l'activité pour montrer la vidéo:

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

Quelle ligne est dans le numéro 51? – Sanoop

+0

Le numéro de ligne 51 est: mp.prepare(); – datasmurfen

+2

Etes-vous sûr que lorsque vous atteignez le mp.prepare() le mp dans le statut "Initialisé" – Alex

Répondre

1

À la fin de la boucle d'essai, vous start() le lecteur multimédia (état Started). Si vous appelez prepare() plus tard alors un IllegalStateException serait se jeter, parce que vous ne pouvez appeler prepare() d'un état Initialized (l'état Stopped que vous mettez le lecteur multimédia avec surfaceDestroyed() est pas un état valide pour appeler prepare() de). Voir le state diagram here, et notez que selon the surface life-cycle, surfaceCreated() peut être appelé plusieurs fois. Par conséquent, vous devriez mettre mp.prepare() à l'intérieur du bloc if à tout le moins.