Android MediaPlayer 2小时mp3流,10分钟后暂停或seekTo导致跳过帧错误

Android MediaPlayer 2小时mp3流,10分钟后暂停或seekTo导致跳过帧错误,android,audio,mp3,Android,Audio,Mp3,我正在尝试编写我的第一个应用程序,它将播放来自URL的音频文件,大约2小时长 我一直努力工作,打得很好,一直测试到30分钟,但我不希望在2小时内出现任何问题 但是,如果我在10分钟后暂停并重新开始播放,我将得到跳过的帧错误 交互式SeekTo的情况也是如此 我正在使用MediaPlayer和广播服务更新进度条和时间 请输入下面的代码 package com.example.myfirstapp.service; import android.app.Service; import androi

我正在尝试编写我的第一个应用程序,它将播放来自URL的音频文件,大约2小时长

我一直努力工作,打得很好,一直测试到30分钟,但我不希望在2小时内出现任何问题

但是,如果我在10分钟后暂停并重新开始播放,我将得到跳过的帧错误

交互式SeekTo的情况也是如此

我正在使用MediaPlayer和广播服务更新进度条和时间

请输入下面的代码

package com.example.myfirstapp.service;

import android.app.Service;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnInfoListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnSeekCompleteListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class MP3Service extends Service implements OnCompletionListener, OnPreparedListener, OnSeekCompleteListener, OnBufferingUpdateListener, OnErrorListener, OnInfoListener 
{

    MediaPlayer mediaPlayer;
    boolean playState;
    String mp3Url;
    int seekTo;
    Intent broadCastIntent;

    public MP3Service()
    {

    }

      @Override
      public IBinder onBind(Intent intent) {
        return null;
      }

      @Override
      public void onCreate() {
        Log.v("Mp3 App", "Service On Create");

        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setOnCompletionListener(this);
        mediaPlayer.setOnSeekCompleteListener(this);
        mediaPlayer.setOnBufferingUpdateListener(this);
        mediaPlayer.setOnErrorListener(this);
        mediaPlayer.setOnInfoListener(this);

        broadCastIntent = new Intent("com.example.myfirstapp.SEEKBAR");

      }

      @Override
      public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v("Mp3 App", "Service On Start");
        Bundle extras = intent.getExtras();
        mp3Url = (String)extras.get("Mp3URL");
        seekTo = (int)extras.getInt("SeekTo");
        if (!mediaPlayer.isPlaying()) {
            try {
                mediaPlayer.setDataSource(mp3Url);
                mediaPlayer.prepareAsync();
            } catch (Exception e) {

                e.printStackTrace();
            }
        }
        return START_STICKY;
      }

      public void onCompletion(MediaPlayer _mediaPlayer) {
          Log.v("Mp3 App", "Service On Completed");
        stopSelf();
      }

      private Handler mHandler = new Handler();
      private Runnable mRunnable = new Runnable() {

          @Override
          public void run() {
              //Log.v("Mp3 App", "Runnable Run Method");
              if(playState  && mediaPlayer != null)
              {
                      int mCurrentPosition = mediaPlayer.getCurrentPosition();
                      broadCastIntent.putExtra("CURRENT_POS", mCurrentPosition);
                      sendBroadcast(broadCastIntent);
                      mHandler.postDelayed(this, 1000);
              }

          }
      };

    @Override
    public void onPrepared(MediaPlayer mp) {
        // TODO Auto-generated method stub
        Log.v("Mp3 App", "Service OnPrepared");
        try {
                playState = true;
                Log.v("Mp3 App", "on Start SeekTo : " + seekTo);
                mediaPlayer.seekTo(seekTo);
            } catch (Exception e) {
                e.printStackTrace();
            }


    }

    @Override
    public void onSeekComplete(MediaPlayer mp) {
        // TODO Auto-generated method stub
        Log.v("Mp3 App", "Service OnSeekComplete");
        try {
            if (!mediaPlayer.isPlaying()) {
                mediaPlayer.start();
            }
            mRunnable.run();
            broadCastIntent.putExtra("DURATION", mediaPlayer.getDuration());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void onDestroy() {
          Log.v("Mp3 App", "Service On Destroy");
        if (mediaPlayer.isPlaying()) {
          mediaPlayer.stop();
          }
        mediaPlayer.release();
        playState = false;

      }

    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        // TODO Auto-generated method stub
        //Log.v("Mp3 App", "Service OnBufferingUpdate");

    }

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        // TODO Auto-generated method stub
        Log.v("Mp3 App", " -- " + what + "  --  " + extra);
        return true;
    }

    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        // TODO Auto-generated method stub
        Log.v("Mp3 App", " -- " + what + "  --  " + extra);
        return true;
    }



}
如果我做错了什么,或者我必须改变我的方法,请告诉我


提前感谢。

我使用SeekTo逻辑进行暂停和播放,现在我通过在活动中绑定服务来使用暂停和启动(暂停/播放)。这解决了暂停的问题。但SeekTo问题仍然存在,将继续我的调试。