0

我在onCreate()final中创建了一个记录器MediaRecorder recorder=new MediaRecorder();,当用户按下后退按钮时我需要停止记录。

为了停止录音机,我使用了以下代码。

final MediaRecorder recorder=new MediaRecorder();
@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.noise);
    // elementi
        TextView picco=(TextView) findViewById(R.id.picco_recorder);
        ImageView noise_bar=(ImageView) findViewById(R.id.noise_bar);
        ImageView noise_bar_red=(ImageView) findViewById(R.id.noise_bar_red);
        ImageView imgnoise = (ImageView) findViewById(R.id.logo_noise);
        imgnoise.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                recorder.stop();
                recorder.release();
                Intent torna_home=new Intent(Noise.this,Index.class);
                startActivity(torna_home);
            }
        });
    // noise
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.setOutputFile("/dev/null");
        try{
            recorder.prepare();
        }catch(IllegalStateException e){
            Log.d("Errore",e.toString());
            e.printStackTrace();
        }catch(IOException e){
            Log.d("Errore",e.toString());
            e.printStackTrace();
        }
        recorder.start();
        double db=10*Math.log(recorder.getMaxAmplitude());
        picco.setText("" + (int)db);
        noise_bar.scrollTo(0, (int)((int)db*1.5));
        noise_bar_red.scrollTo(0, (int)((int)db*1.5));
        Timer timer=new Timer();
        timer.scheduleAtFixedRate(new RecorderTask(recorder), 0, 500);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK)) {
        Intent torna_home=new Intent(Noise.this,Index.class);
        startActivity(torna_home);
    }
    return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
    super.onBackPressed();
    recorder.stop();
    recorder.release();
}
private class RecorderTask extends TimerTask{
    TextView risultato=(TextView) findViewById(R.id.picco_recorder);
    TextView max=(TextView) findViewById(R.id.max_recorder);
    TextView media=(TextView) findViewById(R.id.media_recorder);
    ImageView noise_bar=(ImageView) findViewById(R.id.noise_bar);
    ImageView noise_bar_red=(ImageView) findViewById(R.id.noise_bar_red);
    private MediaRecorder recorder;
    public RecorderTask(MediaRecorder recorder){
        this.recorder = recorder;
    }
    public void run(){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                double db=10*Math.log(recorder.getMaxAmplitude());
                risultato.setText("" + (int)db);
                if(Integer.parseInt(max.getText().toString())<(int)db){
                    max.setText("" + (int)db);
                    noise_bar_red.scrollTo(0, (int)((int)db*1.5));
                }
                media.setText(""+((int)db+Integer.parseInt(max.getText().toString()))/2);
                noise_bar.scrollTo(0, (int)((int)db*1.5));
            }
        });
    }
}

拦截后退按钮,但它在 onCreate 之外,我无法拦截录音机!

4

4 回答 4

1

您可以改写 onBackPressed :

@Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
       //Stop recorder
    }
于 2012-11-30T12:00:46.880 回答
1

如果按钮返回,默认行为onKeyDown是调用onBackPressed. 但是由于您已经覆盖了onKeyDown,因此您可能只调用onKeyDown. 我不知道当您覆盖这两个函数时它是如何工作的,但尝试删除onKeyDown并只保留onBackPressed并查看是否recorder.stop()被调用。

于 2012-11-30T12:57:01.550 回答
0

你必须使用

@Override
public void onBackPressed() {
    super.onBackPressed()
//Add your desired code here
}

这应该适合你。

于 2012-11-30T12:00:13.620 回答
0

您始终可以覆盖任何按键。对于覆盖后退按钮,尤其是使用

@Override
public void onBackPressed() {
   super.onBackPressed();
   recorder.stop();//or whatever code you use to stop recorder
}

也用于在oncreate之外访问记录器,声明MediaRecorder recorder为全局变量,在onCreate()方法中对其进行初始化

于 2012-11-30T12:10:53.383 回答