2012-02-06 71 views
5

我不知道问题出在哪里。 听众不记得onRinging事件(所以我可以决定是否接受或拒绝来电)。 清单中是这样的:来电时没有振铃事件

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

在主要活动onCreate是这样的:

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类是这样的:

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(I结束后电话),但我没有收到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 2012-02-07 09:37:07

回答

5

SipAudioCall类的源代码存在错误。

要解决此问题:

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

你有参考吗? – tristan2468 2013-07-16 15:21:01

+0

我编辑了你的答案,并将'setListener'的'callbackImmediately'参数设置为true,这确保了监听器方法被调用。 – 2013-07-24 12:19:22

+0

这是一个很好的解决方法! – vinitius 2017-09-01 19:40:01

4

我已经实现了相同的情况,以接受或拒绝SIP演示来电。 使用两个按钮Accept和Reject创建您自己的活动(IncomingGui.java)。 在BroadcastReciever类中调用您的Activity(IncomingGui.java)来电事件。

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

然后定义BroadcastReciever类以下方法

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定义跟在后面的 “接受” 和 “拒绝” 按钮的方法。 现在在来电时,您将有自己的来电活动来接受或拒绝来电。

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

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

} 
+0

正是我需要的! – 2014-03-26 06:41:26

+0

你有没有在双方都成功获得声音? 在我的情况下,我只能听到一方的声音。任何建议! – 2017-09-26 14:03:14

+0

@JahangirKabir在2013年是 – Zain 2017-10-09 17:54:37

相关问题