2013-03-02 41 views
0

即時嘗試開發應用程序,記錄調用。MediaRecorder - 記錄調用應用程序

當im錄音時輸出的聲音聽起來非常有線 - 電子聲音代替了其他人的聲音 。

這裏是我的代碼:

public class MainActivity extends Activity implements OnClickListener { 
private Boolean Recording; 
private Button btn_REC; 
private MediaRecorder mrec; 
private File audiofile = null; 
private static final String TAG = "SoundRecordingDemo"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 
    Recording = false; 
    mrec = new MediaRecorder(); 
    btn_REC = (Button) findViewById(R.id.btn_record); 
    btn_REC.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) 
{ 
    if (!Recording) 
    { 
     try 
     { 
      startRecording(); 
      Recording = true; 
     } 
     catch (IOException e1) 
     { 
      e1.printStackTrace(); 
     } 

     btn_REC.setText("RECORDING"); 
    } 


    else 
    {  
     stopRecording(); 
     btn_REC.setText("RECORD"); 
    } 


} 

protected void startRecording() throws IOException { 
    mrec.setAudioSource(MediaRecorder.AudioSource.VOICE_DOWNLINK); 
    mrec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    if (audiofile == null) { 
     File sampleDir = Environment.getExternalStorageDirectory(); 
     try { 
      audiofile = File.createTempFile("ibm", ".3gp", sampleDir); 
     } catch (IOException e) { 
      Log.e(TAG, "sdcard access error"); 
      return; 
     } 
    } 
    mrec.setOutputFile(audiofile.getAbsolutePath()); 
    mrec.prepare(); 
    mrec.start(); 
} 

protected void stopRecording() { 
    mrec.stop(); 
    mrec.release(); 
    processaudiofile(); 
} 

protected void processaudiofile() { 
    ContentValues values = new ContentValues(3); 
    long current = System.currentTimeMillis(); 
    values.put(MediaStore.Audio.Media.TITLE, "audio" + audiofile.getName()); 
    values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current/1000)); 
    values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp"); 
    values.put(MediaStore.Audio.Media.DATA, audiofile.getAbsolutePath()); 
    ContentResolver contentResolver = getContentResolver(); 

    Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    Uri newUri = contentResolver.insert(base, values); 

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, newUri)); 
} 

}

當我嘗試改變的AudioSource上行鏈路或語音調用它仍然是相同的。 當我確定這對MIC的所有工作得很好,但是當我撥打電話還是這個陌生的聲音開始...

有什麼想法?

謝謝!

+0

你有什麼解決方案嗎? – 2013-11-23 06:21:45

回答

0

再次呼叫記錄功能,或者更確切地說,

mrec.setAudioSource(MediaRecorder.AudioSource.VOICE_DOWNLINK); 

是高度設備相關的東西。

有些設備不允許上行鏈路,有的阻止下行鏈路,有的不允許語音呼叫。但還有設備允許各種音頻源

例如:我使用允許上行鏈路和下行鏈路的Moto設備。 但不是兩者同時即語音通話。因此,無論我是否可以錄製我的 聲音或發件人聲音。

你應該嘗試不同的手機來驗證此行爲

+0

您確定無法在任何設備上進行任何操作嗎? – 2013-03-02 22:30:07

+0

您在市場上看到的大多數應用程序都具有打開/關閉刻錄功能以適應硬件。但我不知道有任何破解。 – 2013-03-03 18:36:57

+0

當我使用MediaRecorder.AudioSource.VOICE_CALL時,它會給我空指針例外和上行鏈路和下行鏈路語音在錄音後不可聽,但在麥克風正常工作的情況下,如您所說。所以,對於上行鏈路或下行鏈路有任何解決方案。我做什麼錯了? – 2013-11-23 06:24:14

1

使用mRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);

但是,由於通話記錄不合法,所以很多設備不支持(MediaRecorder.AudioSource.VOICE_CALL/MediaRecorder.AudioSource.VOICE_DOWNLINK),可以在某些設備上工作。

我已經在LG上測試過,工作正常,但沒有與Nexus設備一起工作。

所以相反這些使用MediaRecorder.AudioSource.MIC,這是所有設備都允許的。

+0

當我使用MediaRecorder.AudioSource.VOICE_CALL時,它會給我空指針例外和上行鏈路和下行鏈路語音在記錄後不可聞,但在話筒工作正常的情況下如您所說。那麼,這有什麼解決方案? – 2013-11-23 06:21:25