Android VideoPlayer,安卓开发面试

这篇博客详细介绍了在Android开发中实现VideoPlayer的相关代码,包括如何初始化、设置监听器、处理错误以及控制视频播放状态。同时,该内容可能对Android面试有所帮助,涉及到的关键技术包括MediaPlayer的使用和媒体控制接口的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mContext.sendBroadcast(i);

if (mediaPlayer != null) {

mediaPlayer.reset();

mediaPlayer.release();

mediaPlayer = null;

}

try {

mediaPlayer = new MediaPlayer();

mediaPlayer.setOnPreparedListener(mPreparedListener);

mediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);

isPrepared = false;

Log.v(TAG, “reset duration to -1 in openVideo”);

mDuration = -1;

mediaPlayer.setOnCompletionListener(mCompletionListener);

mediaPlayer.setOnErrorListener(mErrorListener);

mediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);

currentBufferPercentage = 0;

mediaPlayer.setDataSource(mContext, mUri);

mediaPlayer.setDisplay(mSurfaceHolder);

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

mediaPlayer.setScreenOnWhilePlaying(true);

mediaPlayer.prepareAsync();

attachMediaController();

} catch (IOException ex) {

Log.w(TAG, "Unable to open content: " + mUri, ex);

return;

} catch (IllegalArgumentException ex) {

Log.w(TAG, "Unable to open content: " + mUri, ex);

return;

}

}

public void setMediaController(MediaController controller) {

if (mediaController != null) {

mediaController.hide();

}

mediaController = controller;

attachMediaController();

}

private void attachMediaController() {

if (mediaPlayer != null && mediaController != null) {

mediaController.setMediaPlayer(this);

View anchorView = this.getParent() instanceof View ?

(View) this.getParent() : this;

mediaController.setAnchorView(anchorView);

mediaController.setEnabled(isPrepared);

}

}

MediaPlayer.OnVideoSizeChangedListener mSizeChangedListener =

new MediaPlayer.OnVideoSizeChangedListener() {

public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {

videoWidth = mp.getVideoWidth();

videoHeight = mp.getVideoHeight();

if (mMyChangeLinstener != null) {

mMyChangeLinstener.doMyThings();

}

if (videoWidth != 0 && videoHeight != 0) {

getHolder().setFixedSize(videoWidth, videoHeight);

}

}

};

MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() {

public void onPrepared(MediaPlayer mp) {

// briefly show the mediacontroller

isPrepared = true;

if (myOnPreparedListener != null) {

myOnPreparedListener.onPrepared(mediaPlayer);

}

if (mediaController != null) {

mediaController.setEnabled(true);

}

videoWidth = mp.getVideoWidth();

videoHeight = mp.getVideoHeight();

if (videoWidth != 0 && videoHeight != 0) {

//Log.i("@@@@", “video size: " + mVideoWidth +”/"+ mVideoHeight);

getHolder().setFixedSize(videoWidth, videoHeight);

if (surfaceWidth == videoWidth && surfaceHeight == videoHeight) {

// We didn’t actually change the size (it was already at the size

// we need), so we won’t get a “surface changed” callback, so

// start the video here instead of in the callback.

if (seekWhenPrepared != 0) {

mediaPlayer.seekTo(seekWhenPrepared);

seekWhenPrepared = 0;

}

if (startWhenPrepared) {

mediaPlayer.start();

startWhenPrepared = false;

if (mediaController != null) {

mediaController.show();

}

} else if (!isPlaying() &&

(seekWhenPrepared != 0 || getCurrentPosition() > 0)) {

if (mediaController != null) {

// Show the media controls when we’re paused into a video and make 'em stick.

mediaController.show(0);

}

}

}

} else {

// We don’t know the video size yet, but should start anyway.

// The video size might be reported to us later.

if (seekWhenPrepared != 0) {

mediaPlayer.seekTo(seekWhenPrepared);

seekWhenPrepared = 0;

}

if (startWhenPrepared) {

mediaPlayer.start();

startWhenPrepared = false;

}

}

}

};

private OnCompletionListener mCompletionListener =

new OnCompletionListener() {

public void onCompletion(MediaPlayer mp) {

if (mediaController != null) {

mediaController.hide();

}

if (myOnCompletionListener != null) {

myOnCompletionListener.onCompletion(mediaPlayer);

}

}

};

private OnErrorListener mErrorListener =

new OnErrorListener() {

public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {

Log.d(TAG, "Error: " + framework_err + “,” + impl_err);

if (mediaController != null) {

mediaController.hide();

}

/* If an error handler has been supplied, use it and finish. */

if (myOnErrorListener != null) {

if (myOnErrorListener.onError(mediaPlayer, framework_err, impl_err)) {

return true;

}

}

/* Otherwise, pop up an error dialog so the user knows that

  • something bad has happened. Only try and pop up the dialog

  • if we’re attached to a window. When we’re going away and no

  • longer have a window, don’t bother showing the user an error.

*/

if (getWindowToken() != null) {

Resources r = mContext.getResour

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值