Звонок пользовательского устройства для видеозвонков с webRTC - PullRequest
0 голосов
/ 05 мая 2019

Я реализовал видеовызов в Android с помощью WebRTC.

Вызов будет сделан, если два пользователя придут в одну комнату по своему желанию.

Чего я хочу достичь сейчас, это кто-то сможетввести идентификатор пользователя и «Позвонить» ему и телефону другого абонента (так что с реализацией webRTC проблем нет, я просто хочу реализовать поведение звонка).

Что я делал до сих пор, используя Firebase Realtimeбаза данных, это то, что я определил ветку под названием «звонки», состоящую из дочерних имен с именем комнаты по комбинации двух идентификаторов пользователя.(поэтому, если user1 вызывает user2, имя комнаты будет user1user2).

enter image description here

Если user1 вызывает user2, он устанавливает reqId в 1, а затемкак пользователь2 слушает любые изменения.он понимает, что user1 звонит ему (и я показываю экран входящего вызова), а затем он отвечает, установив reqId в 2, этот разговор продолжается до тех пор, пока user2 не примет или не отменит звонок.

Я ищулучшее решение для достижения этой цели, потому что это не кажется таким хорошим методом и имеет много проблем.

1 Ответ

0 голосов
/ 06 мая 2019

я нашел решение.как будто у кого-то есть тот же вопрос.для каждого пользователя я создал ветвь под названием «вызов», которая отвечает за входящие звонки.

enter image description here

и эти две функции я реализовал для выполненияили прослушивание вызова:

performCall функция:

private DatabaseReference mDatabase;
private static int count = 0;

private void performCall(String s) {
    if(count>0)return;

    mDatabase = FirebaseDatabase.getInstance().getReference().child("users/"+"USERIDTOCALL"+"/call");
    mDatabase.child("roomName").setValue(s);
    mDatabase.child("answer").setValue("none");

    mDatabase.child("answer").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            switch (Objects.requireNonNull(dataSnapshot.getValue()).toString()){
                case "none":
                    break;
                case "yes":
                    t.cancel();
                    t.purge();
                    count =0;
                    //The Call Should Begin...
                    break;
                case "no":
                    t.cancel();
                    t.purge();
                    count =0;
                    //RejectedCall
                    break;
            }
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
    //Declare the timer
    t = new Timer();
    count =0;
    //Set the schedule function and rate
    t.scheduleAtFixedRate(new TimerTask() {

                              @Override
                              public void run() {
                                  mDatabase.child("signal").setValue(new Random().nextInt());
                                  count++;
                                  if(count >= 20){
                                      t.cancel();
                                      t.purge();
                                      count =0;
                                  }
                              }

                          }, 0, 2000);

}

и listenForCalls функция:

private int count =-1;
private boolean isCalling = false;
Runnable runnable = null;
private boolean callingScreenShowed;
AlertDialog alertDialog;

private void listenForCalls() {
    mDatabase = FirebaseDatabase.getInstance().getReference().child("users/"+GlobalVars.userName+"/call");

    mDatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            String answer = dataSnapshot.child("answer").getValue().toString();
            if(answer == "yes" ||  answer =="no") return;

            count++;
            if(count >= 1){
                isCalling = true;
            }
            if(count == 1 ){
                callingScreenShowed= false;
                //every 5 seconds check if signaling is active
                final int interval = 5000; 
                Handler handler = new Handler();
                runnable = () -> {
                    if(isCalling){
                        if(!callingScreenShowed){
                            //Show A dialog for calling
                            AlertDialog.Builder dialog = new AlertDialog.Builder(context);
                            dialog.setMessage("user with id" + dataSnapshot.child("roomName").getValue() + " Is Calling");
                            dialog.setTitle("Incomming Call");
                            dialog.setPositiveButton("YES",
                                    (dialog1, which) -> {
                                        mDatabase.child("answer").setValue("yes");
                                        callingScreenShowed =false;
                                        isCalling = false;
                                        count = -1;
                                        handler.removeCallbacks(runnable);
                                        //Start VideoCall
                            }
                            );
                            dialog.setNegativeButton("cancel", (dialog12, which) -> {
                                mDatabase.child("answer").setValue("no");
                                callingScreenShowed =false;
                                isCalling = false;
                                count = -1;
                                handler.removeCallbacks(runnable);
                                //Clling Rejected

                            });
                            alertDialog=dialog.create();
                            alertDialog.show();

                            callingScreenShowed = true;
                        }

                    }
                    else {
                    if(callingScreenShowed){
                        alertDialog.hide();
                    }
                    Log.e("Called","Call Request Ended");
                    count = -1;
                    handler.removeCallbacks(runnable);
                    return;
                    //Hide Calling Screen
                    }

                    isCalling = false;
                    handler.postDelayed(runnable, interval);

                };
                runnable.run();
            }


        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...