Obtener objeto de la memoria usando la dirección de la memoria

Quiero saber cómo sacar un Objeto de la memoria, en mi caso un MediaRecorder. Aquí está mi clase:

Clase mímica:

public class MyMic  {

    MediaRecorder recorder2;
    File file;
    private Context c;

    public MyMic(Context context){
        this.c=context;
        recorder2=  new MediaRecorder();
    }

    private void stopRecord() throws IOException {
        recorder2.stop();
        recorder2.reset();
        recorder2.release();
    }

    private void startRecord() {

        recorder2.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder2.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        recorder2.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder2.setOutputFile(file.getPath());
        try {
            recorder2.prepare();
            recorder2.start();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

mi clase de receptor:

public class MyReceiver extends BroadcastReceiver {

    private Context c;
    private MyMic myMic;
    @Override
    public void onReceive(Context context, Intent intent) {
        this.c=context;
        myMic = new MyMic(c);
        if(my condition = true){
        myMic.startRecord();
        }else

        myMic.stopRecord();
    }
}

Así que cuando estoy llamando startRecord() crea un nuevo MediaRecorder pero cuando instalo mi clase por segunda vez, no puedo recuperar mi Objeto. ¿Puedo recuperar mi MediaRecorder con su dirección.

preguntado el 12 de junio de 12 a las 17:06

1 Respuestas

Debe colocar su constructor para MediaRecorder dentro del constructor de la clase que está creando, en lugar de dentro del método startRecord() como este:

public class MyMic  {

MediaRecorder recorder2;
File file;
private Context c;


public MyMic(Context context){
    this.c=context;
    recorder2=  new MediaRecorder();

}


private void stopRecord() throws IOException {
    recorder2.stop();
    recorder2.reset();
    recorder2.release();

}


private void startRecord() {

    recorder2.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder2.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder2.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder2.setOutputFile(file.getPath());
    try {
        recorder2.prepare();
        recorder2.start();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}



}

Además, no puedo entender exactamente qué está tratando de hacer con la lógica dentro de su Constructor, pero probablemente no debería hacerlo de la manera en que lo hace. No debe crear su clase para que tenga que crear una nueva instancia cada vez que desee iniciar/detener la grabación. El objetivo final debe ser un objeto que instancia una vez y mantiene una referencia para que pueda llamar a iniciar / detener en él cuando lo desee.

¿Puede publicar la Actividad (u otra estructura de Android) que está utilizando esta clase desde dentro? Si es así, puedo ayudarlo a vincular los dos de una manera más limpia.

Respondido el 12 de junio de 12 a las 17:06

Edito mi publicación con el código de mi BroadcastReceiverpero supongo que tengo que recuperar mi objeto de la memoria con su dirección. - 113408

elimine la declaración if en su constructor y elimine el parámetro de acción (aunque según su código BroadcastReceiver parece que no estaba usando el Constructor que publicó de todos modos, ya que no tiene ningún parámetro de acción en su código. Vea mi edición. Pruébelo de esta manera y vea cómo va. chicoespuma

Lo hice pero obtengo dos objetos diferentes. porque cada vez que se activa mi receptor, recuerda onCreate para que se pase un nuevo objeto MyMic a stopRecord(); - 113408

Ninguno de los códigos que ha pegado tiene un método onCreate()... Y stopRecord() no pasa ningún parámetro, los parámetros van entre paréntesis. Así que no estoy seguro de lo que quieres decir. Te sugiero que repases un poco la sintaxis de Java antes de intentar crear algo tan complejo con Android. - chicoespuma

Siento mucho haber tenido mi mente en otra parte. Quise decir onReceive(). cada vez que mi BroadcastReceiverse desencadena el onReceive() se llama. Todo lo que quiero es startRecord()si el BrodcastReceiverrecibe una acción, de lo contrario si recibe otra acción stopRecord(). - 113408

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