Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android:在活动中暂停并恢复MediaPlayer的异步任务时出错_Java_Android_Android Asynctask_Android Mediaplayer - Fatal编程技术网

Java android:在活动中暂停并恢复MediaPlayer的异步任务时出错

Java android:在活动中暂停并恢复MediaPlayer的异步任务时出错,java,android,android-asynctask,android-mediaplayer,Java,Android,Android Asynctask,Android Mediaplayer,我正在尝试使用MediaPlayer暂停并恢复mp3播放,使用AsyncTask在后台播放 以下是活动代码: public class MainActivity extends Activity implements SensorEventListener { private MyGLSurfaceView mGLSurfaceView2; private SensorManager mSensorManager; private Sensor mAcceleromete

我正在尝试使用MediaPlayer暂停并恢复mp3播放,使用AsyncTask在后台播放

以下是活动代码:

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;
        }
    }
}
如果我移动
mBackgroundSound.execute()
to
onResume()
mp3开始播放,但
onResume()
在第二次执行时(恢复应用程序时)显然会失败

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


谢谢

我一问就明白了。我想每次恢复时都必须重新创建AsyncTask。工作代码(恢复应用程序时从开始重新启动MP3):

公共类MainActivity扩展活动实现SensorEventListener
{
私人媒体播放器;
私有易失性布尔值,分层覆盖;
背景声音;背景声音;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
@凌驾
受保护的void onResume()
{
super.onResume();
startMediaPlayer();
}
@凌驾
受保护的void onPause()
{
super.onPause();
stopMediaPlayer();
}
私有媒体播放器(){
Log.v(“音乐”、“停止媒体播放器”);
mmediplayerstopped=真;
如果(玩家!=null){
player.stop();
player.reset();
player.release();
player=null;
mBackgroundSound.cancel(真);
}
}
私有void startMediaPlayer(){
Log.v(“音乐”,“启动MediaPlayer”);
mmediplayerstopped=false;
mBackgroundSound=新背景声音();
mBackgroundSound.execute();
}
公共类BackgroundSound任务{
@凌驾
受保护的Void doInBackground(Void…参数){
资产负债表;
MediaPlayer=新的MediaPlayer();
试一试{
afd=getAssets().openFd(“2/music.mp3”);
如果(afd!=null){
setDataSource(afd.getFileDescriptor());
mediaPlayer.prepare();
mediaPlayer.setLooping(true);//设置循环
mediaPlayer.setVolume(1.0f,1.0f);
mediaPlayer.start();
播放器=媒体播放器;
如果(层顶){
Log.v(“音乐”,“MediaPlayer在准备时被停止”);
stopMediaPlayer();
}
}否则{
Log.i(“错误”,“afd为空”);
}
}捕获(IllegalArgumentException e){
e、 printStackTrace();
}捕获(非法状态){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
}
}
E/MediaPlayer: start called in state 1
E/MediaPlayer: error (-38, 0)
E/MediaPlayer: Error (-38,0)
mBackgroundSound.execute();
mBackgroundSound.cancel(true);
mBackgroundSound.player.start();
mBackgroundSound.player.pause();
mBackgroundSound.player.release();
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;
        }
    }
}