Java android:在活动中暂停并恢复MediaPlayer的异步任务时出错
我正在尝试使用MediaPlayer暂停并恢复mp3播放,使用AsyncTask在后台播放 以下是活动代码: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
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()
toonResume()
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;
}
}
}