java - Android MediaPlayer setNextMediaPlayer() 替代方案

标签 java android soundpool

我最近发布了一个应用程序,用户报告崩溃是因为我的程序包含方法 setNextMediaPlayer()。我现在意识到这仅适用于 API 16+,而我的应用支持 API 8+。我想知道是否有其他方法可以达到同样的效果。

我的应用程序有一些文本到语音,我正在做的是创建 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);
    }
}

但是现在我该如何添加音频文件呢?我试过这个:

        // 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。

最佳答案

创建兼容 onCompletionListener 的播放器启动下一个播放器,例如:

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

在构造函数的某处检查是否有名为 "setNextMediaPlayer" 的方法(或检查 SDK 版本)

mCompatMode = Build.VERSION.SDK_INT < 16;

像这样定义方法:

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

关于java - Android MediaPlayer setNextMediaPlayer() 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18468364/

相关文章:

java - 尝试关闭 HttpURLConnection

android - Google Play 如何邀请玩家进入房间

android - SoundPool 流 ID

android - Phonegap 构建 facebook Connect 插件 (android)

Android 通知消息(不)从 Activity 切换

android - SoundPool 正在加载声音,但每次我播放它时它都显示 "sample ___ is not ready"?

android - 为什么 AudioFlinger 会在没有编程指示的情况下失败?

Java,数组值的getter(数组动态定义)

Java boolean 值未从 if 语句中传递出去

java - 在递归中使用除法