2016-03-25 25 views
0

Ich versuche, eine MP3-Wiedergabe zu unterbrechen und fortzusetzen, indem ich einen MediaPlayer im Hintergrund mit AsyncTask spiele.Java android: Fehler beim Anhalten und Fortsetzen von MediaPlayer auf AsyncTask in Aktivität

Hier ist der Code Aktivität:

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 Fehler:

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

Wenn ich die mBackgroundSound.execute(); zu onResume() die mp3 beginnt zu spielen bewegen, aber die onResume() nicht offensichtlich das zweite Mal ausgeführt wird (beim Fortsetzen der App).

ich helfen die folgenden Befehle in der richtigen Methode setzen müssen, damit sie richtig (MP3 Pausen, wenn APP minimiert wird und wieder oder neu gestartet wird, wenn APP wieder fortgesetzt) ​​zu arbeiten:

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

Dank!

Antwort

0

Ich fand es direkt nach dem fragen. Ich denke, ich muss die AsyncTask immer neu erstellen. Arbeitscode (MP3-Neustart von Anfang an, wenn App wieder aufgenommen wird):

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; 
     } 
    } 
} 
Verwandte Themen