2014-12-26 1 views
1

음성 통화 녹음을위한 앱을 만들고 있습니다. 내가 알기 론 전화가 오면 전화는 OFFHOOK로갑니다.CALL_STATE_OFFHOOK 대신 STATE_IDLE_RINGING

이것은 일어난 일입니다. 그러나 전화를 걸고있는 순간에 내 앱이 녹음 중입니다. 그 후, 내가 전화 할 때마다 전화가 링잉 상태가됩니다. 모든 상태에 대해 Log.i() 문을 두어 변경 될 때마다 전화 상태를 가져올 수 있습니다. 전화를 걸 때마다 전화가 링잉 상태가됩니다. 여기

코드입니다 : -
public class CallRecorder extends Service{ 

private MediaRecorder rec; 
private boolean recordStarted; 
private File file; 
//private TelephonyManager manager; 
//private StateListener listener; 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent, flags, startId); 

    Bundle b = intent.getExtras(); 
    file = Environment.getExternalStorageDirectory(); 


    rec = new MediaRecorder(); 
    rec.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); 
    rec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    rec.setOutputFile(file.getAbsolutePath() + "/TESTRECORD.3gp"); 
    rec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 


    TelephonyManager manager = (TelephonyManager) getApplicationContext().getSystemService(getApplicationContext().TELEPHONY_SERVICE); 
    manager.listen(new PhoneStateListener(){ 
     @Override 
     public void onCallStateChanged(int state, String incomingNumber) { 

      if(TelephonyManager.CALL_STATE_OFFHOOK==state && rec == null) 
      { 
       try { 
        Log.i("OUTGOING CALL", "CALL_STATE_OFFHOOK"); 
        rec.prepare(); 
        //Thread.sleep(500); 
        rec.start(); 
        recordStarted = true; 
        Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show(); 
       } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 
      else if(TelephonyManager.CALL_STATE_IDLE==state) 
      { 
       Log.i("OUTGOING CALL", "CALL_STATE_IDLE"); 
       if(rec!=null) 
       { 
        try{ 
        rec.stop(); 
        rec.reset(); 
        rec.release(); 
        recordStarted = false; 
        stopSelf(); 
        } 
        catch (IllegalStateException e) { 
         //Log.e("CALL ERROR",e.getMessage()); 
        }// ILLEGALSTATEEXCEPTION WHILE THE CALL ENDS AUTOMATICALLY 

       } 
      } 
      else 
      { 
       Log.i("OUTGOING CALL", "CALL_STATE_RINGING"); // 2nd time outgoing 


      } 

     } 
     }, PhoneStateListener.LISTEN_CALL_STATE);  // LISTENER REGISTERATION 
    Toast.makeText(this, "Calling...", Toast.LENGTH_LONG).show(); 
    return 0; 
} 
} 

지금 내가 전화 했어 때마다, "PHONE_STATE_RINGING"에 대한 로그의 수가 증가하고있다.

두 번째로 전화를 걸었을 때, 3 번 표시되었습니다.

세 번째로 전화를 걸었을 때 5 번 표시되었습니다.

네 번째로 전화를 걸면 7 회 표시됩니다.

다음은 logcat입니다.

12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:45.501: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:45.621: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:52.051: I/OUTGOING CALL(7614): CALL_STATE_RINGING 
12-26 13:53:52.071: I/OUTGOING CALL(7614): CALL_STATE_RINGING 

는 모든 시도 후, CALL_STATE_IDLE가 표시됩니다.

그리고 아래와 같은 몇 가지 임의 오류가

표시됩니다
stop is called in an invalid state:4 

사람이 어떻게 일어나고 왜 & 말해 줄래? 미리 감사드립니다.

답변

0

이벤트를 구독 취소하지 않았으므로 모두 겹쳐서 표시됩니다. :) 아주 간단한 문제 해결!

여기 내 onReceive 방법입니다 :

@Override 
public void onReceive(Context context, Intent intent) { 
    mContext = context; 
    mIntent = intent; 
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
    tm.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); 
} 

그리고 이것은 내 onCallStateChanged 이벤트의 끝 부분에 사용되는 라인 :

((TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE)).listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); 

그것을 해결한다!