2013-08-27 3 views
7

내 앱에 메서드 setNextMediaPlayer()이 포함되어있어 최근에 앱을 게시했으며 사용자가 충돌을보고했습니다. 이제이 은 API 16+에서만 작동하며 내 앱은 API 8+을 지원한다는 것을 알게되었습니다. 동일한 효과를 얻는 다른 방법이 있는지 궁금합니다.Android MediaPlayer setNextMediaPlayer() 대체

내 응용 프로그램에는 약간의 음성 텍스트가 있으며, 내가 수행 한 작업은 MediaPlayersArrayList을 만들어 각각에 짧은 사운드 파일을 저장 한 다음 하나씩 재생하는 것입니다. 코드에서이 메서드를 제거하면 오디오가 너무 고르지 않게되어 이해할 수 없게됩니다.

SoundPool 클래스를 사용하려고 생각했지만 OnCompleteListener이 없으므로 어떻게 처리 할 것인지 잘 모르겠습니다.

기본적으로 내 질문은 : setNextMediaPlayer() 메서드를 사용하지 않고 오디오 파일간에 완벽하게 전환하는 방법이 있습니까?

감사합니다.

편집

은 내가

private class CompatMediaPlayer extends MediaPlayer implements OnCompletionListener { 

    private boolean mCompatMode = true; 
    private MediaPlayer mNextPlayer; 
    private OnCompletionListener mCompletion; 

    public CompatMediaPlayer() { 
     try { 
      MediaPlayer.class.getMethod("setNextMediaPlayer", MediaPlayer.class); 
      mCompatMode = false; 
     } catch (NoSuchMethodException e) { 
      mCompatMode = true; 
      super.setOnCompletionListener(this); 
     } 
    } 

    public void setNextMediaPlayer(MediaPlayer next) { 
     if (mCompatMode) { 
      mNextPlayer = next; 
     } else { 
      super.setNextMediaPlayer(next); 
     } 
    } 

    @Override 
    public void setOnCompletionListener(OnCompletionListener listener) { 
     if (mCompatMode) { 
      mCompletion = listener; 
     } else { 
      super.setOnCompletionListener(listener); 
     } 
    } 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     if (mNextPlayer != null) { 
      // as it turns out, starting a new MediaPlayer on the completion 
      // of a previous player ends up slightly overlapping the two 
      // playbacks, so slightly delaying the start of the next player 
      // gives a better user experience 
      SystemClock.sleep(50); 
      mNextPlayer.start(); 
     } 
     mCompletion.onCompletion(this); 
    } 
} 

하지만 지금은 오디오 파일을 추가하려면 어떻게 발견이 코드를 추가? 나는 이것을 시도했다 :

MediaPlayer를 CompatMediaPlayer에 캐스팅 할 수 없기 때문에 클래스 캐스트 예외가 발생한다.

+0

앱에서 디코딩을 처리하거나 (인코딩되지 않은 PCM으로 오디오 파일을 전송하려는 경우) 'AudioTrack' 또는 OpenSL ES API를 사용할 수 있습니다. – Michael

+0

감사합니다. OpenSL ES를 살펴 보겠습니다. 회신을 보내 주셔서 감사합니다. – user2397906

답변

6

처럼 다음 플레이어 시작 onCompletionListener와 함께 작동합니다 (호환) 플레이어 만듭니다라는 이름의 방법이 경우 생성자 검사에

public void onCompletion(MediaPlayer mp) { 
    if (mCompatMode && mNextPlayer != null) { 
     mNextPlayer.prepare(); 
     mNextPlayer.start(); 
    } 
} 

어딘가에 (또는 SDK 버전을 확인)을 "setNextMediaPlayer"

mCompatMode = Build.VERSION.SDK_INT < 16;

다음과 같은 방법을 정의하십시오.

public void setNextMediaPlayer(MediaPlayer next) { 
    if (mCompatMode) { 
     mNextPlayer = next; 
    } else { 
     super.setNextMediaPlayer(next); 
    } 
} 
+0

답장을 보내 주셔서 감사합니다! 이 클래스가 내 액티비티 클래스에 있어야합니까? 아니면 MediaPlayer를 확장하는 클래스 CompatPlayer를 만들어야합니까? – user2397906

+0

그건 당신에게 달린 답니다. 공개 및 사적인 CompatMediaPlayer 클래스 인 클래스가 있습니다. 동일한 완성 청취자 (inner, 그리고 활동이있는 경우조차도)를 공유합니다. 그래서'super.setNextMediaPlayer()'가 있습니다. –

+0

알겠습니다. 그러나 지금은 mediaplayers에 오디오 파일을 추가하는 데 문제가 있습니다. 코드로 내 질문을 편집했습니다. 어떤 아이디어? – user2397906