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

onKeyDownボタンが戻る場合ののデフォルトの動作は、 を呼び出すことonBackPressedです。しかし、 をオーバーライドしたonKeyDownので、 を呼び出すだけかもしれませんonKeyDown。両方の関数をオーバーライドしたときにどのように機能するかはわかりませんが、削除onKeyDownして保持するだけにして、呼び出されるonBackPressedかどうかを確認してくださいrecorder.stop()

于 2012-11-30T12:57:01.550 に答える
1

代わりに onBackPressed をオーバーライドできます。

@Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
       //Stop recorder
    }
于 2012-11-30T12:00:46.880 に答える
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 に答える
0

使用する必要があります

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

これはうまくいくはずです。

于 2012-11-30T12:00:13.620 に答える