【问题标题】:No ringing event on incoming calls来电无振铃事件
【发布时间】:2012-02-06 11:18:08
【问题描述】:

我不知道哪里出了问题。 监听器没有捕捉到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(结束通话后),但我没有收到onRinging 事件。 可能是什么问题? 谢谢

编辑: 我改变了这一切。 我像这样(粗体)将新的意图过滤器放入接收器:

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

我改变了 BroadcastReceiver 继承类这样(粗体):

@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);**
...

现在我只有空闲状态,但仍然没有响铃。

【问题讨论】:

  • 没有人帮忙吗?有人知道我的代码哪里错了吗?

标签: android listener broadcastreceiver sip


【解决方案1】:

SipAudioCall类的源代码有错误。

要解决此问题:

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

【讨论】:

  • 你有这方面的参考吗?
  • 我已经编辑了你的答案并将setListenercallbackImmediately参数设置为true,这样可以确保调用监听器方法。
【解决方案2】:

我在 sip 演示中实现了相同的场景来接受或拒绝来电。 使用两个按钮 Accept 和 Reject 创建您自己的 Activity (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 中定义“Accept”和“Reject”按钮后面的方法。 现在,在来电时,您将拥有自己的来电活动来接听或拒绝来电。

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

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

}

【讨论】:

  • 正是我需要的!
  • 双方都成功发声了吗?就我而言,我只在一侧获得声音。任何建议!!!
  • @JahangirKabir 2013 年是的
  • 可以和你讨论一下吗? Skype : jahangirkobir 或 > FB/jahanbabu
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多