7

最近アプリを公開しましたが、プログラムにメソッドが含まれていたため、ユーザーからクラッシュが報告されてい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 にキャストできないため、クラス キャスト例外が発生しています。

4

2 に答える 2