2016-08-23 66 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; 

} 
} 
相关问题