2013-08-27 9 views
7

私のプログラムにはsetNextMediaPlayer()というメソッドが含まれていたため、最近アプリを公開しました。ユーザーはクラッシュを報告しています。このはAPI 16+でのみ動作し、私のアプリはAPI 8+をサポートしています。私は、同じ効果を達成する別の方法があるのだろうかと思っていました。Android MediaPlayer setNextMediaPlayer()代替

私のアプリにはテキストがあり、ArrayListにはMediaPlayersという短いサウンドファイルがあり、それを順に再生していました。コードからこのメソッドを削除した場合、オーディオがあまりにもぎこちなくなって理解できなくなります。

私はSoundPoolクラスを使用することを考えていましたが、OnCompleteListenerはありません。どのようにすればいいのか分かりません。

基本的に私の質問はですsetNextMediaPlayer()メソッドを使用せずにオーディオファイル間をシームレスに移行する方法はありますか?

ありがとうございました!

EDIT

は私が

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); 
    } 
} 

を発見し、このコードを追加しました。しかし、今どのように私は、オーディオファイルを追加するには?私はこれを試しました:

 // assigns a file to each media player 
    mediaplayers = new ArrayList<CompatMediaPlayer>(); 
    for (int i = 0; i < files.size(); i++) { 
     mediaplayers.add((CompatMediaPlayer) CompatMediaPlayer.create(this, files.get(i))); 
    } 

MediaPlayerをCompatMediaPlayerにキャストできないため、クラスキャスト例外が発生しています。

+0

あなたのアプリでデコードを処理したい場合(またはエンコードされていないPCMとしてオーディオファイルを発送する場合)は、 'AudioTrack'またはOpenSL ES APIを使用することができます。 – Michael

+0

ありがとう、私はOpenSL ESをチェックアウトします、それはよさそうだよ – user2397906

答えて

6

のような次のプレイヤーを開始するためにonCompletionListenerで動作しますcompatの選手を作成しますという名前のメソッドがあれば、あなたのコンストラクタチェックに

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

これはあなた次第ですが、答えはここで私はpublicとprivateのCompatMediaPlayerクラスのクラスがあり、それらは同じ完了リスナーを共有しています(inner、アクティビティがあればそれを供給します)。だからこそ私は 'super.setNextMediaPlayer()'を持っています。 –

+0

私はそれが理にかなっています。しかし、今私はmediaplayersにオーディオファイルを追加するのに問題があります。私はコードで自分の質問を編集しました。何か案は? – user2397906