ȸ¿ø°¡ÀԡžÆÀ̵ð/ºñ¹øã±â
ȨÀ¸·Î

MediaPlayer °¡·ÎÀÏ ¶§ UI ¼û±â°í Ç®½ºÅ©¸° ¸¸µé±â
7³â Àü
°¡·ÎÀÏ ¶© ¸ðµç 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 °¡ Á×¾ú´ÂÁö Á¶½ÉÇØ¾ß ÇÑ´Ù.

ÃßõÃßõ : 271 Ãßõ ¸ñ·Ï
¹øÈ£ Á¦¸ñ
1,226
android | ²¨Áø È­¸é¿¡¼­ ¾Û ½ÇÇàÇϱâ / Àáµç È­¸é ±ú¿ì±â / Àá±Ý È­¸é À§·Î ½ÇÇà/
1,225
android ÇöÀç WebView¿¡¼­ ¿ÜºÎ ÆäÀÌÁö ºÒ·¯¿À±â / WebView »õâ ¶ç¿ìÁö ¾Ê±â / WebViewClient
1,224
Activity ¸¦ dialog style·Î ¸¸µé±â
1,223
webview ¾Æ·¡ button ³Ö±â
1,222
webview scroll ±â´É ¸·±â(touch´Â µÊ)
1,221
Service µî·ÏÇϱâ
1,220
booting ÈÄ¿¡ ÀÚµ¿À¸·Î ½ÇÇà µÇ´Â app ¸¸µé±â
1,219
[Android] Intent È°¿ë ¿¹½Ã
1,218
Android ¼³Ä¡µÈ ¾îÇà ¸ñ·Ï PackageInfo¸¦ ÅëÇØ °¡Á®¿À±â ¹× ´Ù¸¥ ¾îÇà ½ÇÇà
1,217
[ANDROID(¾Èµå·ÎÀ̵å) ¾Û °³¹ß ±âÃÊ] MEDIAPLAYER À½¾Ç Àç»ýÇϱâ
1,216
[¾Èµå·ÎÀ̵å] ¿ÜºÎ ¾Û ½ÇÇà
1,215
¾Èµå·ÎÀÌµå ¼º´ÉÀ» À§ÇÑ ¼³°è
1,214
ÆÄÀÏ ¾÷·Îµå ¹× ÆĶó¸ÞÅÍ Àü¼Û (sending file & parameters by MultipartEntity / post)
MediaPlayer °¡·ÎÀÏ ¶§ UI ¼û±â°í Ç®½ºÅ©¸° ¸¸µé±â
1,212
À¥ºä¿¡¼­ html ÅÂ±× ¾ø¾Ö´Â ¹ý(Remove the html tag on loading web page in WebView)
1,211
´Ù¸¥ ¾Û ½ÇÇàÇϰųª Ç÷¹ÀÌ ½ºÅä¾î·Î À̵¿(Launch another app by code)
1,210
À¥ ºä¿¡¼­ ÅÂ±× Á¤º¸ ÃàÃâÇϱâ(Get the information of html tag in WebView of android)
1,209
ÀÚµ¿À¸·Î ¿¡µðÆ®ºä¿¡ Æ÷Ä¿½º µÇ´Â °Í ¸·±â
1,208
addJavascriptInterface ¿À·ù(Android WebView.addJavascriptInterface not Working)
1,207
Ä¿½ºÅÒ Å佺Ʈ ¶ç¿ì±â(To show Custom Toast)
1,206
À¥¿¡¼­ ÆÄÀÏ »çÀÌÁî¿Í ÄÜÅÙÆ®(ÄÁÅÙÃ÷) ŸÀÔ ¾Ë¾Æº¸´Â »ùÇÃÄÚµå
1,205
¾Èµå·ÎÀ̵å ÅؽºÆ® ºä¿¡¼­ Áö¿øÇÏ´Â HTML ű׵é
1,204
ÀÎÅÍ³Ý ÁÖ¼Ò À¯È¿¼º °Ë»ç (regular expression for url)
1,203
SpannableStringÀ¸·Î ÅؽºÆ® ºä¿¡ ¾ÆÀÌÄÜ ³Ö´Â ¹ý
1,202
½ÇÇà°¡´ÉÇÑ ¾Û ¸ñ·Ï (Get launchable apps in android)
1,201
HTMLÀ» ¾Èµå·ÎÀ̵å À¥ºä¿¡ ¸ðµÎ º¸ÀÌ°Ô Çϱâ Using WebView ViewPort in android
1,200
so ÆÄÀÏ ¾Èµå·ÎÀÌµå ½ºÆ©µð¿À¿¡¼­ »ç¿ëÇÏ´Â ¹ý
1,199
[¾Èµå·ÎÀ̵å] È­¸é »çÀÌÁî ±¸Çϱâ
1,198
[¾Èµå·ÎÀ̵å] ¾Èµå·ÎÀÌµå ½ºÆ©µð¿À¿¡¼­ ºôµå ÆÄÀÏ À̸§ ¼öÁ¤Çϱâ.
1,197
¿ÜºÎ ¾Û ½ÇÇà½ÃÅ°±â (launch external app in android)
¸ñ·Ï
¹ÂÁ÷Æ®·ÎÆ® ºÎ»ê±¤¿ª½Ã ºÎ»êÁø±¸ °¡¾ßµ¿ ¤Ó °³ÀÎÁ¤º¸Ãë±Þ¹æħ
Copyright ¨Ï musictrot All rights reserved.