2012-09-06 6 views
1

일부 비디오 파일 (스트리밍)을 재생하는 응용 프로그램을 개발 중입니다. 하나의 액티비티에서 MediaPlayer를 준비하지만 다른 액티비티에서 준비가되면 비디오를 재생하여 사용자가 첫 번째 액티비티의 내용을 탐색하여 시간을 절약 할 수 있습니다. 이것이 가능한가?하나의 액티비티에서 MediaPlayer의 prepareAsync가 다른 액티비티에서 재생됩니다.

public class EGDF_App extends Application { 

    private static MediaPlayer mediaPlayer = null; 

    public static MediaPlayer getMediaPlayer() { 
     if(mediaPlayer == null) 
      return new MediaPlayer(); 
     else 
      return mediaPlayer; 
    } 

} 

내가 텍스트 (로드 비디오)와 버튼이 있습니다

이 같은 응용 프로그램 클래스에 정의 된 정적 MediaPlayer를,있다. 이 텍스트는 동영상 준비가되면 변경되며 사용자가 클릭하면 다음 활동이 시작됩니다. 이 첫 번째 활동에 포함 된 코드

09-06 20:43:34.606: D/ChapterPlayer(31999): surfaceCreated called 
09-06 20:43:34.684: V/ChapterPlayer(31999): startVideoPlayback 
09-06 20:43:34.684: E/MediaPlayer(31999): start called in state 1 
09-06 20:43:34.684: E/MediaPlayer(31999): error (-38, 0) 
09-06 20:43:34.684: D/ChapterPlayer(31999): surfaceChanged called 
09-06 20:43:34.700: E/MediaPlayer(31999): Attempt to call getDuration without a valid mediaplayer 
09-06 20:43:34.715: E/MediaPlayer(31999): Error (-38,0) 
09-06 20:43:34.715: D/ChapterPlayer(31999): onCompletion called 
09-06 20:43:34.751: E/MediaPlayer(31999): Attempt to call getDuration without a valid mediaplayer 

:

public void watchChapter(View view){ 
    Log.i("Button", "Watch chapter button PRESSED"); 
    Button b = (Button) view; 
    String loadChapter = getString(R.string.load_chapter_button_text); 
    String watchChapter = getString(R.string.watch_chapter_button_text); 

    if(((String) b.getText()).equals(loadChapter)){ 
     prepareVideo(view); 

    }else if(((String) b.getText()).equals(watchChapter)){ 

     Intent intent = new Intent(this,ChapterAsyncMediaPlayerActivity.class); 
     intent.putExtra(Constants.chapterVideoResParse, getIntent().getExtras().getString(Constants.chapterVideoResParse)); 
     intent.putExtra("duration", String.valueOf(duration)); 
     startActivity(intent); 
    } 


} 

private void prepareVideo(View view){ 
    MediaPlayer mMediaPlayer; 
    String path; 
    final Button button = (Button) view; 
    String resource = extras.getString(Constants.chapterVideoResParse); 
    path = SecurityHandler.obtainURL(resource, this.getResources().openRawResource(R.raw.output), 10); 

    try { 
     // Gets the media player and set the listeners 
     mMediaPlayer = EGDF_App.getMediaPlayer(); 
     mMediaPlayer.setDataSource(path); 
     mMediaPlayer.prepareAsync(); 
     mMediaPlayer.setOnPreparedListener(new OnPreparedListener(){ 

      @Override 
      public void onPrepared(MediaPlayer mp) { 
       button.setText(getString(R.string.watch_chapter_button_text)); 
       Log.i("MediaPlayer", "MediaPlayer ready"); 
       duration = mp.getDuration(); 
       Log.i("Video duration", String.valueOf(mp.getDuration())); 
      } 

     }); 
     mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

는 그리고이 두 번째 활동에서 코드

문제는 내가 로그 캣에서 다음과 같은 오류를 얻을 수 있습니다 :

public class ChapterAsyncMediaPlayerActivity extends Activity implements 
OnBufferingUpdateListener, OnCompletionListener, 
OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback, MediaPlayerControl { 

    private static final String TAG = "ChapterPlayer"; 
    private int mVideoWidth; 
    private int mVideoHeight; 
    private MediaPlayer mMediaPlayer; 
    private MediaController mController; 
    private SurfaceView mPreview; 
    private SurfaceHolder holder; 
// private String path; 
// private boolean mIsVideoSizeKnown = false; 
    private boolean mIsVideoReadyToBePlayed = false; 

    private Handler handler = new Handler(); 

    @SuppressWarnings("deprecation") 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_chapter_media_player); 
     mPreview = (SurfaceView) findViewById(R.id.mediaPlayerSurface); 
     holder = mPreview.getHolder(); 
     holder.addCallback(this); 
     holder.setKeepScreenOn(true); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     mController.show(); 
     return false; 
    } 

    private void playVideo() { 
     doCleanUp(); 
     try { 

      // Create a new media player and set the listeners 
      mMediaPlayer = EGDF_App.getMediaPlayer(); 
//   mMediaPlayer.setDataSource(path); 
      mMediaPlayer.setDisplay(holder); 
//   mMediaPlayer.prepareAsync(); 
      mMediaPlayer.setOnBufferingUpdateListener(this); 
      mMediaPlayer.setOnCompletionListener(this); 
      mMediaPlayer.setOnPreparedListener(this); 
      mMediaPlayer.setOnVideoSizeChangedListener(this); 
      mMediaPlayer.setScreenOnWhilePlaying(true); 
      mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
      mController = new MediaController(this); 

     } catch (Exception e) { 
      Log.e(TAG, "error: " + e.getMessage(), e); 
     } 
    } 

    public void onPrepared(MediaPlayer mediaplayer) { 
     Log.d(TAG, "onPrepared called"); 
     mIsVideoReadyToBePlayed = true; 
     mController.setMediaPlayer(this); 
     mController.setAnchorView(findViewById(R.id.mediaPlayerSurface)); 
     handler.post(new Runnable(){ 

      @Override 
      public void run() { 

       mController.setEnabled(true); 
       mController.show(); 

      } 
     }); 
     if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { 

      startVideoPlayback(); 
     } 
    } 

    public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) { 
     Log.d(TAG, "surfaceChanged called"); 

    } 

    public void surfaceDestroyed(SurfaceHolder surfaceholder) { 
     Log.d(TAG, "surfaceDestroyed called"); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     Log.d(TAG, "surfaceCreated called"); 
     playVideo(); 
     mIsVideoReadyToBePlayed = true; 
     mController.setMediaPlayer(this); 
     mController.setAnchorView(findViewById(R.id.mediaPlayerSurface)); 
     handler.post(new Runnable(){ 

      @Override 
      public void run() { 

       mController.setEnabled(true); 
       mController.show(); 

      } 
     }); 
     if (mIsVideoReadyToBePlayed) { 
      startVideoPlayback(); 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     mMediaPlayer.pause(); 
    } 

    @Override 
    protected void onRestart() { 
     super.onPause(); 
     mMediaPlayer.start(); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     releaseMediaPlayer(); 
     doCleanUp(); 
    } 

    private void releaseMediaPlayer() { 
     if (mMediaPlayer != null) { 
      mMediaPlayer.release(); 
      mMediaPlayer = null; 
     } 
    } 

    private void doCleanUp() { 
     mVideoWidth = 0; 
     mVideoHeight = 0; 
     mIsVideoReadyToBePlayed = false; 
    } 

    private void startVideoPlayback() { 
     Log.v(TAG, "startVideoPlayback"); 
     holder.setFixedSize(mVideoWidth, mVideoHeight); 
     mMediaPlayer.start(); 
     mMediaPlayer.setScreenOnWhilePlaying(true); 
    } 

    @Override 
    public boolean canPause() { 
     return true; 
    } 

    @Override 
    public boolean canSeekBackward() { 
     return true; 
    } 

    @Override 
    public boolean canSeekForward() { 
     return true; 
    } 

    @Override 
    public int getBufferPercentage() { 
     return 0; 
    } 

    @Override 
    public int getCurrentPosition() { 
     if(mMediaPlayer != null) 
      return mMediaPlayer.getCurrentPosition(); 
     else 
      return 0; 
    } 

    @Override 
    public int getDuration() { 
     if(mMediaPlayer != null) 
      return mMediaPlayer.getDuration(); 
     else 
      return 0; 
    } 

    @Override 
    public boolean isPlaying() { 
     if(mMediaPlayer != null) 
      return mMediaPlayer.isPlaying(); 
     else 
      return false; 
    } 

    @Override 
    public void pause() { 
     if(mMediaPlayer != null) 
      mMediaPlayer.pause();  
    } 

    @Override 
    public void seekTo(int pos) { 
     mMediaPlayer.seekTo(pos);  
    } 

    @Override 
    public void start() { 
     if(mMediaPlayer != null) 
      mMediaPlayer.start(); 
    } 

    public void onBufferingUpdate(MediaPlayer arg0, int percent) { 
     Log.d(TAG, "onBufferingUpdate percent:" + percent); 

    } 

    public void onCompletion(MediaPlayer arg0) { 
     Log.d(TAG, "onCompletion called"); 
    } 

    @Override 
    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { 
     Log.v(TAG, "onVideoSizeChanged called"); 
     if (width == 0 || height == 0) { 
      Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")"); 
      return; 
     } 
     mVideoWidth = width; 
     mVideoHeight = height; 
     if (mIsVideoReadyToBePlayed) { 
      startVideoPlayback(); 
     } 
    } 
} 

나는 도움이나 조언을 부탁드립니다. 감사!

+0

모든 코드가 관련이 있는지 확실하지 않지만 특정 코드 조각을 찾으려고 시도하지 않은 경우 오류가 발생했다고 생각되면 해당 코드를 게시하십시오. 다른 사람의 전체 프로젝트를 통해 오류를 찾기가 어렵습니다. –

답변

1

응용 프로그램에 MediaPlayer를 저장하고 있다고 생각하지 않습니다. 단지 새로운 인스턴스를 반환하는 것뿐입니다.

public static MediaPlayer getMediaPlayer() { 
    if(mediaPlayer == null) { 
     mediaPlayer = new MediaPlayer(); 
    } 
    return mediaPlayer; 
} 
+0

정말 그 트릭을했습니다. Embarrasing mistake :( 고마워! – dleal

관련 문제