Audio 포맷
- WAV, MP3(8~320Kbps), MIDI, OGG, 3GP
Video 포맷
- H263, H264, Mpeg4


생성자
public MediaPlayer()

재생할 미디어 전달
void setDataSource(String path)
void setDataSource(Context context, Uri uri)
void setDataSource(FileDescriptor fd, [long offest, long length])

method호출
void prepare()                      - 동기적으로 준비하여 준비 끝나면 return
void prepareAsync()             - 시간이 오래 걸릴 때 사용. 비동기적 동작. 콜백을 통해 준비 완료를 통보받아야 함.
- 준비상태가 되면 이후 바로 재생 가능. 
- 로컬 파일이나 Uri객체로부터 미디어 오픈
- return값은 없으며, 에러 발생시 예외가 return->반드시 처리
- ex)동영상의 경우 필요한 코덱을 찾는 등 원활한 재생을 위해 얼마간의 버퍼할당 필요 때문에 오픈 직후 자동으로 준비상태를 만들기 위해 호출

create method
static MediaPlayer create(Context context, int resid)
static Mediaplayer create(Context context, uri uri.[SurfaceHolder holder])
- 스트림은 열 수 있으나 파일을 직접 열수는 없음.
- 리소스의 미디어는 보통 작은 크기이므로 오픈 직후 자동으로 준비상태가 돼 바로 재생 가능.
- 에러 발생시 예외를 return하는 대신 null이 return
- 간단한 효과음을 재생할 때는 이 method를 호출하는 것이 간편,

재생관련 method
void start()                        - 재생을 시작한 후 즉시 return->사운드 재생 중에도 다른 작업 가능. 재생시작후 스트림의 끝까지 재생한 후 자동으로 멈춤.
void stop()
void pause()

반복적 재생을 위한 method
void setLooping (boolean looping)
boolean isLooping()
- setLooping(true)를 호출해 두면 한 스트림을 계속 반복 -> 게임 배경음악 재생용으로 적합.


void release()     : 객체를 완전히 파괴하여 더이상 사용할 수 없는 상태로 해제, 재생 중에도 호출 가능
void reset()        : 초기화되지 않은 처음 상태로 객체를 되돌리며 이후 재초기화 해 사용할 수 있음.


create 정적 메소드 - 대용량 미디어에는 효율이 좋지 않기 때문에 짧은 미디어에만 사용.

raw폴더에 있는 파일 재생. 리소스재생,
Button play=(Button)findViewById(R.id.play);
play.setOnClickListener(new Button.OnClickListener() {
   public void onClick(View view){
         MediaPlayer player = MediaPlayer.create(MyPlayer.this, R.raw.pinocchio);
         player.start();
    }
});

상태변화도



- 객체를 처음 생성하거나 reset하면 Idle상태로 시작.= 재생 할 수 없는 상태
- 똑같은 Idle 상태라도 새로 생성된 객체과 reset된 객체의 동작은 조금 다름. (상태에 맞지 않는 메소드 호출시 에러처리가 다름) = 생성 직후엔 단순히 에러를 무시/ reset된 객체  Error상태로 전환 onError콜백 호출.
- Idle상태에서 초기화 하려면 setDataSource메서드를 호출하여 미디어 오픈
   = 이 메서드는 Idle일 때만 호출 가능.
   = 재생 중이거나 일시 정지된 상태에서 미디어를 교체하진 못함.
   = 미디어를 연 후 prepare 메서드 호출하여 준비상태로 전환, 재생 전엔 반드시 준비 상태
   = create 정적 메서드로 객체를 생성하면 생성과 동시에 미디어를 열고 준비상태로 시작. 준비상태일때 볼륨 조절, 반복여부등을 조절 가능
   = start메서드 호출하면 재생중 상태가 되며, 이 상태에서 언제든지 정지, 일시정지 가능. 
   = 일시정지는 pause/start메서드로 언제든지 토글 가능.
   = 그러나 stop상태에선 바로 재생 상태로 복귀할 수 없으며 다시 준비 과정을 거친다.
   = isPlaying 메서드는 현재 재생중인지를 조사하는데, 일시정지, 상태일때는 false이며 재생중에는 true가 리턴.

재생 길이나 위치 조사 및 변경하는 메소드
- ingetDuration() : 총 재생 길이
- ingetCurrentposition() : 현재 재생 위치
주로 프로그레스바 갱신에 사용.
둘다 준비 상태 이후에는 언제든지 호출 가능.
seekTo는 재생 위치를 임의로 변경 - Prepared, Started, Paused, PlaybackCompleted상태에서 호출 가능.
재생 중에도 즉시 다른 위치로 이동 가능하며 준비나 일시정지된 상태에서도 시작 위치를 마음대로 바꿀 수 있지만 정지된 상태에서는 위치를 바꿀 수 없다.

mediaplayer는 상태가 변경되거나 에러가 발생할 때 미리 등록된 콜백 메서드 호출
에러콜백은 등록하는 것이 좋음.

void setOnErrorListener (MediaPlayer.OnErrorListener listener)

void setOnPreparedListener (MediaPlayer.OnPreparedListener listener)

void setOnCompletionListener (MediaPlayer.OnCompletionListener listener)
- 스트림을끝까지 재생했을 때 호출. 이때 객체는 재생 완료 상태.
- 이 콜백을 받았을 때 start메서드를 호출하면 같은 미디어 처음부터 다시 재생.
- 다음 미디어 재생 위해선 reset하여 Idle상태로 돌아간 후 처음부터 다시 시작.
- setDataSource 메서드는 Idle상태에서만 호출 가능하므로 reset해야만 미디어 교체 가능.

void setOnBufferingUpdateListener (MediaPlayer.OnBufferingUpdateListener listener)
-스트리밍 시에 버퍼에 새로운 데이터가 들어왔을 때 호출.
- 로컬 리소스나 파일을 읽을 때는 버퍼링을 하지 않으므로 이 콜백을 프로그래밍 할 필요는 없음.

void setOnSeekCompleteListener (MediaPlayer.OnSeekCompleteListener listener)
- 재생 위치 변경이 완료될때 호출.
- seekTo 메서드가 동기적으로 동작하지 않으므로 변경 시점을 알아내려면 필요.


'안드로이드' 카테고리의 다른 글

Data Base  (0) 2011.07.25
broadcast receiver java code로 등록  (0) 2011.07.25
Activity Cycle  (0) 2011.07.12
startActivityForResult()  (0) 2011.07.12
Intents and IntentsFilters  (0) 2011.07.12

onCreate
  • 호출 시점 : 앱이 새로 실행되거나, 앱을 종료하지 않은 상태에서 다른 앱이 실행되면서 안드로이드가 메모리 확보를 위해 강제로 프로세스를 죽였다가 back 버튼으로 해당 앱으로 돌아오려 할 경우. 즉, Activity가 메모리에 완전히 다시 올라갈 경우
  • 실행할 사항 : 모든 Activity에서 초기화 상황을 확인하고 설정을 읽고 적용하는 등의 기본적인 초기화 상황을 수행해야 한다. 앱이 메모리에서 내려간 경우, 설정 사항도 모두 없어지기 때문에 모든 Activity에서 초기화를 할 수 있어야 한다. 다음으로 각종 Activity view 객체와 이벤트 핸들러를 초기화한다. 세번째로 Intent를 확인하고 각종 모델과 데이터 객체를 초기화한다. 마지막으로 이전에 종료된 상태를 복구하기 위해 Bundle을 이용해 필요한 데이터나 객체를 복구한다
onStart
  • 호출 시점 : onCreate 실행 후, 또는 onRestart 실행 후 호출된다.
  • 실행할 사항 : 연산이 필요할 경우 연산을 수행한다.
onResume
  • 호출 시점 : onStart 다음, 또는 다른 Activity 실행을 위해 onPause가 실행된 다음 호출. onResume 이후에 Activity가 실제로 동작함
  • 실행할 사항 : 화면에 내용을 출력한다. 각종 View 객체에 출력할 값을 세팅한다.
onPause
  • 호출 시점 : 다른 Activity가 실행되면 현재의 Activity를 임시중단시킨다. 화면에 여전히 보여지는 상태(예를 들어 다이얼로그 팝업이 뜨는 경우)에는 onPause까지 실행된다.
  • 실행할 사항 : 별다른 사항이 없다. 현재 상태 저장을 위한 기능은 안드로이드가 알아서 한다. 추가로 저장이 필요한 사항은 onSaveInstanceState 메소드에서 구현한다. 필요할 경우 구현한다.
onStop
  • 호출 시점 : 화면에 더 이상 보여지지 않을 경우 호출된다.
  • 실행할 사항 : 별다른 사항이 없다. 필요할 경우 구현한다.
onDestroy
  • 호출 시점 : Activity가 완전히 종료될 때 호출된다.
  • 실행할 사항 : 별다른 사항이 없다. 필요할 경우 구현한다.
onRestart
  • 호출 시점 : onStop으로 Activity가 화면이 완전히 가려졌다가 다시 보여질 때 호출된다.
  • 실행할 사항 : 별다른 사항이 없다. 필요할 경우 구현한다.



※ A Activity 실행 중 다른 신호가 들어왔을 때의 반응 ( Log cat을 통해 확인 )
onCreat  A - onResum A - Intent - onPause A - onCreat B - onStop A

public class TextTestActivity extends Activity {
 static final String TAG = "ActParent";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.i(TAG,"onCreate");
     super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
   
//    Button btn = (Button)findViewById(R.id.bt);
    public void OnClick(View v){
     Log.i(TAG, "startActivity");
     Intent intent = new Intent(this, TextTestchild.class);
     startActivity(intent);
    }
    public void onResume(){
     super.onResume();
     Log.i(TAG,"onResum");
    }
    public void onPause(){
     super.onPause();
     Log.i(TAG,"onPause");
    }
    public void onRestart(){
     super.onRestart();
     Log.i(TAG,"onRestart");
    }
    public void onStop(){
     super.onStop();
     Log.i(TAG,"onStop");
    }
    public void onDestroy(){
     super.onDestroy();
     Log.i(TAG,"onDestroy");
    }
}

'안드로이드' 카테고리의 다른 글

broadcast receiver java code로 등록  (0) 2011.07.25
MediaPlayer  (0) 2011.07.19
startActivityForResult()  (0) 2011.07.12
Intents and IntentsFilters  (0) 2011.07.12
9.png  (0) 2011.07.12

- Android의 Activity들은 startActivityForResult() method 통해 sub activity를 만들고 Activity끼리 서로 데이터를 교환 가능하며 그 사이에는 'Extra'라고 하는 통로가 존재.

-

Activity A가 startActivityForResult를 통해 Activity B를 호출
B는 종료되면서 Result값을 통해 Extra 꾸러미를 넘김.
Activity는 Extra 꾸러미 안에 있는 데이터들을 꺼내서 사용할 수 있음.

[Activity A 사이드]
Activity A에서 구현되어야 할 부분
1. int 값의 requestCode 값 설정
2. Intent를 만들어 Activity B를 실행
3. onActivityResult()통해 requestCode 값에 해당하는 결과값을 받아옴.

[Activity B 사이드]
Activity B에서 구현되어야 할 부분
1. Intent를 만들어 데이터 꾸러미를 Intent에 추가시킴
2. 결과값을 보내면서 Extra 꾸러미를 가지고 있는 intent를 함께 넘겨줌.

참고 : http://blog.naver.com/hisukdory?Redirect=Log&logNo=50088038280




public void startActivityForResult(Intent intent, int requestCode)
- 인수가 추가됨, (int requestCode)
- 호출한 대상을 나타내는 식별자이며, 리턴시에 누구에 대한 리턴인가를 구분할 때 사용.
- 여러 Activity를 호출할 경우 리턴받는 method에서 어떤 Activity에 대한 리턴인지를 구분할 수 있어야 하므로 호출되는  Activity별로 고유 번호를 붙인다.
- 0이상의 중복되지 않는 정수를 넘기되 음수를 넘길 경우 리턴을 받지 않겠다는 뜻이다.
- 호출된 Activity가 종료되면 다음 method가 호출되므로 리턴값을 받으려면 method 재정의
protected void onActivityResult(int requstCode, int resultCode, Intent data)
requestCode : Activity 호출 시 전달한 요청코드
resultCode : Activity 실행결과
data intent : 리턴 값 들어 있으므로 data 안의 Extras를 읽음.

'안드로이드' 카테고리의 다른 글

MediaPlayer  (0) 2011.07.19
Activity Cycle  (0) 2011.07.12
Intents and IntentsFilters  (0) 2011.07.12
9.png  (0) 2011.07.12
android의 gravity와 layout_gravity  (0) 2011.07.12

+ Recent posts