记录android

时间:2015-11-05 16:22:51

标签: android audio android-mediaplayer android-mediarecorder

我需要在同一个活动中录制几个音频,一切正常,但是当我第二次或第三次录制音频时,应用停止并停止工作。这是我的代码:我可以做些什么来修复它?

public class CompromisoConVoz extends ActionBarActivity implements View.OnClickListener, MediaPlayer.OnCompletionListener {

private TextView valor1,valor2,valor3,valor1_1,valor2_2,valor3_3;
String Valor1,Valor2,Valor3;
MediaRecorder recorder;
MediaPlayer player;
File archivo;
String url1,url2,url3,url4,url5,url6;
private final int BUTTON_IDS[] = {
        R.id.resp1,
        R.id.resp1_1,
        R.id.resp2,
        R.id.resp2_2,
        R.id.resp3,
        R.id.resp3_3,
};

private Button Resp1,Resp1_1,Resp2,Resp2_2,Resp3,Resp3_3,parar1,parar1_1,parar2,parar2_2,parar3,parar3_3;
private Button Siguiente;




@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_compromiso_con_voz);

    //asignamos botones de grabación
    Resp1 =(Button) findViewById(BUTTON_IDS[0]);
    Resp1.setOnClickListener(this);
    Resp1_1 =(Button) findViewById(BUTTON_IDS[1]);
    Resp1_1.setOnClickListener(this);
    Resp2 =(Button) findViewById(BUTTON_IDS[2]);
    Resp2.setOnClickListener(this);
    Resp2_2 =(Button) findViewById(BUTTON_IDS[3]);
    Resp2_2.setOnClickListener(this);
    Resp3 =(Button) findViewById(BUTTON_IDS[4]);
    Resp3.setOnClickListener(this);
    Resp3_3 =(Button) findViewById(BUTTON_IDS[5]);
    Resp3_3.setOnClickListener(this);


    //asignamos botones de parada
    parar1 =(Button) findViewById(R.id.parar1);
    parar1.setOnClickListener(this);
    parar1_1 =(Button) findViewById(R.id.parar1_1);
    parar1_1.setOnClickListener(this);
    parar2 =(Button) findViewById(R.id.parar2);
    parar2.setOnClickListener(this);
    parar2_2 =(Button) findViewById(R.id.parar2_2);
    parar2_2.setOnClickListener(this);
    parar3 =(Button) findViewById(R.id.parar3);
    parar3.setOnClickListener(this);
    parar3_3=(Button) findViewById(R.id.parar3_3);
    parar3_3.setOnClickListener(this);


    valor1 = (TextView) findViewById(R.id.valor1);
    valor2 = (TextView) findViewById(R.id.valor2);
    valor3 = (TextView) findViewById(R.id.valor3);
    valor1_1 = (TextView) findViewById(R.id.valor1_1);
    valor2_2 = (TextView) findViewById(R.id.valor2_2);
    valor3_3= (TextView) findViewById(R.id.valor3_3);
    Log.d("prueba", "antes");
    //  SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences sharedPreferences = getSharedPreferences("MisPreferencias", Context.MODE_PRIVATE);
    //if(sharedPreferences.contains(CCCPreference.VALOR1)) {

    //Valor1 = sharedPreferences.getString(CCCPreference.VALOR1, CCCPreference.VALOR1);
    Valor1 = sharedPreferences.getString("valor1", "valor");
    Valor2 = sharedPreferences.getString("valor2", "valor");
    Valor3 = sharedPreferences.getString("valor3", "valor");



    Siguiente = (Button) findViewById(R.id.siguiente);

    Siguiente.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if(url1.equals("") || url2.equals("") || url3.equals("") || url4.equals("") || url5.equals("") || url6.equals("")){
                Log.d("dentro","dentro");
                muestradialogo();
            }else{
                finish();
                Intent i= new Intent(CompromisoConVoz.this,CompromisoResultadoVoz.class);
                //i.putExtra("audio","resp1");
                i.putExtra("url1",url1);
                i.putExtra("url2",url2);
                i.putExtra("url3",url3);
                i.putExtra("url4",url4);
                i.putExtra("url5",url5);
                i.putExtra("url6",url6);
                startActivity(i);
                overridePendingTransition(R.anim.fade_in, R.anim.fade_out);//las animaciones deben de estar en un directorio

            }

        }
    });

}


public void vibrate(int duration)
{
    Vibrator vibs = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    vibs.vibrate(duration);
}



@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.resp1:

            Resp1.setEnabled(false);
            parar1.setEnabled(true);
            url1=grabar(v, "resp1");
            break;

        case R.id.resp1_1:

            Resp1_1.setEnabled(false);
            parar1_1.setEnabled(true);
            url2=grabar(v, "resp1_1");
            break;

        case R.id.resp2:

            Resp2.setEnabled(false);
            parar2.setEnabled(true);

            url3=grabar(v, "resp2");

            break;
        case R.id.resp2_2:

            Resp2_2.setEnabled(false);
            parar2_2.setEnabled(true);
            url4=grabar(v, "resp2_2");
            break;

        case R.id.resp3:

            Resp3.setEnabled(false);
            parar3.setEnabled(true);
            url5=grabar(v, "resp3");
            break;

        case R.id.resp3_3:

            Resp3_3.setEnabled(false);
            parar3_3.setEnabled(true);
            url6=grabar(v, "resp3_3");
            break;
        case R.id.parar1:
            Resp1.setEnabled(true);
            parar1.setEnabled(false);
            detener(v);
            break;

        case R.id.parar1_1:
            Resp1_1.setEnabled(true);
            parar1_1.setEnabled(false);
            break;

        case R.id.parar2:
            Resp2.setEnabled(true);
            parar2.setEnabled(false);
            break;
        case R.id.parar2_2:
            Resp2_2.setEnabled(true);
            parar2_2.setEnabled(false);
            break;

        case R.id.parar3:
            Resp3.setEnabled(true);
            parar3.setEnabled(false);
            break;

        case R.id.parar3_3:
            Resp3_3.setEnabled(true);
            parar3_3.setEnabled(false);
            break;

        default:
            break;
    }
}

public String grabar(View v,String namefile) {

    String url;
    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//configura el micro del móvil como fuente
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//formato audio salida
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//especifica el codel del audio
    File path = new File(Environment.getExternalStorageDirectory()//obtenemos el path de la sd y creamos un archivo de extensión 3gp
            .getPath());
    Log.d("uri1",path.toString());
    try {
        archivo = File.createTempFile(namefile, ".3gp", path);
    } catch (IOException e) {
        Log.d("uri1x","error");
    }

    url=archivo.toString();
    recorder.setOutputFile(archivo.getAbsolutePath());//donde se almacena

    try {//prepara la grabación
        recorder.prepare();
    } catch (IOException e) {
        Log.e("uri5", "error");
    }

    recorder.start();//graba

    return url;
}

public void detener(View v) {
    recorder.stop();
    recorder.release();
    recorder=null;

}
  

控制台显示:   11-05 17:23:18.542 18916-18916 / com.actua.actuaapp E / MediaRecorder:开始失败:-38   11-05 17:23:18.542 18916-18916 / com.actua.actuaapp D / AndroidRuntime:关闭VM   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:FATAL EXCEPTION:main   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:进程:com.actua.actuaapp,PID:18916   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:java.lang.IllegalStateException   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:at android.media.MediaRecorder.start(Native Method)   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:at com.actua.actuaapp.CompromisoConVoz.grabar(CompromisoConVoz.java:258)   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:at com.actua.actuaapp.CompromisoConVoz.onClick(CompromisoConVoz.java:174)   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:在android.view.View.performClick(View.java:4856)   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:at android.view.View $ PerformClick.run(View.java:19956)   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:在android.os.Handler.handleCallback(Handler.java:739)   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:at android.os.Handler.dispatchMessage(Handler.java:95)   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:在android.os.Looper.loop(Looper.java:211)   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:在android.app.ActivityThread.main(ActivityThread.java:5373)   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:at java.lang.reflect.Method.invoke(Native Method)   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:at java.lang.reflect.Method.invoke(Method.java:372)   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1020)   11-05 17:23:18.543 18916-18916 / com.actua.actuaapp E / AndroidRuntime:at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)

2 个答案:

答案 0 :(得分:1)

根据以下文件:http://developer.android.com/reference/android/media/MediaRecorder.html

您必须使用reset()而不是release()

MediaRecorder recorder = new MediaRecorder();
 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
 recorder.setOutputFile(PATH_NAME);
 recorder.prepare();
 recorder.start();   // Recording is now started
 ...
 recorder.stop();
 recorder.reset();   // You can reuse the object by going back to setAudioSource() step
 recorder.release(); // Now the object cannot be reused

如果你想一遍又一遍地录音。我建议更改你的代码,以便在创建Activity时实例化记录器,并在活动被销毁时调用recorder.release()。像这样:

public String grabar(View v,String namefile) {

    String url;
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//configura el micro del móvil como fuente
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//formato audio salida
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//especifica el codel del audio
    File path = new File(Environment.getExternalStorageDirectory()//obtenemos el path de la sd y creamos un archivo de extensión 3gp
            .getPath());
    Log.d("uri1",path.toString());
    try {
        archivo = File.createTempFile(namefile, ".3gp", path);
    } catch (IOException e) {
        Log.d("uri1x","error");
    }

    url=archivo.toString();
    recorder.setOutputFile(archivo.getAbsolutePath());//donde se almacena

    try {//prepara la grabación
        recorder.prepare();
    } catch (IOException e) {
        Log.e("uri5", "error");
    }

    recorder.start();//graba

    isRecording = true;

    return url;
}

public void detener(View v) {
    if(isRecording){
        recorder.stop();
        recorder.reset();
        recorder=null;
    }
}

另外,在调用grabar()方法之前要小心。如果MediaRecorder已经录制,因为用户按下了其他按钮之一,则录制器不准备录制其他文件,并且您将获得IllegalStateException。你必须停止当前的一个,所以我添加了一个跟踪记录器状态的布尔值。当用户单击记录按钮时。检查它是否录制,如果是,则停止录制。然后开始新的。

答案 1 :(得分:0)

感谢您的解决方案,但它不起作用,所以现在我的代码,我发现没有错误,测试已经看到错误在recorder.start line()当我在此函数中记录了几个音频失败。 / p>

我的代码:

public String grabar(View v,String namefile) {

    String url;
    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//configura el micro del móvil como fuente
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//formato audio salida
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//especifica el codel del audio
    recorder.setAudioEncodingBitRate(16);
    recorder.setAudioSamplingRate(44100);
    recorder.setMaxDuration(20000);//graba máximo 20 segundos
    File path = new File(Environment.getExternalStorageDirectory()//obtenemos el path de la sd y creamos un archivo de extensión 3gp
            .getPath());
    Log.d("uri1",path.toString());
    try {
        archivo = File.createTempFile(namefile, ".3gp", path);
    } catch (IOException e) {
        Log.d("uri1x","error creando fichero");
    }
    Log.d("uri2",namefile);
    Log.d("uri3",archivo.toString());
    url=archivo.toString();
    recorder.setOutputFile(archivo.getAbsolutePath());//donde se almacena
    Log.d("uri4", archivo.getAbsolutePath().toString());
    try {//prepara la grabación
        recorder.prepare();
    } catch (IOException e) {
        Log.e("uri5", "Fallo en grabación");
    }
    Log.d("uri6", archivo.getAbsolutePath().toString());
    recorder.start();//graba
    Log.d("uri7", archivo.getAbsolutePath().toString());
    Toast.makeText(this, "Grabando...", Toast.LENGTH_SHORT).show();
  /*  tv1.setText("Grabando");
    b1.setEnabled(false);
    b2.setEnabled(true);*/
    isRecording = true;
    return url;
}

public void detener(View v) {
    if(isRecording) {
        isRecording=false;
        recorder.stop();
        recorder.reset();
        recorder = null;
        Toast.makeText(this, "Grabación terminada", Toast.LENGTH_SHORT).show();
    }
}@Override
public void onDestroy() {
    super.onDestroy();
    recorder.release();

}