2012-02-06 3 views
5

어디서 문제가 있는지 알 수 없습니다. 청취자가 onRinging 이벤트를 수신하지 못합니다 (따라서 수신 전화를 수락하거나 거부 할 수 있습니다). 내가 종료 후수신 전화가 울리지 않음

public void onReceive(Context context, Intent intent) { 
SipAudioCall incomingCall = null; 
try { 
SipAudioCall.Listener listener = new SipAudioCall.Listener() { 
... 
@Override 
public void onCallEnded(SipAudioCall call) { 
// TODO Auto-generated method stub 
super.onCallEnded(call); 
} 
@Override 
public void onRinging(SipAudioCall call, SipProfile caller) { 
try { 
call.answerCall(30); 
call.startAudio(); 
call.setSpeakerMode(true); 
if(call.isMuted()) { 
call.toggleMute(); 
} 
} catch (Exception e) { 
e.printStackTrace(); 
} 
} 
}; 
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context; 
incomingCall = wtActivity.manager.takeAudioCall(intent, listener); 
wtActivity.call = incomingCall; 
... 

내가 (CallEnd 이벤트 및 onChanged을받을 :

IntentFilter filter = new IntentFilter(); 
filter.addAction("android.SipDemo.INCOMING_CALL"); 
callReceiver = new IncomingCallReceiver(); 
this.registerReceiver(callReceiver, filter); 
... 
SipManager manager = SipManager.newInstance(this); 
Intent i = new Intent(); 
i.setAction("android.SipDemo.INCOMING_CALL"); 
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, Intent.FILL_IN_DATA); 
manager.open(me, pi, null); 

BroadcastReceiver의 클래스는 이것이다 : 주요 활동 onCreate에서

<uses-permission android:name="android.permission.USE_SIP" /> 

이 있습니다 : 매니페스트 이있다 전화)하지만 나는 onRinging 이벤트를받지 못한다. 무엇이 문제입니까? Thnx

편집 : 변경했습니다.

<receiver android:name=".IncomingCallReceiver" android:label="Call Receiver"> 
    **<intent-filter> 
     <action android:name="android.intent.action.PHONE_STATE" /> 
    </intent-filter>** 
</receiver> 

나는 브로드 캐스트 리시버이 (굵은) 같은 클래스 상속 변경 : 나는 다음과 같이 수신기 (굵게) 새로운 인 텐트 필터를 넣어

@Override 
public void onReceive(Context context, Intent intent) { 
    try { 
     **PhoneStateListener phoneListener=new PhoneStateListener() { 
     @Override 
     public void onCallStateChanged(int state, String incomingNumber) { 
     // TODO Auto-generated method stub 
     Log.d("DEBUG", "Phone listener...."); 
     String stateString = "N/A"; 
     switch (state) { 
     case TelephonyManager.CALL_STATE_IDLE: 
     stateString = "Idle"; 
     break; 
     case TelephonyManager.CALL_STATE_OFFHOOK: 
     stateString = "Off Hook"; 
     break; 
     case TelephonyManager.CALL_STATE_RINGING: 
     stateString = "Ringing"; 
     break; 
    } 
} 
};** 
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context; 
SipSession ses=wtActivity.manager.getSessionFor(intent); 
**TelephonyManager telephony = (TelephonyManager) Context.getSystemService(Context.TELEPHONY_SERVICE); 
telephony.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);** 
... 

지금 내가 아직 거기에만 IDLE 상태를 얻을 수 있지만를 아무런 소리도 내지 않는다.

+0

아무도 도움이 될 의사가 없습니까? 코드가 잘못된 부분을 아는 사람은 누구입니까? – user1182625

답변

5

SipAudioCall 클래스의 소스 코드에 오류가 있습니다.

이 문제를 해결하려면 다음

incomingCall = wtActivity.manager.takeAudioCall(intent, null); 
incomingCall.setListener(listener, true); 
+2

참고 자료가 있으십니까? – tristan2468

+0

나는 당신의 대답을 편집하고 listener 메쏘드가 확실히 호출되도록'setListener'의'callbackImmediately' 매개 변수를 true로 설정했습니다. –

+0

이것은 아주 좋은 해결 방법입니다! – vinitius

4

동의 함 또는 SIP 데모에서 걸려 오는 전화를 거부 할 수 같은 시나리오를 구현했습니다. 수락 및 거부의 두 가지 버튼으로 자신의 활동 (IncomingGui.java)을 만듭니다. BroadcastReciever 클래스에서 들어오는 호출 이벤트에서 활동 (IncomingGui.java)을 호출하십시오.

 WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context; 
     incomingCall = wtActivity.manager.takeAudioCall(intent, listener); 
     showIncomingCallGui(intent, context); 
     wtActivity.call = incomingCall; 

그런 다음
public void showIncomingCallGui(Intent intent,Context context) { 

     Intent incomingCall=new Intent(context,IncomingCallGui.class); 
     context.startActivity(incomingCall); 
    } 

public static void answerIncomingCall(){ 

    try { 
      incomingCall.answerCall(30); 
      incomingCall.startAudio(); 
      incomingCall.setSpeakerMode(true); 

       if (incomingCall.isMuted()) { 
       incomingCall.toggleMute(); 

      } 
    } 

    catch(Exception e){ 

     System.out.println(e.toString()); 
    } 

} 

public static void rejectIncomingCall(){ 

    try { 
      if (incomingCall !=null) { 

       incomingCall.endCall(); 
       incomingCall.close(); 
      } 

    } 
      catch(Exception e){ 

     System.out.println(e.toString()); 
    } 

그런 다음 IncomingGui.java에 "동의"하고 버튼을 "거부"뒤에 방법 다음과 같은 정의 BroadcastReciever 클래스에서 다음과 같은 방법을 정의합니다. 들어오는 호출을 받으면 전화를 수락하거나 거절하기 위해 자신의 들어오는 호출 활동을 갖게됩니다.

public void onCallAcceptButton(View view){ 
    IncomingCallReceiver.answerIncomingCall(); 
} 

    public void onCallRejectButton(View view){ 
    IncomingCallReceiver.rejectIncomingCall(); 
    this.finish(); 

} 
+0

정확히 내가 필요한 것! –

+0

양면에서 성공적으로 음성을 들었습니까? 제 경우에는 한쪽에서만 목소리가 들립니다. 어떤 괴롭히기 !!! –

+0

@JahangirKabir 예 2013 년 – Zain

관련 문제