0

マイクからの音声を録音できるコードを作成しました。奇妙なことに、ボタンをクリックすると、何らかのラグがあるように見え、ボタンが視覚的に0.5秒間押されたままになり、メソッドが開始されます。これには理由がありますか?どうすればこれを解決できますか?

私が今持っているもの:

private void onRecord(boolean start) {
        if (start) {
            startRecording();
        } else {
            stopRecording();
        }
    }

private void startRecording() {
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setOutputFile(mFileName);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

        try {
            mRecorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }

        mRecorder.start();
    }

    private void stopRecording() {
        mRecorder.stop();
        mRecorder.release();
        mRecorder = null;
    }
public void onClick(View v) {

        switch (v.getId()) {
case R.id.bRecord:

            if (mStartRecording) {
                mRecordButton.setText("Stop Recording");
                onRecord(true);
                mStartRecording = false;

            } else {
                mRecordButton.setText("Start Recording");
                mStartRecording = true;
                onRecord(false);

            }

            break;
}

EDIT 助けてくれてありがとう、私はサービスを利用することにしましたが、少し苦労しています。私が作成しました:

public class RecordService extends IntentService {

    private MediaRecorder mRecorder = null;
    private String mFileName;
    private static final String LOG_TAG = "RecordService";

    public RecordService() {
        super("RecordService");
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
        mFileName += "/audiorecordtest.3gp";

        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setOutputFile(mFileName);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

        try {
            mRecorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
        }

        mRecorder.start();

    }
}

case R.id.bRecord:

            if (mStartRecording) {
                mRecordButton.setText("Stop Recording");
                //onRecord(true);
                Intent service = new Intent(myContext, RecordService.class);
                myContext.startService(service); 
                mStartRecording = false;

            } else {
                mRecordButton.setText("Start Recording");
                mStartRecording = true;
                onRecord(false);

            }

            break;

これについて質問があります。どうすればこのサービスを停止 (= 記録を停止) し (ボタンをもう一度クリックして)、アクティビティにアイデアを伝えることができますか? サービスに停止機能を追加しようとしましたが、service.stop() を呼び出して停止しても機能しないようです。

4

2 に答える 2

3

私の推測では、UI と同じスレッドで記録を開始しているため、UI は startRecording() のすべてのコードの実行が完了するまで応答しません。独自のスレッドで onRecord を呼び出すことを検討することをお勧めします。

于 2013-03-05T08:08:31.983 に答える
1
  • AsyncTaskを短い操作(最大で数秒) に使用できます。
  • 長時間実行される操作にサービスを使用する

注意: AsyncTaskがスレッド処理を処理します。を記述する場合はService、独自のスレッドを生成する必要があります。それ以外の場合は、UI スレッドで実行されます。

それを行ういくつかの方法の1つ:

サービス:

@Override       
protected void onHandleIntent(Intent intent) {

    //your recorder code

    //get the messenger from intent
    Bundle extras = intent.getExtras();
    if (extras != null) {
       Messenger messenger = (Messenger) extras.get("MESSENGER");
       try {
          //send a message back to the activity
          messenger.send(...);
       } catch (android.os.RemoteException e1) {
          Log.w(getClass().getName(), "Exception sending message", e1);
       }
    }
}

アクティビティ:

ハンドラーの定義

private Handler handler = new Handler() {
    public void handleMessage(Message message) {
      //do something with the message from the service 
    };
};

サービスを開始するコード

Intent intent = new Intent(this, YourService.class);
Messenger messenger = new Messenger(handler);
intent.putExtra("MESSENGER", messenger);
startService(intent);
于 2013-03-05T08:15:00.150 に答える