【问题标题】:Java android: Error when Pause and Resume MediaPlayer on AsyncTask in activityJava android:在活动中的 AsyncTask 上暂停和恢复 MediaPlayer 时出错
【发布时间】:2016-03-25 11:34:42
【问题描述】:

我正在尝试使用 AsyncTask 在后台播放的 MediaPlayer 暂停和恢复 mp3 播放。

这是活动代码:

public class MainActivity extends Activity implements SensorEventListener
{
    private MyGLSurfaceView mGLSurfaceView2;
    private SensorManager mSensorManager;
    private Sensor mAccelerometer;
    private Sensor mGyro;

    BackgroundSound mBackgroundSound = new BackgroundSound();

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
        this.mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        this.mGyro = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        mGLSurfaceView2 = new MyGLSurfaceView(this);

        setContentView(mGLSurfaceView2);
        mBackgroundSound.execute();
    }

    @Override
    protected void onResume()
    {
        super.onResume();
        mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
        mSensorManager.registerListener(this, mGyro, SensorManager.SENSOR_DELAY_NORMAL);
        if(mBackgroundSound.player != null)
            if(mBackgroundSound.player.isPlaying()==false)
                mBackgroundSound.player.start();
        mGLSurfaceView2.onResume();
    }

    @Override
    protected void onPause()
    {
        super.onPause();
        mSensorManager.unregisterListener(this);
        if(mBackgroundSound.player.isPlaying())
        {
            mBackgroundSound.player.pause();
        }
        mBackgroundSound.player.release();
        //    mBackgroundSound.cancel(true);
        mGLSurfaceView2.onPause();
    }

    public class BackgroundSound extends AsyncTask<Void, Void, Void> {

        MediaPlayer player;

        @Override
        protected Void doInBackground(Void... params) {

            AssetFileDescriptor afd;
            player = new MediaPlayer();

            try {
                afd = getAssets().openFd("2/sound.mp3");

                if (afd != null) {
                    player.setDataSource(afd.getFileDescriptor());
                    player.prepare();
                    player.setLooping(true);
                    player.setVolume(1.0f, 1.0f);
                    //player.start();
                } else {
                    Log.i("Error", "afd is null.");
                }

            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }
    }
}

logcat 错误:

E/MediaPlayer: start called in state 1
E/MediaPlayer: error (-38, 0)
E/MediaPlayer: Error (-38,0)

如果我将mBackgroundSound.execute(); 移动到onResume(),mp3 开始播放,但onResume() 在第二次执行时显然失败了(恢复应用程序时)。

我需要帮助将以下命令放入正确的方法中以使其正常工作(当 APP 最小化时 MP3 暂停,并在 APP 再次恢复时恢复或重新启动):

mBackgroundSound.execute();
mBackgroundSound.cancel(true);
mBackgroundSound.player.start();
mBackgroundSound.player.pause();
mBackgroundSound.player.release();

谢谢!

【问题讨论】:

    标签: java android android-asynctask android-mediaplayer


    【解决方案1】:

    一问就明白了。我想我必须在每次恢复时重新创建 AsyncTask。工作代码(恢复App时MP3从头开始):

    public class MainActivity extends Activity implements SensorEventListener
    {
        private MediaPlayer player;
        private volatile boolean mMediaPlayerStopped;
    
        BackgroundSound mBackgroundSound;
    
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
        }
    
        @Override
        protected void onResume()
        {
            super.onResume();
            startMediaPlayer();
        }
    
        @Override
        protected void onPause()
        {
            super.onPause();
            stopMediaPlayer();
        }
    
        private void stopMediaPlayer() {
            Log.v("Music", "Stop MediaPlayer") ;
            mMediaPlayerStopped = true ;
            if (player != null) {
                player.stop() ;
                player.reset() ;
                player.release() ;
                player = null ;
                mBackgroundSound.cancel(true);
            }
        }
    
        private void startMediaPlayer() {
            Log.v("Music", "Start MediaPlayer") ;
            mMediaPlayerStopped = false;
            mBackgroundSound= new BackgroundSound();
            mBackgroundSound.execute();
        }
    
        public class BackgroundSound extends AsyncTask<Void, Void, Void> {
    
            @Override
            protected Void doInBackground(Void... params) {
    
                AssetFileDescriptor afd;
                MediaPlayer mediaPlayer = new MediaPlayer();
    
                try {
                    afd = getAssets().openFd("2/music.mp3");
    
                    if (afd != null) {
                        mediaPlayer.setDataSource(afd.getFileDescriptor());
                        mediaPlayer.prepare();
                        mediaPlayer.setLooping(true); // Set looping
                        mediaPlayer.setVolume(1.0f, 1.0f);
                        mediaPlayer.start();
    
                        player = mediaPlayer ;
    
                        if (mMediaPlayerStopped) {
                            Log.v("Music", "MediaPlayer was stopped while preparing") ;
                            stopMediaPlayer();
                        }
    
                    } else {
                        Log.i("Error", "afd is null.");
                    }
    
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
                return null;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 2017-02-10
      相关资源
      最近更新 更多