9

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

    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中的错误吗?

4

4 回答 4

7

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

在结束的时候

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

mplayer.setDataSource(audioPath);
mplayer.setOnPreparedListener(this);
mplayer.prepareAsync();
于 2013-05-30T06:10:13.170 回答
2

我今天实际上在资产方面遇到了同样的问题,我知道解决方法。

问题是资产被存储为一大块数据,而不是实际文件系统中某个地方的一堆单独文件。所以,当你得到一个 时assetfiledescriptor,它既指向一个文件,也有一个偏移量和一个长度。如果你只是指向mediaplayerassetfiledescriptor本身,它总是会播放你的资产文件夹(或其他东西)中的第一个媒体文件。

如果你这样做: mMediaPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

然后它播放正确的文件。

于 2012-07-09T14:49:51.193 回答
0

您声明private String mediafile="my.mp3";然后使用AssetFileDescriptor afd = getAssets().openFd(mediafile);,但在任何时候(从您发布的代码中)您都不会更改mediafile.
我建议在where可能会引用用户在单击所述按钮之前选择的 sd 卡上的文件mediafile = theNextFile;之前放入该行。 我不确定如何管理从 sd 卡获取文件名,但我认为使用 a是一种方法。afd = getAssets().openFd(mediafile);theNextFile
startActivityForResult

于 2011-08-30T22:49:27.490 回答
0

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

String path = getExternalFilesDir(null).toString() + "/";
mMediaPlayer.setDataSource(path + mediafile);

其余的保持不变。

于 2011-09-04T22:00:50.523 回答