最近アプリを公開しましたが、プログラムにメソッドが含まれていたため、ユーザーからクラッシュが報告されていsetNextMediaPlayer()
ます。これは API 16+ でのみ機能し、私のアプリは API 8+ をサポートしていることに気付きました。同じ効果を達成する別の方法があるかどうか疑問に思っていました。
私のアプリにはいくつかのテキスト読み上げ機能があり、私が行っていたArrayList
のはMediaPlayers
、それぞれに短いサウンド ファイルがあるファイルを作成し、それらを次々に再生することでした。コードからこのメソッドを削除すると、音声が途切れすぎて理解できなくなります。
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);
}
}
しかし、オーディオ ファイルを追加するにはどうすればよいでしょうか。私はこれを試しました:
// 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 にキャストできないため、クラス キャスト例外が発生しています。