MediaRecorder - 记录通话应用程序
Posted
技术标签:
【中文标题】MediaRecorder - 记录通话应用程序【英文标题】:MediaRecorder - record calls application 【发布时间】:2013-03-02 20:18:09 【问题描述】:我正在尝试开发记录通话的应用程序。
当我录制输出声音时,声音听起来很有线 - 电子声音而不是 其他人的声音。
这是我的代码:
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 时,一切正常,但是当我拨打电话时,仍然会出现这种奇怪的声音......
有什么想法吗?
谢谢!
【问题讨论】:
你有什么解决办法吗? 【参考方案1】:使用 mRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
但是由于通话录音是不合法的,所以很多设备不支持(MediaRecorder.AudioSource.VOICE_CALL/MediaRecorder.AudioSource.VOICE_DOWNLINK),将在某些设备上工作。
我已经在 LG 上进行了测试,并且工作正常,但不适用于 Nexus 设备。
因此,这些使用所有设备都允许的 MediaRecorder.AudioSource.MIC。
【讨论】:
当我使用 MediaRecorder.AudioSource.VOICE_CALL 时,它给了我空指针异常并且上行和下行链路录制后声音听不见,但在麦克风工作正常的情况下,如你所说。那么,有什么解决办法吗?【参考方案2】:再次通话记录功能,或者更确切地说
mrec.setAudioSource(MediaRecorder.AudioSource.VOICE_DOWNLINK);
高度依赖设备。
有些设备不允许上行,有些阻止下行,有些不允许语音通话。然而,有些设备允许各种音频源。
例如:我使用允许上行链路和下行链路的 Moto 设备。 但不能同时进行,即语音通话。所以要么我可以记录我的 语音或发件人语音。
您应该尝试在不同的手机上验证此行为
【讨论】:
您确定不可能在任何设备上进行任何操作吗? 您在市场上看到的大多数应用程序都具有打开/关闭录制选项以适应硬件的功能。但我不知道有任何黑客攻击它。 当我使用 MediaRecorder.AudioSource.VOICE_CALL 时,它给了我空指针异常并且上行和下行链路录制后声音听不见,但在麦克风工作正常的情况下,如你所说。因此,对于上行链路或下行链路,有任何解决方案。我做错了什么?以上是关于MediaRecorder - 记录通话应用程序的主要内容,如果未能解决你的问题,请参考以下文章