ȸ¿ø·Î±×ÀÎ
MediaPlayer °¡·ÎÀÏ ¶§ UI ¼û±â°í Ç®½ºÅ©¸° ¸¸µé±â
8³â Àü
°¡·ÎÀÏ ¶© ¸ðµç UI¿Í »óŹÙ(StatusBar)±îÁö ¾ø¾Ö°í Ç®½ºÅ©¸°À¸·Î µ¿¿µ»ó Ç÷¹À̸¦ ÇÏ°íÀÚ ÇÑ´Ù¸é, ÀÌ·± ¹æ¹ýµµ ±¦Âú´Ù.
ÇØ´ç Activity¿¡ ¾Æ·¡ ¼Ó¼ºÀ» Ãß°¡ÇÑ´Ù.
android:screenOrientation="unspecified"
android:configChanges="orientation"
android:theme="@android:style/Theme.Black.NoTitleBar
ÀÚ¹Ù ¼Ò½ºÄڵ带 ÀÛ¼ºÇغ¸ÀÚ.
package hansune.android.test;
import java.io.IOException;
import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnVideoSizeChangedListener;
import android.os.Bundle;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.LinearLayout;
public class MoviePlayTestActivity extends Activity implements
OnBufferingUpdateListener, OnCompletionListener,
OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {
private int mVideoWidth;
private int mVideoHeight;
private SurfaceView mPreview;
private SurfaceHolder holder;
private MediaPlayer videoPlayer;
private String path;
private boolean mIsVideoSizeKnown = false;
private boolean mIsVideoReadyToBePlayed = false;
private MediaPlayer bgm;
private ImageButton playBtn;
private int pausePosition = -1;
private boolean isCompletePlay = false;//µ¿¿µ»ó Ç÷¹À̸¦ ¿Ï·áÇß´ÂÁö¿ä?
private boolean isSurfaceDestroy = true;//Surface °¡ ¾ø¾îÁ³´ÂÁö¿ä?
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mPreview = (SurfaceView)findViewById(R.id.surfaceView1);
holder = mPreview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
playBtn = (ImageButton)findViewById(R.id.playBtn);
playBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!isCompletePlay) {
if(videoPlayer.isPlaying()) {
videoPlayer.pause();
bgm.pause();
playBtn.setImageResource(R.drawable.btn_play_big);
}
else {
videoPlayer.start();
bgm.start();
playBtn.setImageResource(R.drawable.btn_pause_big);
}
}
else
{
pausePosition = -1;
playVideo(path);
}
}
});
}
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
Window window = getWindow();
window.setFormat(PixelFormat.RGBA_8888);
}
@Override
protected void onPause() {
if(videoPlayer != null && !isCompletePlay) {
pausePosition = videoPlayer.getCurrentPosition();
playBtn.setImageResource(R.drawable.btn_play_big);
videoPlayer.pause();
}
if(bgm != null) bgm.pause();
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
if(!isCompletePlay) {
if(bgm != null) bgm.start();
playBtn.setImageResource(R.drawable.btn_pause_big);
playBtn.setEnabled(true);
//Àç»ý ÁßÀÌ°í Surface °¡ Á×Áö ¾Ê¾ÒÀ» °æ¿ì Ç÷¹ÀÌÇÑ´Ù.
//Surface °¡ DestroyÀÌ µÇ¸é, surfaceCreated ¿¡¼ ´Ù½Ã »ý¼ºµÈ ÈÄ Ç÷¹ÀÌ µÇµµ·Ï ÇÑ´Ù.
if(pausePosition != -1 && !isSurfaceDestroy) playVideo(path);
}
}
@Override
protected void onDestroy() {
releaseMediaPlayer();
doCleanUp();
System.gc();
if(bgm != null){
bgm.release();
bgm = null;
}
super.onDestroy();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
arrangeVideo();
}
private void arrangeVideo() {
WindowManager wm = getWindowManager();
if(wm == null) return;
LinearLayout ll = (LinearLayout)findViewById(R.id.playBtnLayout);
if(wm.getDefaultDisplay().getRotation() == Surface.ROTATION_90 || wm.getDefaultDisplay().getRotation() == Surface.ROTATION_270) {
Log.d("dd", "landscape");
ll.setVisibility(View.GONE);
hideStatusBar();
}
else {
Log.d("dd", "portrat");
ll.setVisibility(View.VISIBLE);
showStatusBar();
}
//
int videoWidth = videoPlayer.getVideoWidth();
int videoHeight = videoPlayer.getVideoHeight();
Log.d("dd", "video :" + videoWidth + "/" + videoHeight);
int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
int screenHeight = getWindowManager().getDefaultDisplay().getHeight();
Log.d("dd", "screen : " + screenWidth + "/" + screenHeight);
android.view.ViewGroup.LayoutParams lp = mPreview.getLayoutParams();
//portrat
if(screenWidth < screenHeight) {
lp.width = screenWidth;
lp.height = (int)(((float)videoHeight / (float)videoWidth) * (float)screenWidth);
}
else {
lp.width = (int)(((float)videoWidth / (float)videoHeight) * (float)screenHeight);
lp.height = screenHeight;
}
Log.d("dd", lp.width + "/" + lp.height);
mPreview.setLayoutParams(lp);
}
private void hideStatusBar() {
WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setAttributes(attrs);
}
private void showStatusBar() {
WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setAttributes(attrs);
}
private void releaseMediaPlayer() {
if (videoPlayer != null) {
videoPlayer.release();
videoPlayer = null;
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
Log.d("dd", "surfaceChanged called");
if(videoPlayer != null) {
videoPlayer.setDisplay(surfaceholder);
arrangeVideo();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
isSurfaceDestroy = false;
//¼ÆäÀ̽º°¡ »ý¼ºµÇ¸é ¿µ»óÀç»ýÀ» ½ÇÇàÇÑ´Ù.
playVideo(path);
Log.d("dd", "surfaceCreated called");
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
isSurfaceDestroy = true;
Log.d("dd", "surfaceDestroyed called");
}
@Override
public void onVideoSizeChanged(MediaPlayer arg0, int width, int height) {
Log.v("dd", "onVideoSizeChanged called");
if (width == 0 || height == 0) {
Log.e("dd", "invalid video width(" + width + ") or height(" + height + ")");
return;
}
mIsVideoSizeKnown = true;
mVideoWidth = width;
mVideoHeight = height;
if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
startVideoPlayback();
playBtn.setEnabled(true);
playBtn.setImageResource(R.drawable.btn_pause_big);
}
}
@Override
public void onPrepared(MediaPlayer arg0) {
Log.d("dd", "onPrepared called");
mIsVideoReadyToBePlayed = true;
if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
startVideoPlayback();
playBtn.setEnabled(true);
playBtn.setImageResource(R.drawable.btn_pause_big);
}
}
@Override
public void onCompletion(MediaPlayer arg0) {
Log.i("dd", "complete movie");
playBtn.setEnabled(true);
playBtn.setImageResource(R.drawable.btn_play_big);
if(bgm != null) bgm.pause();
pausePosition = -1;
isCompletePlay = true;
}
@Override
public void onBufferingUpdate(MediaPlayer arg0, int arg1) {
}
private void playVideo(String path) {
doCleanUp();
if(videoPlayer == null) videoPlayer = new MediaPlayer();
videoPlayer.reset();
mIsVideoSizeKnown = false;
mIsVideoReadyToBePlayed = false;
playBtn.setEnabled(false);
try {
AssetFileDescriptor afd = getAssets().openFd("example.mp4");
videoPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
videoPlayer.setDisplay(holder);
videoPlayer.prepareAsync();
videoPlayer.setOnBufferingUpdateListener(this);
videoPlayer.setOnCompletionListener(this);
videoPlayer.setOnPreparedListener(this);
videoPlayer.setOnVideoSizeChangedListener(this);
videoPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
} catch (IllegalArgumentException e) {
Log.e("dd", e.getMessage());
} catch (IllegalStateException e) {
Log.e("dd", e.getMessage());
//e.printStackTrace();
} catch (IOException e) {
Log.e("dd", e.getMessage());
//e.printStackTrace();
}
}
private void doCleanUp() {
mVideoWidth = 0;
mVideoHeight = 0;
mIsVideoReadyToBePlayed = false;
mIsVideoSizeKnown = false;
}
private void startVideoPlayback() {
Log.v("dd", "startVideoPlayback");
holder.setFixedSize(mVideoWidth, mVideoHeight);
arrangeVideo();
if(pausePosition != -1)videoPlayer.seekTo(pausePosition);
pausePosition = -1;
videoPlayer.start();
// MediaPlayer °´Ã¼ »ý¼º
if(bgm != null) {
bgm.release();
bgm = null;
}
bgm = new MediaPlayer();
AssetFileDescriptor afd;
try {
afd = getAssets().openFd("background_music.mp3");
bgm.setDataSource(afd.getFileDescriptor());
bgm.prepare();
bgm.setLooping(true);
bgm.setAudioStreamType(AudioManager.STREAM_MUSIC);
bgm.setVolume(0.5f, 0.5f);
bgm.start();
} catch (IOException e) {
e.printStackTrace();
return;
}
}
}
ÇÙ½É.
1. µð¹ÙÀ̽ºÀÇ È¸ÀüÀ» ¾Ë±â À§ÇØ ¸Þ´ÏÆ佺Ʈ ÆÄÀÏÀ» ¼³Á¤ÇÏ´Â °Í
2. ½ºÅ©¸°ÀÇ °¡·Î¼¼·Î ±æÀ̸¦ ±¸ÇÏ´Â °Í(ex. getWindowManager().getDefaultDisplay().getWidth())
3. SurfaceView´Â °¡·Î¼¼·Î Å©±â¸¦ wrap_content À¸·Î Çϳª match_parent ·Î Çϳª Å« Àǹ̰¡ ¾ø´Ù´Â °Í. ¼Ò½ºÀÇ Å©±â¿¡ Á¿ìµÇ°Ô Ç϶ó.
4. StatusBar¸¦ º¸À̰ųª ¼û±â±â
5. Àç»ý µµÁß È¨ ¹öÆ°À» ´©¸£°Å³ª Àü¿ø ¹öÆ°À» ´·¯¼ ¾ÛÀÌ ¸ØÃß¾ú´Ù°¡, ´Ù½Ã ½ÇÇàÇÒ ¶§ ¸ØÃè´ø ºÎºÐºÎÅÍ ´Ù½Ã Àç»ýÇÏ°Ô Çϱâ. À̶§ Surface °¡ Á×¾ú´ÂÁö Á¶½ÉÇØ¾ß ÇÑ´Ù.
̵̧ : 315
̵̧
¸ñ·Ï