2015-11-05 36 views
0

我需要在同一活動中錄製幾個音頻,一切工作正常,但是當我第二次或第三次錄製音頻時,該應用停止並停止工作。這是我的代碼:我能做些什麼來修復它?Recorder在Android的幾個音頻

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:關閉虛擬機 11-05 17:23:18.543 18916-18916/com.actua.actuaapp E/AndroidRuntime:致命例外: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/And roidRuntime: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:at 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:at android.os.Looper.loop(Looper.java:211) 11-05 17:23:18.543 18916-18916/com.actua.actuaapp E/AndroidRuntime:at android.app.ActivityThread.main(ActivityThread.java:5373) 11-05 17:23:18.543 18916-18916/com.actua。 actuaapp E/AndroidRuntime:在java.lang.reflect.Method.invoke(Native Method) 11-05 17:23:18.543 18916-18916/com.actua.actuaapp E/AndroidRuntime:在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)

回答

1

據當時資料:http://developer.android.com/reference/android/media/MediaRecorder.html

你必須使用reset()而不是釋放()

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 

如果要錄製一遍又一遍。我建議改變你的代碼,這樣你可以在創建活動時創建記錄器,並在活動被銷燬時調用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。你必須停止當前的一個,所以我添加了一個布爾值來跟蹤記錄器的狀態。當用戶點擊一個記錄按鈕時。檢查它是否正在錄製,如果是,請停止錄製。然後開始新的。

+0

感謝您的解決方案,但它不工作... – elvega

0

感謝您的解決方案,但它不工作,所以現在我的代碼,我發現沒有錯誤,測試已經看到錯誤是在recorder.start行(),當我錄製了幾個音頻失敗,在這個功能。

我的代碼:

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

}