1

我有一个歌曲列表,这些歌曲可能存储在本地 SD 卡中,也可能从网络流式传输。点击歌曲开始播放歌曲。

当列表包含要从网络流式传输的所有歌曲时,一切正常。

但是当我有存储在 sd 卡中的歌曲时,当一首歌曲正在播放并且我点击另一首歌曲时,_mediaPlayer.reset() 会引发错误(-38,0)并且代码进入 onError 函数,其中 what=-38额外=0。

然而,真正令人困惑的部分是,当播放器拥有所有本地存储的歌曲并且播放器暂停时,点击另一首歌曲效果很好。它仅在播放歌曲时引发错误。因此,我尝试在播放歌曲时暂停歌曲,但没有帮助。

PS:我正在加密本地文件并在播放和存储具有固定名称的未加密文件之前解密文件(例如:current.mp3)。在解密文件之前,我还删除了 current.mp3。

我正在使用服务来播放歌曲。下面是与我的问题相关的代码。

    private static class OnPreparedListener_r implements MediaPlayer.OnPreparedListener
    {
        Context ctx;
        public OnPreparedListener_r(Context c) {
            ctx = c;
        }
        public void onPrepared(MediaPlayer mp) {
            Utils.acquireWakeLock();
            Utils.requestAudioFocus(ctx);
            mp.start();
      }
        //rest of the code
   }

    //code to play the song when the user taps on it    
/*
        if(_mediaPlayer.isPlaying()) {   //this I tried adding to solve the issue
             pause();
        }
*/

            _mediaPlayer.reset();
            if(currentSong.isLocallyStored()){
                DeleteCurrFile();
                Decrypt(current_song);
            _   mediaPlayer.setDataSource("path to the local file ");
             }else{
           _mediaPlayer.setDataSource("streaming path ");
           }

            _mediaPlayer.prepareAsync();



//handling the error
   private static class OnErrorListener_r implements MediaPlayer.OnErrorListener
    {
        Context ctx;
        public OnErrorListener_r(Context c) {
            ctx = c;
        }
        public boolean onError(MediaPlayer mp, int what, int extra) {
            handleMediaError(ctx);  
            return true;
        }
    }

在过去的 3-4 天里,我一直试图找出问题所在,并浏览了所有链接,但找不到可以解释我的情况的错误解释。任何帮助,将不胜感激

谢谢

4

1 回答 1

0

我犯了同样的错误。我找到了根本原因:

MediaPlayer.reset,用途getDurationgetCurrentPosition方法。

请参阅:

http://developer.android.com/reference/android/media/MediaPlayer.html

您可以在哪里找到:

MediaPlayer新构造的对象和MediaPlayer调用之后的对象之间有一个微妙但重要的区别reset()

调用 , , , , , , , , , , 等方法是编程getCurrentPosition()错误getDuration()getVideoHeight()或者getVideoWidth()setAudioStreamType(int)setLooping(boolean)两种setVolume(float, float)情况pause()start()stop()处于seekTo(int)空闲prepare()状态prepareAsync()

如果在构建 MediaPlayer 对象后立即调用这些方法中的任何一个,OnErrorListener.onError()则内部播放器引擎不会调用用户提供的回调方法,并且对象状态保持不变;但是如果这些方法在之后被调用reset(),用户提供的回调方法OnErrorListener.onError()将被内部播放器引擎调用并且对象将被转移到错误状态。

在我的代码中,我TimerTask用来获取getCurrentPositiongetDuration.

于 2015-06-24T02:44:53.107 回答