Instancia de MediaRecorder no publicada

Estoy haciendo una aplicación de Android para grabar sonido. He estado usando la clase MediaRecorder para eso.

La grabación se realiza correctamente cuando la grabación se realiza por primera vez en cualquier dispositivo. Pero no funciona la próxima vez.

Si pruebo el código en otra máquina, la grabación se realiza correctamente. ¿Es así porque la aplicación no libera la instancia de MediaRecorder incluso si estoy llamando al método? release().

Este es mi codigo

 public class NewClass extends Activity {
private static String sFileName = null;
private static String sFileNameMSD = null;
private static String sPlayFile = null;
public MediaRecorder mRecorder = null;
private String mPn_id;
private String mDescription;
private String mTask_flag;
private String mPatient_name;
private String mPatient_id;
private String mIs_upload = "N";
private Context mContext;
Button btnStart;
Button btnStop;
private int mReuqestcode;
NewClass myActivity;
SeekBar seekBar;
int totalTime;
private final Handler handler = new Handler();
private final String FILE_EXTENTION_AMR = ".amr";
private final String FILE_EXTENTION_MSD = ".msd";
protected boolean recodeFlag = false;;
private static final String TAG = GridAllActivity.class.getName();

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    setContentView(R.layout.transcriptionrecord_activity);
    mContext = this;
    myActivity = this;
    Main.setTitle(myActivity, mContext);

    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
            mContext));
    TextView txtTitle = (TextView) findViewById(R.id.txt_Title1);
    txtTitle.setText("Transcription");
    TextView txtOption = (TextView) findViewById(R.id.txtOptionName);
    TextView txtPatientName = (TextView) findViewById(R.id.txtPatientName);
    setProperty();
    txtOption.setText("" + mDescription);
    txtPatientName.setText("" + mPatient_name);
}
private void onRecord(boolean start) throws SettingNotFoundException {
    if (start) {
        startRecording();
    } else {
        stopRecording();
        }
}

private void startRecording() throws SettingNotFoundException {
    mRecorder = new MediaRecorder();

    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
    mRecorder.setOutputFile(sFileName);
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    try {

        mRecorder.prepare();

        mRecorder.start();
    } catch (IOException e) {

        recodeFlag=true;
        Log.e("1", "prepare() failed");
        e.printStackTrace();
    }

}

private void stopRecording() throws SettingNotFoundException {

    mRecorder.stop();
    mRecorder.release();
    Log.d("1", "mRecorder released");
    mRecorder = null;
    System.gc();
}

public void setRecordPath() throws IOException {

    sFileName = Environment.getExternalStorageDirectory().getAbsolutePath();

    sFileName += Global.creteFolderPath("IMSEMR" + mTask_flag + "_"
            + mPn_id + FILE_EXTENTION_AMR);
    sFileNameMSD = "IMSEMR" + mTask_flag + "_" + mPn_id
            + FILE_EXTENTION_MSD;
    String state = android.os.Environment.getExternalStorageState();
    if (!state.equals(android.os.Environment.MEDIA_MOUNTED)) {
        Global.alertbox("", "SD Card is not mounted.", mContext);
        throw new IOException("SD Card is not mounted.  It is " + state
                + ".");
    }

    File directory = new File(sFileName).getParentFile();
    if (!directory.exists() && !directory.mkdirs()) {
        directory.mkdirs();
        throw new IOException("Path to file could not be created.");
    }

}

public void setRecodingLayout() {

    btnStop.setEnabled(false);
    try {
        btnStart.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                boolean mStartRecording = true;
                try {
                    btnStop.setEnabled(true);
                    btnStart.setEnabled(false);
                    onRecord(mStartRecording);

                } catch (SettingNotFoundException e) {
                    e.printStackTrace();
                }

            }
        });         
                    btnStop.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                try {
                boolean mStartRecording = false;
                try {
                    onRecord(mStartRecording);
                } catch (SettingNotFoundException e) {
                    e.printStackTrace();
                }

            } catch (SQLiteException e) {
                // TODO: handle exception
            } catch (Exception e) {
                // TODO: handle exception
            }
                        }
        });

    } catch (NullPointerException e) {

    }
}

public void setProperty() {
    Bundle bundel = getIntent().getExtras();
    mReuqestcode = (Integer) bundel.get("REQUEST_CODE");
    // property for Record
    if (mReuqestcode == 1) {
        mPn_id = (String) bundel.get("PN_ID");
        mDescription = (String) bundel.get("DESCRIPTION");
        mTask_flag = (String) bundel.get("TASK_FLAG");
        mPatient_id = (String) bundel.get("PATIENT_ID");
        mPatient_name = (String) bundel.get("PATIENT_NAME");
        btnStart = (Button) findViewById(R.id.btnStart);
        btnStop = (Button) findViewById(R.id.btnStop);
        btnStop.setEnabled(false);
        setRecodingLayout();
        try {
            setRecordPath();
        } catch (IOException e) {
            e.printStackTrace();
        }
     }
    }
   }

preguntado el 13 de septiembre de 12 a las 06:09

1 Respuestas

Debe crear una nueva instancia de grabadora de medios cada vez que desee grabar (asegurándose de liberar la anterior).

Actualizar: lo sentimos, solo necesita crear una nueva instancia si llama , sobre el objeto De lo contrario, puedes llamar reajustar, Lee esto: http://developer.android.com/reference/android/media/MediaRecorder.html

Ejemplo: digamos que tiene una actividad con 2 botones, un botón de grabación y un botón de reproducción

public class MyRecordDemo extends Activity {
   private static final String PATH_NAME = "/sdcard/myfile.3gp"; //probably shouldn't hardcode this
   private Button mRecordButton, mStopButton;
   private MediaRecorder mRecorder = null;
   private boolean mIsRecording = false;
   public void onCreate(Bundle state) {
      super.onCreate(state);
      setContentView(R.layout.recorder_demo);
      mRecordButton = (Button) findViewById(R.id.record_btn);
      mStopButton = (Button) findViewById(R.id.stop_btn);
      mStopButton.setOnClickListener(new View.OnClickListener() {
         public void onClick(View view) {
             if (mIsRecording && mRecorder != null) {
               mRecorder.stop(); 
               mRecorder.release();
             }
          }
      });
      mRecordButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
          if (mIsRecording && mRecorder != null) {
              mRecorder.stop(); 
              mRecorder.release();
           }
           mRecorder = new MediaRecorder();
           mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
           mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
           mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
           mRecorder.setOutputFile(PATH_NAME);
           mRecorder.prepare();
           mRecorder.start()
        }

      });
   }

}

Respondido el 13 de Septiembre de 12 a las 07:09

Este es mi código mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); mRecorder.setOutputFile(sNombreArchivo); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mRecorder.prepare(); mRecorder.start(); Estoy creando una nueva instancia de MEDIARECORDER cada vez para grabar. No se cual es el problema. Recibo un error de preparación () cada vez después de la primera grabación en cualquier dispositivo. - user17128

edite su pregunta y coloque su código allí. No solo el código anterior, sino toda la actividad si es posible. - Matt Wolfe

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.