package com.yixia.camera.demo.media;
import java.io.IOException;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.SurfaceHolder;
import com.yixia.camera.demo.log.Logger;
public class MediaPlayer extends android.media.MediaPlayer {
private static final String TAG = "[MediaPlayer]";
@Override
public void start() {
try {
super.start();
} catch (IllegalStateException e) {
Logger.e(e);
} catch (Exception e) {
Logger.e(e);
}
}
@Override
public void setVolume(float leftVolume, float rightVolume) {
try {
super.setVolume(leftVolume, rightVolume);
} catch (IllegalStateException e) {
Logger.e(e);
} catch (Exception e) {
Logger.e(e);
}
}
private static final int HANDLER_MESSAGE_PARSE = 0;
private static final int HANDLER_MESSAGE_LOOP = 1;
private Handler mVideoHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case HANDLER_MESSAGE_PARSE:
pause();
break;
case HANDLER_MESSAGE_LOOP:
if (isPlaying()) {
seekTo(msg.arg1);
sendMessageDelayed(mVideoHandler.obtainMessage(HANDLER_MESSAGE_LOOP, msg.arg1, msg.arg2), msg.arg2);
}
break;
default:
break;
}
super.handleMessage(msg);
}
};
/** 区域内循环播放 */
public void loopDelayed(int startTime, int endTime) {
int delayMillis = endTime - startTime;
seekTo(startTime);
if (!isPlaying())
start();
mVideoHandler.removeMessages(HANDLER_MESSAGE_LOOP);
mVideoHandler.sendMessageDelayed(mVideoHandler.obtainMessage(HANDLER_MESSAGE_LOOP, getCurrentPosition(), delayMillis), delayMillis);
}
@Override
public void seekTo(int msec) {
try {
super.seekTo(msec);
} catch (IllegalStateException e) {
Logger.e(e);
} catch (Exception e) {
Logger.e(e);
}
}
public void loopDelayed(int endTime) {
int delayMillis = endTime;
//if (!isPlaying())
start();
mVideoHandler.removeMessages(HANDLER_MESSAGE_LOOP);
mVideoHandler.sendMessageDelayed(mVideoHandler.obtainMessage(HANDLER_MESSAGE_LOOP, 0, delayMillis), delayMillis);
}
public void pauseClearDelayed() {
pause();
mVideoHandler.removeMessages(HANDLER_MESSAGE_PARSE);
mVideoHandler.removeMessages(HANDLER_MESSAGE_LOOP);
}
@Override
public int getCurrentPosition() {
try {
return super.getCurrentPosition();
} catch (IllegalStateException e) {
Logger.e(e);
} catch (Exception e) {
Logger.e(e);
}
return 0;
}
@Override
public int getDuration() {
try {
return super.getDuration();
} catch (IllegalStateException e) {
Logger.e(e);
} catch (Exception e) {
Logger.e(e);
}
return 0;
}
@Override
public int getVideoWidth() {
try {
return super.getVideoWidth();
} catch (IllegalStateException e) {
Logger.e(e);
} catch (Exception e) {
Logger.e(e);
}
return 0;
}
@Override
public int getVideoHeight() {
try {
return super.getVideoHeight();
} catch (IllegalStateException e) {
Logger.e(e);
} catch (Exception e) {
Logger.e(e);
}
return 0;
}
@Override
public void stop() {
try {
super.stop();
} catch (IllegalStateException e) {
Logger.e(e);
} catch (Exception e) {
Logger.e(e);
}
}
@Override
public void pause() throws IllegalStateException {
try {
super.pause();
} catch (IllegalStateException e) {
Logger.e(e);
} catch (Exception e) {
Logger.e(e);
}
}
@Override
public boolean isPlaying() {
try {
return super.isPlaying();
} catch (IllegalStateException e) {
Logger.e(e);
} catch (Exception e) {
Logger.e(e);
}
return false;
}
@Override
public void reset() {
try {
super.reset();
} catch (IllegalStateException e) {
Logger.e(e);
} catch (Exception e) {
Logger.e(e);
}
}
@Override
public void release() {
try {
super.release();
} catch (IllegalStateException e) {
Logger.e(e);
} catch (Exception e) {
Logger.e(e);
}
}
public static MediaPlayer create(Context context, Uri uri) {
return create(context, uri, null);
}
public static MediaPlayer create(Context context, int resid) {
try {
AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
if (afd == null)
return null;
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp.prepare();
return mp;
} catch (IOException ex) {
Log.d(TAG, "create failed:", ex);
// fall through
} catch (IllegalArgumentException ex) {
Log.d(TAG, "create failed:", ex);
// fall through
} catch (SecurityException ex) {
Log.d(TAG, "create failed:", ex);
// fall through
} catch (Exception ex) {
Log.d(TAG, "create failed:", ex);
// fall through
}
return null;
}
public static MediaPlayer create(Context context, Uri uri, SurfaceHolder holder) {
try {
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(context, uri);
if (holder != null) {
mp.setDisplay(holder);
}
mp.prepare();
return mp;
} catch (IOException ex) {
Log.e(TAG, "create failed:", ex);
// fall through
} catch (IllegalArgumentException ex) {
Log.e(TAG, "create failed:", ex);
// fall through
} catch (SecurityException ex) {
Log.e(TAG, "create failed:", ex);
// fall through
}
return null;
}
}