Hi All,

  My application use MediaPlayer component to auto play 2 video files
in the SD card.
  and it continue to play these 2 video files until user touch the
screen then it will quit this activity.


  At the beginning, The media player these 2 video files very well (no
error), however when it play several times of the 2 video file, then
MediaPlayer server was died. it throws an exceptions"
Java.io.exception: setDataSource error 0x800000... and I quit my
application,  use Android device itself Video Player to play any video
files in the SD card, but it doesn't work too. shows Media Server
Error Dialog.

   I spent a whole day to check my application, but got no result.
    Attached is my source code, any body can help me?

package com.iqQuest.android.activities;

import java.io.File;

import com.iqQuest.android.structures.MediaType;
import com.iqQuest.android.utilities.MediaFilesHelper;

import android.app.Activity;
import android.app.AlertDialog;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnVideoSizeChangedListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;

public class FormVideoPlayer extends Activity  implements
OnBufferingUpdateListener, OnCompletionListener,
OnPreparedListener, OnVideoSizeChangedListener, OnErrorListener,
SurfaceHolder.Callback {
    /** Called when the activity is first created. */

    private static final String TAG = "FormVideoPlayer";
        private SurfaceView mPreview;
        private SurfaceHolder holder;
        private MediaPlayer mp;


    private boolean mIsVideoSizeKnown = false;
    private boolean mIsVideoReadyToBePlayed = false;
    private int mVideoWidth;
    private int mVideoHeight;
    private int mPreVideoHeight;
    private int mPreVideoWidth;
    private File[] mVideoFiles;
    private static int playIndex = 0;
    public static boolean IsActive = false;

    private boolean mifQuit = false;

    private int playCount = 0;
    private String title = "";
    private boolean isSetVideoSize = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.form_video_player);

        mVideoFiles =
MediaFilesHelper.getInstance().load(MediaType.VIDEO);

        mPreview = (SurfaceView) findViewById(R.id.SurfaceView01);
        holder = mPreview.getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
       // holder.setFixedSize(400, 200);
       // mp = new MediaPlayer();

    }


    private Handler mHandler = new Handler(){
                   public void handleMessage(Message msg) {
                           if (mifQuit) return;

                           doCleanUp();
                           releaseMediaPlayer();
                           playVideo();
                   }

           };
    private Runnable mPlayVideoTask = new Runnable() {
                   public void run() {
                            if (mifQuit) return;
                         Message msg = mHandler.obtainMessage();
                         Bundle b = new Bundle();
                         b.putString("message", "Start Play Video");
                         msg.setData(b);
                         mHandler.sendMessage(msg);
                   }
           };


    private void playVideo()
    {
        if (mVideoFiles == null || mVideoFiles.length == 0)
        {
                Toast.makeText(this.getApplicationContext(), "No video files",
Toast.LENGTH_LONG).show();
                return;
        }
        try {

            String path = mVideoFiles[playIndex].getAbsolutePath();

            mp = new MediaPlayer();
 
mp.setDataSource(mVideoFiles[playIndex].getAbsolutePath());
            mp.setDisplay(holder);
            mp.prepare();
            mp.setOnBufferingUpdateListener(this);
            mp.setOnCompletionListener(this);
            mp.setOnPreparedListener(this);
            mp.setOnVideoSizeChangedListener(this);
            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);

           // mp.start();
            //set next play index
            playIndex++;
            if (playIndex == mVideoFiles.length)
                playIndex = 0;
           // mp.setLooping(true);
        } catch (Throwable t) {
                if (mp != null)
                         mp.release();
                Log.e(TAG, "error in media prep", t);
                goBlooey(t);
        }

    }

    private void goBlooey(Throwable t) {
        AlertDialog.Builder builder=new AlertDialog.Builder(this);

        builder
        .setTitle("Exception!")
        .setMessage(t.toString())
        .setPositiveButton("OK", null)
        .show();
        }

    private void showOnErrorDlg(String message)
    {
        AlertDialog.Builder builder=new AlertDialog.Builder(this);

        builder
        .setTitle("Exception!")
        .setMessage(message)
        .setPositiveButton("OK", null)
        .show();
    }

    public void onBufferingUpdate(MediaPlayer arg0, int percent) {
        Log.d(TAG, "onBufferingUpdate percent:" + percent);
        this.setTitle("onBufferingUpdate");

    }

    public void onCompletion(MediaPlayer arg0) {
        Log.d(TAG, "onCompletion called");
        this.setTitle("onCompleted");

       doCleanUp();
        mp.release();
        mp = null;
        playVideo();

       // if (mifQuit) return;
       //Handler.postDelayed(mPlayVideoTask, 1 * 1000);
    }

    public void onVideoSizeChanged(MediaPlayer mp, int width, int
height) {
        Log.v(TAG, "onVideoSizeChanged called");
        this.setTitle("onVideoSizeChanged");
        title = title + "|V";
        this.setTitle(title);
        if (width == 0 || height == 0) {
                title = title + "|I";
                this.setTitle(title);
            Log.e(TAG, "invalid video width(" + width + ") or height("
+ height + ")");
            return;
        }
        mIsVideoSizeKnown = true;
        mVideoWidth = width;
        mVideoHeight = height;
        if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
            startVideoPlayback();
        }
    }

    public void onPrepared(MediaPlayer mediaplayer) {
        Log.d(TAG, "onPrepared called");
        mIsVideoReadyToBePlayed = true;
        title = title + "|p";
        this.setTitle(title);
        if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
            startVideoPlayback();
        } /*else {
                mp.release();
                mp = null;
                doCleanUp();
                playIndex++;
            if (playIndex == mVideoFiles.length)
              playIndex = 0;
            playVideo();
        }*/

    }

    public void surfaceChanged(SurfaceHolder surfaceholder, int i, int
j, int k) {
        Log.d(TAG, "surfaceChanged called");

    }

    public void surfaceDestroyed(SurfaceHolder surfaceholder) {
        Log.d(TAG, "surfaceDestroyed called");
    }


    public void surfaceCreated(SurfaceHolder holder) {
        Toast.makeText(this.getApplicationContext(), "surfaceCreated",
Toast.LENGTH_LONG);
        Log.d(TAG, "surfaceCreated called");
        this.setTitle("surfaceCreated");
        playVideo();
    }

    public void onStart()
    {
        IsActive = true;
        super.onStart();
    }

    public void onStop()
    {
        IsActive = false;
        mifQuit = true;
        if (mp != null)
        {
                if (mp.isPlaying())
                        mp.stop();
        }
        releaseMediaPlayer();
        doCleanUp();
        super.onStop();
    }

   // @Override
    protected void onPause() {
        super.onPause();

    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

        public boolean onTouchEvent(MotionEvent event) {
                boolean ret = super.onTouchEvent(event);
                this.finish();
                mifQuit = true;
                return ret;
        }

    private void doCleanUp() {
        mVideoWidth = 0;
        mVideoHeight = 0;
        mIsVideoReadyToBePlayed = false;
        mIsVideoSizeKnown = false;
        playCount = 0;
        title="clean up";
        this.setTitle(title);
    }

    private void releaseMediaPlayer() {
        if (mp != null) {
            mp.release();
            mp = null;
        }
    }

    private void startVideoPlayback() {
        Log.v(TAG, "startVideoPlayback");

        //mPreVideoHeight;
        //mPreVideoWidth;
        if (mPreVideoHeight != mVideoHeight  || mPreVideoWidth !=
mVideoWidth )
        {

                mPreVideoHeight = mVideoHeight;
                mPreVideoWidth = mVideoWidth;

        }
        title = title + "|setSize";
        holder.setFixedSize(mVideoWidth, mVideoHeight);
        //holder.setFixedSize(400, 200);
        playCount++;
        //this.setTitle(Integer.toString(playCount));
       // if (!mp.isPlaying())
        //{

        title = title + "|Playing";
        this.setTitle(title);
        mp.start();
        //} else {
                //title = title + "|play";
                //this.setTitle(title);
        //}
    }

        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
                // TODO Auto-generated method stub
                if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED)
                        showOnErrorDlg("Media Server Died");
                else
                {
                        showOnErrorDlg("Unknown Media Server Error");
                }

                 mp.release();
         mp = null;
                return true;
        }

}







-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to