4

我在 webview 中实现了 web rtc。只要应用程序在前台,一切正常。

现在,如果应用程序处于后台/剂量模式。我想显示一个响铃屏幕,例如 what's app。当有人打电话时,我收到推送通知。

我知道我可以通过呼叫声音和通知的 onClick 显示通知警报。我可以显示我的应用活动。

是否存在这样的呼叫 网址

是否可以在不通知的情况下处理

或者我可以将我的应用注册为调用应用。这样每当发生呼叫时,我都会注册ConnectionService

并收到onCreateIncomingConnection

4

1 回答 1

0

是的你可以。我使用 janus 网关,我的代码部分是相应的,

  1. 接收firebase消息。

         if(!remoteMessage.getData().containsKey("hangup")){
             print(remoteMessage.getData());
             try {
                 Application.shared.pushMessage = new JSONObject(remoteMessage.getData().toString());
                 Application.shared.sipClient = new SipPluginHandler(null,true);
                 Application.shared.action = "incoming";
             } catch (JSONException e) {
                 e.printStackTrace();
             }
    
         }else{
             Application.shared.action = "hangup";
           //  Application.shared.voipPlugin.endCall(Application.shared.uuid);
           Application.shared.voipPlugin = null;
         }
    

SipPluginHanler 是我的应用程序连接 websocket 然后初始化 webrtc 并执行发送接收 jsep 操作的地方。

  1. 在初始化处理程序并建立 websocket 连接后处理 firebase 消息。

公共无效声明成功(){

    JSONObject msg = new JSONObject();
    JSONObject result = new JSONObject();

    if (fromConnectionService){

        if(Application.shared.action == "incoming"){
            JSONObject message = Application.shared.pushMessage;

            if (message != null){
                putData(result,"event","incomingcall");

                try {
                    String caller =  message.getString("caller_id");
                    putData(result,"username", "sip:" + caller + "@" + connectionInfo.ulakCagriIp);
                    putData(result,"displayname", caller);
                    putData(msg,"janus","event");


                    JSONObject dtdt = new JSONObject();
                    JSONObject dt = new JSONObject();

                    putData(dtdt,"result",result);

                    putData(dt,"data",dtdt);

                   putData(msg,"plugindata",dt);


                    JSONObject extra = message.getJSONObject("extra");

                    if (extra != null){
                        JSONObject jsep = extra.getJSONObject("jsep");
                        putData(msg,"jsep", jsep);

                        JanusMessage mesg = JanusMessage.fromJson(msg);
                       onEvent(mesg);


                    }




                } catch (JSONException e) {
                    e.printStackTrace();
                }



            }





        }else{

            putData(result,"event", "hangup");
            putData(msg,"janus", "event");
            JSONObject dtdt = new JSONObject();
            JSONObject dt = new JSONObject();

            putData(dtdt,"result",result);

            putData(dt,"data",dtdt);

            putData(msg,"plugindata",dt);

            JanusMessage mesg = JanusMessage.fromJson(msg);
            onEvent(mesg);


        }

    }
}
  1. 在事件中,有开关盒检查事件是否来自 janus 网关。

     switch (eventType) {
                case accepted:
                updateUI(eventType);
                    onAccepted();
                    break;
                case calling:
                break;
                case declining:
                break;
                case declined:
                   onHangup();
                    onDeclined();
                    updateUI(eventType);
                    break;
                case hangup:
                onHangup();
                updateUI(eventType);
    
                    if (result.code != 0 && (result.code == 486 || result.code == 503) ){
                        incallManager.stop("_DTMF_");
                    } else{ incallManager.stop();
                        //incallManagerPlugin.stopRingtone();
                    }
                break;
                case incall:
                break;
                case incomingcall:
    
                  onIncomingCall(result);
                   updateUI(eventType);
                    break;
                case proceeding:
                updateUI(eventType);
                    onPorceeding();
                    break;
                case progress:
                break;
                case registered:
                onRegistered(message);
    
                    break;
                case registering:
                break;
                case registration_failed:
                break;
                case ringing:
                break;
    
            }
    
  2. 最后 onIncoming 函数我检查处理程序类 fromConnection 是否为真,然后我调用 ConnectionService。

     private void onIncomingCall(JanusMessage.JanusResult result) 
        {
             Application.shared.text = result.displayname.replace("\"","");
    
      if(fromConnectionService){
         Application.shared.voipPlugin = new VoipPlugin();
    
         uuid = createTransactionID();
         Application.shared.uuid = uuid;
        Application.shared.voipPlugin.reportIncomingCall(uuid,Application.shared.text,Application.shared.text);
       }
    }
    

对于连接服务类,我刚刚修改了下面颤振插件的 android 部分。 https://github.com/BradenBagby/flutter_voip_kit/tree/master/android/src/main/kotlin/com/example/flutter_voip_kit

于 2021-08-10T07:53:24.457 回答