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

Ala*_*ore 8 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!
}
Run Code Online (Sandbox Code Playgroud)

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

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

Bin*_*ngh 7

确保在更改数据源之前停止并重置mediaplayer.更重要的是当你停止它的时候

在结束的时候

..那么请检查一下你在这个方法中做了什么.然后打电话

mplayer.setDataSource(audioPath);
mplayer.setOnPreparedListener(this);
mplayer.prepareAsync();
Run Code Online (Sandbox Code Playgroud)


Ala*_*ore 0

好吧,我从来没有得到过一个很好的答案。我认为模拟器中可能会发生一些有趣的事情。我所做的对我来说非常有用,即将文件下载到外部 SD 卡并从那里播放它们。这将代码稍微更改为:

String path = getExternalFilesDir(null).toString() + "/";
mMediaPlayer.setDataSource(path + mediafile);
Run Code Online (Sandbox Code Playgroud)

其余部分保持不变。