Android媒体播放器在播放存储在SD卡上的文件时执行重置()后抛出错误(-38,0)

时间:2013-06-03 07:28:58

标签: android android-mediaplayer

我有一个可以存储在SD卡本地的歌曲列表,也可以从网络流式传输。播放歌曲开始播放歌曲。

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

但是当我有sd卡中存储的歌曲然后当一首歌正在播放时我点击另一首歌_mediaPlayer.reset()会抛出一个错误(-38,0)并且代码进入onError函数= -38 extra = 0。

然而真正令人困惑的部分是,当播放器拥有所有本地存储的歌曲并且播放器暂停时,点击另一首歌的效果非常好。它只会在播放歌曲时抛出错误。所以我尝试暂停一首歌,如果它正在播放,但它没有帮助。

PS:我正在加密本地文件并在播放和存储具有固定名称的未加密文件之前解密文件(例如:current.mp3)。在解密ile之前我也删除了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天的问题并经历了所有链接,但找不到可以解释我的情况的错误的良好解释。任何帮助将不胜感激

由于

1 个答案:

答案 0 :(得分:0)

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

MediaPlayer.reset之后,使用getDurationgetCurrentPosition方法。

请参阅:

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

你可以找到:

在调用MediaPlayer之后,新构造的MediaPlayer对象与reset()对象之间存在微妙但重要的区别。

调用诸如getCurrentPosition()getDuration()getVideoHeight()getVideoWidth()setAudioStreamType(int)setLooping(boolean),{等方法的编程错误两种情况下,{1}},setVolume(float, float)pause()start()stop()seekTo(int)prepare()处于空闲状态。

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

在我的代码中,我使用OnErrorListener.onError()获取TimerTaskgetCurrentPosition