当我按下按钮第二次播放音乐时,Android挂起了

时间:2016-08-23 11:53:35

标签: android

我使用了此reference中的这些代码。他们想点击按钮播放音乐,然后再次点击停止播放。 (在他们的评论中,他们说这对他们有效,但对我而言) 这是第一次工作。我的意思是第一次点击音乐正在播放。对于第二次单击,音乐停止,但第三次单击手机模拟器显示此错误:

  

不幸的是你的程序已经停止了。

这是我的代码:

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();
                }
            }
        });
    }

3 个答案:

答案 0 :(得分:4)

在onCreate中将mp初始化为:

mp = new MediaPlayer();

错误是你正在释放媒体播放器对象mp,它会破坏对象,调用reset方法而不是释放。

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

答案 1 :(得分: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();
                }
            }
        });
    }

答案 2 :(得分: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;

}
}