呼叫记录器问题 - Xamarin.Android

时间:2015-06-17 05:00:52

标签: c# android xamarin xamarin.android

我正在使用MediaRecorder类库开发用于录制语音通话的应用程序。我正在使用Moto G mobile(API Level 21)进行USB调试。打完电话后,我开始用下面的代码录音。它以异常结束并在recorder.Start()处中断。它创建一个文件,但它不包含任何音频,它是零字节的虚拟文件。

public MediaRecorder recorder = new MediaRecorder();

开始通话记录:

recorder.Reset();
recorder.SetAudioSource(AudioSource.VoiceCall);
recorder.SetOutputFormat(OutputFormat.ThreeGpp);
recorder.SetAudioEncoder(AudioEncoder.Aac);
recorder.SetOutputFile("/sdcard/Download" + "/123.amr");                    
recorder.Prepare();
recorder.Start(); // Exception Hits

结束通话记录

recorder.Stop();
recorder.Release();

权限:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

异常

{Java.Lang.RuntimeException: Exception of type 'Java.Lang.RuntimeException' was thrown.  
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000b] in <filename unknown>:0   
  at Android.Runtime.JNIEnv.CallVoidMethod (IntPtr jobject, IntPtr jmethod) [0x00062] in /Users/builder/data/lanes/monodroid-mavericks-monodroid-5.1-series/d419c934/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:554   
  at Android.Media.MediaRecorder.Start () [0x00043] in /Users/builder/data/lanes/monodroid-mavericks-monodroid-5.1-series/d419c934/source/monodroid/src/Mono.Android/platforms/android-21/src/generated/Android.Media.MediaRecorder.cs:1475   
  at CallRecorderAndroidPOC.MainActivity+<>c__DisplayClass4.<OnCreate>b__0 (System.Object param0, System.EventArgs param1) [0x000a1] in d:\Android Application Development\POC's\CallRecorderAndroidPOC\CallRecorderAndroidPOC\MainActivity.cs:65 
  --- End of managed exception stack trace ---
java.lang.RuntimeException: start failed.
    at android.media.MediaRecorder.start(Native Method)
    at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)
    at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:29)
    at android.view.View.performClick(View.java:4761)
    at android.view.View$PerformClick.run(View.java:19767)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5312)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
}

我将文件扩展名更改为.aac,但也抛出相同的异常。

可以,有人帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

您将输出格式为:recorder.SetOutputFormat(OutputFormat。 ThreeGpp );。

但是,

设置输出路径时,它的位置为:recorder.SetOutputFile(&#34; / sdcard / Download&#34; +&#34; / 123。 amr &#34;) ;

将其修改为:recorder.SetOutputFile(&#34; / sdcard / Download / 123。 3gpp &#34;);

答案 1 :(得分:0)

有点晚了,我知道,但我遇到了同样的问题并解决了它,所以我想为遇到这个问题的其他人发布答案。

问题可能在于您尝试从非活动的音频源录制。如果那是问题所在,那么当你打电话时,该代码应该可以正常工作。

这种情况可能发生的另一个原因是,您正试图通过不支持此功能的手机进行语音录音,例如谷歌手机。