2011-08-30 119 views
8

我正在尝试使用相同的媒体播放器,但更改了数据源。这里是我想要做的事: 使用现有MediaPlayer更改音频播放的数据源?

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

回答

0

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

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

其余的保持不变。

0

您声明private String mediafile="my.mp3";然后您使用AssetFileDescriptor afd = getAssets().openFd(mediafile);,但是在任何时候(从您发布的代码中),您是否更改mediafile的值。
我会推荐在afd = getAssets().openFd(mediafile);之前将mediafile = theNextFile;放在线上,其中theNextFile很可能是指用户在点击所述按钮之前选择的SD卡上的文件。
我不知道如何管理从SD卡获取文件名,但我认为使用startActivityForResult将是一种方法。

+0

是的,你说得对,我并没有包括这部分从我的代码,所以我的样品是有缺陷的。我会相应更新 - 不幸的是,这不是我的代码无法正常工作的原因。我已用调试器验证过,即使原始文件继续播放,媒体文件中也有不同的文件名。在我的情况下,文件被包含在资产文件夹中,所以我可以访问,如我的代码所示。 –

2

我今天的资产实际上有同样的问题,我知道这个问题。

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

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

那么它起到正确的文件。

+0

非常有趣,当我有机会时,我会试试你的建议!我从来没有听说过关于资产的事情 - 你能否提供一份关于这方面的相关文档的链接?谢谢! –

7

确保在更改数据源之前停止并重置mediaplayer。 更重要的事情,当你停止它调用

onCompletion

..所以做检查你的这种方法在做什么。然后调用

mplayer.setDataSource(audioPath); 
mplayer.setOnPreparedListener(this); 
mplayer.prepareAsync(); 
相关问题