android - 使用现有的 MediaPlayer 更改音频播放的数据源?

标签 android media-player android-audiomanager

我正在尝试使用相同的媒体播放器但更改了数据源。这是我正在尝试做的事情:

    private MediaPlayer mMediaPlayer;

    public void pickFile1() {
       initMediaPlayer("myfile1.mp3");
    }

    public void pickFile2() {
       initMediaPlayer("myfile2.mp3");
    }

    private void initMediaPlayer(String mediafile) {
    // Setup media player, but don't start until user clicks button!
    try {
        if (mMediaPlayer == null) {
            mMediaPlayer = new MediaPlayer();
        } else {
            mMediaPlayer.reset();   // so can change data source etc.
        }
        mMediaPlayer.setOnErrorListener(this);
        AssetFileDescriptor afd = getAssets().openFd(mediafile); 
        mMediaPlayer.setDataSource(afd.getFileDescriptor());
    }
    catch (IllegalStateException e) {
        Log.d(TAG, "IllegalStateException: " + e.getMessage());
    }
    catch (IOException e) {
        Log.d(TAG, "IOException: " + e.getMessage());
    }
    catch (IllegalArgumentException e) {
        Log.d(TAG, "IllegalArgumentException: " + e.getMessage());
    }
    catch (SecurityException e) {
        Log.d(TAG, "SecurityException: " + e.getMessage());
    }

    mMediaPlayer.setOnPreparedListener(this);
    mMediaPlayer.prepareAsync(); // prepare async to not block main thread
    mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);  // Keep playing when screen goes off!
}

我只是在想更改为新的媒体文件时调用它。它似乎并没有成功地改变数据源。第一个问题:是否可以这样做,或者我是否必须发布媒体播放器并为每个新文件创建一个新播放器?如果可能,那为什么我的代码不能正常工作?

编辑:好吧,发布并重新创建媒体播放器也不是这样做的!它只是一直播放同一首歌!?!?这怎么可能呢?新想法——为每个轨道创建不同的媒体播放器,这真的是我必须要做的吗?这可能是 Android 中的错误吗?

最佳答案

确保在更改数据源之前停止并重置媒体播放器。 关于更重要的事情,当你停止它调用时

onCompletion

.. 所以一定要检查你在这个方法中做了什么。然后调用

mplayer.setDataSource(audioPath);
mplayer.setOnPreparedListener(this);
mplayer.prepareAsync();

关于android - 使用现有的 MediaPlayer 更改音频播放的数据源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7244338/

相关文章:

Android.os.Process.killProcess 不工作

java - 启动 Activity 并通过 DialogFragment 传递输入

android - 如何暂停特定应用程序的媒体播放器?

Android API 设置音量级别

android - Flutter-参数类型 'Complexity/*1*/'无法分配给参数类型'Complexity/* 2 */

java - AlarmManager 并不总是执行

android - 媒体播放器播放两次

android - MediaPlayer 如何停止播放多个声音

android - 视频无法在 Android 中播放

android - 从后台应用程序以编程方式将电话静音需要什么权限?