2016-08-23 68 views
1

我使用這些代碼從這reference。他們想點擊按鈕播放音樂,然後再次點擊停止播放。 (在他們的評論中,他們說這是爲他們工作,但爲我掛) 這是第一次的工作。我的意思是首先點擊音樂正在播放。對於第二點擊音樂停止,但第三點擊手機模擬器顯示此錯誤:當我按下按鈕在第二次播放音樂時,Android會掛起

unfortunately your program has stopped.

這是我的代碼:

public MediaPlayer mp; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Button btn=(Button) findViewById(R.id.btnRain); 
     //mp = MediaPlayer.create(this, R.raw.rain); 
     mp = MediaPlayer.create(MainActivity.this, R.raw.rain); 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      //MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.soundFileName); 
      //  mp.start(); 
      public void onClick(View v) { 

       if (mp.isPlaying()) { 
        mp.stop(); 
        mp.release(); 
       } 
       else { 

        mp.start(); 
       } 
      } 
     }); 
    } 

回答

4

在初始化的onCreate mp用作:

mp = new MediaPlayer(); 

的錯誤是你釋放媒體播放器對象MP,這破壞了對象,調用重置方法,而不是釋放。

if (mp.isPlaying()) 
      { 
       mp.stop(); 
       mp.reset(); 
      } 
      else { 
       mp = MediaPlayer.create(LegalActivity.this, R.raw.free1); 
       mp.start();  
      } 
+0

當我把mp.stop();停止音樂後,它不能再播放。它沒有用。 :( –

+0

更新了答案並在genymotion中測試了它,它的工作正常。請看看編輯答案 –

+0

是的。謝謝。它的工作原理完美。我的問題是我在點擊前定義mp,但是您先點擊後創建它然後在開始之前把價值放在mp上,非常感謝。 –

0

使用這個下面的代碼播放和暫停音樂:

public MediaPlayer mp; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Button btn=(Button) findViewById(R.id.btnRain); 
     //mp = MediaPlayer.create(this, R.raw.rain); 
     mp = MediaPlayer.create(MainActivity.this, R.raw.rain); 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      //MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.soundFileName); 
      //  mp.start(); 
      public void onClick(View v) { 

       if (mp.isPlaying()) { 
        mp.pause(); 
       } 
       else { 

        mp.start(); 
       } 
      } 
     }); 
    } 
+0

錯誤沒有發生,但停止音樂後,我再次點擊播放。但不能播放音樂。沒有聽到。 –

+0

我已經對上面的代碼做了一些修改,請檢查一下修改 –

+0

謝謝。但我想從一開始就玩。不是從停頓。我怎樣才能做到這一點? –

0

這是一個可以正常工作的音頻活動,它允許你用微調上傳歌曲。

public class AUDIO extends Activity{ 

Spinner spCanciones; 
Button btnRep,btnGra,btnParar; 
File audios; 
String cancionSelec; 
String arquivoGravar; 
private MediaPlayer mediaplayer; 
private boolean pause; 
private MediaRecorder mediaRecorder; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_audio); 
    spCanciones=(Spinner)findViewById(R.id.spCanciones); 
    btnGra=(Button)findViewById(R.id.btnGra); 
    btnParar=(Button)findViewById(R.id.btnParar); 
    btnRep=(Button)findViewById(R.id.btnRep); 
    mediaplayer=new MediaPlayer(); 

    enlazarSpinner(); 

    //REPRODUCIR 
    btnRep.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      reproducir(); 
     } 
    }); 

    //PARAR 
    btnParar.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (mediaplayer.isPlaying()) 
       mediaplayer.stop(); 
      pause=false; 
     } 
    }); 

    //GRABAR 
    btnGra.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      grabarAudio(); 
     } 
    }); 
} 


public void enlazarSpinner(){ 
    final ArrayList<String>songs=new ArrayList<>(); 
    audios=new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"/AUDIO/"); 
    String [] play=audios.list(); 
    for (int i=0;i<play.length;i++)songs.add(play[i]); 
    ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, songs); 

    // Opcional: layout usuado para representar os datos no Spinner 
    adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

    // Enlace do adaptador co Spinner do Layout. 
    spCanciones.setAdapter(adaptador); 

    // Escoitador 
    spCanciones.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
      cancionSelec = songs.get(pos); 
      Log.i("Cancion", cancionSelec); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      // TODO Auto-generated method stub 
     } 
    }); // Fin da clase anónima 
} 


public void reproducir(){ 
    try { 
     mediaplayer.reset(); 
     mediaplayer.setDataSource(Environment.getExternalStorageDirectory().getAbsolutePath()+"/AUDIO/"+cancionSelec); 
     mediaplayer.prepare(); 
     mediaplayer.start(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     Log.e("MULTIMEDIA",e.getMessage()); 
    } 
} 

public void grabarAudio(){ 
    String timeStamp = DateFormat.getDateTimeInstance().format(
      new Date()).replaceAll(":", "").replaceAll("/", "_") 
      .replaceAll(" ", "_"); 

    mediaRecorder = new MediaRecorder(); 
    arquivoGravar = Environment.getExternalStorageDirectory().getAbsolutePath()+"/AUDIO/"+ timeStamp + ".3gp"; 
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    mediaRecorder.setMaxDuration(10000); 
    mediaRecorder.setAudioEncodingBitRate(32768); 
    mediaRecorder.setAudioSamplingRate(8000); // No emulador só 8000 coma 
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
    mediaRecorder.setOutputFile(arquivoGravar); 
    try { 
     mediaRecorder.prepare(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     mediaRecorder.reset(); 
    } 
    mediaRecorder.start(); 
    AlertDialog.Builder dialog = new AlertDialog.Builder(this) 
      .setMessage("GRAVANDO").setPositiveButton(
        "PREME PARA PARAR", 
        new DialogInterface.OnClickListener() { 

         @Override 
         public void onClick(DialogInterface dialog, 
              int which) { 
          // TODO Auto-generated method stub 
          mediaRecorder.stop(); 
          mediaRecorder.release(); 
          mediaRecorder = null; 
         } 
        }); 
    dialog.show(); 
    enlazarSpinner(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 

    if (mediaplayer.isPlaying()){ 
     mediaplayer.pause(); 
     pause = true; 
    } 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

    if (pause) { 
     mediaplayer.start(); 
     pause = false; 
    } 
} 


@Override 
protected void onSaveInstanceState(Bundle estado) { 
    estado.putBoolean("MEDIAPLAYER_PAUSE", pause); 
    super.onSaveInstanceState(estado); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    savedInstanceState.putBoolean("MEDIAPLAYER_PAUSE", false); 
    pause = savedInstanceState.getBoolean("MEDIAPLAYER_PAUSE"); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    if (mediaplayer.isPlaying()) mediaplayer.stop(); 

    if (mediaplayer != null) mediaplayer.release(); 
    mediaplayer = null; 

} 
} 
相關問題