2011-10-02 78 views
1

可能重複:
Stop Recording and Context無法停止錄音?

我不明白什麼是錯的!? 當手機響起然後錄製開始。 但是,當通話結束時,我得到NullPointerException,因爲MediRecorder是空的,但錄製仍然會持續,直到我關閉窗口時出現錯誤。 我的問題與此相同Sound Recorder Widget doesnt stop recording

public class Call extends BroadcastReceiver 
{ 
    private MediaRecorder mRecorder;  
    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)) 
     {   
      mRecorder = new MediaRecorder(); 
      mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
      mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
      mRecorder.setOutputFile("/sdcard/Record.3gp";); 
      mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
      try {mRecorder.prepare();} 
      catch (IOException e){} 
      mRecorder.start(); 

      // if I stop recording here, then everything is fine 
      /* 
       try 
        {Thread.sleep(300000);} 
       catch (InterruptedException e) 
        {e.printStackTrace();} 
       mRecorder.stop(); 
       mRecorder.release(); 
       mRecorder = null;  
      */ 

     } 

     if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)) 
     { 
      if(mRecorder != null) // But this always false. if I remove this condition - 
      { 
       mRecorder.stop(); // - then here NullPointerException 
       mRecorder.release(); 
       mRecorder = null; 
      } 
     } 
    } 
} 

的logcat:

10-01 07:13:28.054: ERROR/AndroidRuntime(553): Uncaught handler: thread main exiting due to uncaught exception 
10-01 07:13:29.134: ERROR/AndroidRuntime(553): java.lang.RuntimeException: Unable to start receiver xxx.xxx.xxx.Call: java.lang.NullPointerException 
10-01 07:13:29.134: ERROR/AndroidRuntime(553):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2646) 
10-01 07:13:29.134: ERROR/AndroidRuntime(553):  at android.app.ActivityThread.access$3100(ActivityThread.java:119) 
10-01 07:13:29.134: ERROR/AndroidRuntime(553):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1913) 
10-01 07:13:29.134: ERROR/AndroidRuntime(553):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-01 07:13:29.134: ERROR/AndroidRuntime(553):  at android.os.Looper.loop(Looper.java:123) 
10-01 07:13:29.134: ERROR/AndroidRuntime(553):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
10-01 07:13:29.134: ERROR/AndroidRuntime(553):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-01 07:13:29.134: ERROR/AndroidRuntime(553):  at java.lang.reflect.Method.invoke(Method.java:521) 
10-01 07:13:29.134: ERROR/AndroidRuntime(553):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
10-01 07:13:29.134: ERROR/AndroidRuntime(553):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
10-01 07:13:29.134: ERROR/AndroidRuntime(553):  at dalvik.system.NativeStart.main(Native Method) 
10-01 07:13:29.134: ERROR/AndroidRuntime(553): Caused by: java.lang.NullPointerException 
10-01 07:13:29.134: ERROR/AndroidRuntime(553):  at xxx.xxx.xxx.Call.onReceive(Call.java:49) 
10-01 07:13:29.134: ERROR/AndroidRuntime(553):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2637) 
10-01 07:13:29.134: ERROR/AndroidRuntime(553):  ... 10 more 
10-01 07:13:33.184: ERROR/audio_input(31): unsupported parameter: x-pvmf/media-input-node/cap-config-interface;valtype=key_specific_value 
10-01 07:13:33.184: ERROR/audio_input(31): VerifyAndSetParameter failed 

回答

1

你在聲明MediaRecorder對象的新實例,你的「如果電話響起」使用相同的名稱爲您的發言類MediaRecorder對象,只要您離開if語句的範圍,該對象就會丟失。只需刪除行MediaRecorder mRecorder = new MediaRecorder();前面的MediaRecorder聲明,您應該很好。

+0

我照你說斯雷頓,但它沒有幫助 – user881902

1

問題是你在if語句中實例化一個新的MediaRecorder,它隱藏了MediaRecorder mRecorder類成員。所以更改:

if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) 
     {   
      MediaRecorder mRecorder = new MediaRecorder(); 
     ..... 
     }   

這樣:

if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) 
     {   
      mRecorder = new MediaRecorder(); 
     ..... 
     }