2013-03-05 44 views
0

我做了一個代碼,讓我記錄來自麥克風的音頻。奇怪的是,當它似乎有某種滯後單擊我的按鈕,該按鈕保持視覺上按下半秒鐘,然後啓動它的方法。有沒有這個原因,我怎麼解決這個問題?滯後於我的按鈕

什麼我有現在:

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; 
} 

編輯 感謝您的幫助,我決定與服務工作,但我在努力一點點。我創建:

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; 

有一個關於這個問題,我怎麼能現在停止此服務(=停止錄音)(再次點擊FE的按鈕),交流思想回活動?我試圖在服務中添加停止功能,但它似乎並不當我打電話service.stop()停止它的工作..

回答

1
  • 你可以(在 最多幾秒鐘。)使用AsyncTask短期操作
  • 使用Service長期運行的操作

注意:AsyncTask取線程的護理爲您處理。如果你寫一個Service,你必須產生你自己的線程,否則它將在UI線程上運行。

其中幾種方式做到這一點:

服務:

@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 
    }; 
}; 

代碼到STA的定義室溫服務

Intent intent = new Intent(this, YourService.class); 
Messenger messenger = new Messenger(handler); 
intent.putExtra("MESSENGER", messenger); 
startService(intent); 
+0

謝謝,從來沒有使用過這一點,但我會很快閱讀和嘗試,會盡快讓你知道,如果我解決它! – 2013-03-05 08:15:59

+2

@MatthiasVanb作爲[文件](http://developer.android.com/reference/android/os/AsyncTask.html)說:(最多幾秒鐘)* AsyncTasks應該理想地用於短操作*我認爲你需要['Service'](http://developer.android.com/reference/android/app/Service.html)。 – 2013-03-05 08:18:25

+0

嗯,好的。我是初學者,所以現在我很難知道哪一個最好:D但是錄音本身當然可以超過幾秒鐘..這將是大部分時間... – 2013-03-05 08:26:26

3

我的猜測是,因爲你開始在同一個線程中記錄用戶界面,直到startRecording()中的所有代碼都執行完畢,UI纔會響應。你可能想考慮在它自己的線程中調用onRecord。

+0

謝謝!我將閱讀關於AsyncTask的內容,然後回到這裏! – 2013-03-05 08:16:15