2012-12-11 155 views
0

我正在進行通話錄音應用程序。我的問題是,收到電話時錄音工作正常,但不會停止錄音。下面是我的代碼和logcat。任何形式的幫助非常感謝。使用mediaRecorder錄製時爲空例外

我的代碼:

public class IncomingCallReceiver extends BroadcastReceiver { 
    private MediaRecorder mRecorder; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
      Bundle bundle = intent.getExtras(); 
      if(null == bundle) 
        return; 
      String state = bundle.getString(TelephonyManager.EXTRA_STATE); 
      if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) 
      { 
      } 
      else if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)){ 
       Log.i("TelephonyManager", "Call picked up"); 
       mRecorder = new MediaRecorder(); 
       mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
       mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
       mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
       mRecorder.setAudioEncodingBitRate(16); 
       mRecorder.setAudioSamplingRate(44100); 
       mRecorder.setOutputFile("/sdcard/Recording/callrecord.mp4"); 
       try{ 
        mRecorder.prepare(); 
       } 
       catch(IOException e){ 
       } 
       mRecorder.start(); 
       Log.i("StartRecordingCall", "Recording Call end"); 
      } 
      else if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)){ 
       Log.i("TelephonyManager", "Call hunged up"); 
       mRecorder.stop(); 
       mRecorder.release(); 
       mRecorder=null; 
      } 
    } 

} logcat的

12-11 22:53:51.502: E/MediaRecorder(2831): stop called in an invalid state: 1 
12-11 22:53:51.502: D/AndroidRuntime(2831): Shutting down VM 
12-11 22:53:51.502: W/dalvikvm(2831): threadid=1: thread exiting with uncaught exception (group=0x2b544300) 
12-11 22:53:51.502: E/AndroidRuntime(2831): FATAL EXCEPTION: main 
12-11 22:53:51.502: E/AndroidRuntime(2831): java.lang.RuntimeException: Unable to start receiver com.example.callrecorder.IncomingCallReceiver: java.lang.IllegalStateException 
12-11 22:53:51.502: E/AndroidRuntime(2831): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2362) 
12-11 22:53:51.502: E/AndroidRuntime(2831): at android.app.ActivityThread.access$1500(ActivityThread.java:142) 
12-11 22:53:51.502: E/AndroidRuntime(2831): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284) 
12-11 22:53:51.502: E/AndroidRuntime(2831): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-11 22:53:51.502: E/AndroidRuntime(2831): at android.os.Looper.loop(Looper.java:137) 
12-11 22:53:51.502: E/AndroidRuntime(2831): at android.app.ActivityThread.main(ActivityThread.java:4931) 
12-11 22:53:51.502: E/AndroidRuntime(2831): at java.lang.reflect.Method.invokeNative(Native Method) 
12-11 22:53:51.502: E/AndroidRuntime(2831): at java.lang.reflect.Method.invoke(Method.java:511) 
12-11 22:53:51.502: E/AndroidRuntime(2831): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
12-11 22:53:51.502: E/AndroidRuntime(2831): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558) 
12-11 22:53:51.502: E/AndroidRuntime(2831): at dalvik.system.NativeStart.main(Native Method) 
12-11 22:53:51.502: E/AndroidRuntime(2831): Caused by: java.lang.IllegalStateException 
12-11 22:53:51.502: E/AndroidRuntime(2831): at android.media.MediaRecorder.stop(Native Method) 
12-11 22:53:51.502: E/AndroidRuntime(2831): at com.example.callrecorder.IncomingCallReceiver.onReceive(IncomingCallReceiver.java:63) 
12-11 22:53:51.502: E/AndroidRuntime(2831): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2355) 
12-11 22:53:51.502: E/AndroidRuntime(2831): ... 10 more 
+1

日誌表明您正嘗試在閒置狀態下停止媒體記錄器。這表明您要麼在新創建的媒體播放器(尚未啓動)上調用「stop」,要麼在同一個mediaplayer上調用兩次。 – Michael

+0

看來,一旦我結束通話並進入TelephonyManager.EXTRA_STATE_IDLE狀態,mRecorder將無法找到。調用mRecorder.stop()時引發異常。 – Chewy

+0

BroadcastReceiver文檔聲明:「一個BroadcastReceiver對象只在調用onReceive(Context,Intent)期間有效,一旦你的代碼從這個函數返回,系統就認爲該對象已經完成並且不再活動。」所以我建議你把'mRecorder'放在一個外部類中,或者使它成爲靜態的。 – Michael

回答

0

你做錯了TelephonyManager.EXTRA_STATE_OFFHOOK發射時我們削減或結束通話,你開始在錄製。當你拿起電話

而且TelephonyManager.EXTRA_STATE_IDLE將解僱,這將TelephonyManager.EXTRA_STATE_OFFHOOK之前進行發射和TelephonyManager.EXTRA_STATE_IDLE狀態要訪問mRecorder.stop();這是null ...並且未初始化。

而且您的mRecorder也應該是靜態的,因爲BroadcastReceiver爲不同事件調用多個事件。

+0

其實'OFFHOOK =電話摘機。至少存在一個呼叫正在撥號,處於活動狀態或保持狀態,並且沒有呼叫正在振鈴或等待。請參閱http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/ 2.0_r1/COM /安卓/內部/電話/ Phone.java#Phone.State.0OFFHOOK – Michael

相關問題