firebase 通过webRTC向用户设备振铃以进行视频通话

f2uvfpb9  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(176)

我在Android中使用WebRTC实现了视频通话。
如果两个用户来到同一个房间,将进行呼叫。
我现在想实现的是,有人能够输入用户ID并“呼叫”他和其他用户的电话铃声(因此webRTC实现没有问题,我只想实现振铃行为)。
到目前为止,我使用Firebase的Realtime数据库所做的是定义了一个名为'calls'的分支,由两个用户ID组合命名的查尔兹项组成(因此,如果用户1调用用户2,房间名称将是用户1user2)。

如果用户1呼叫用户2,它将reqId设置为1,然后当用户2听到任何变化时,他知道用户1正在呼叫他(我显示传入呼叫屏幕),然后它通过将reqId设置为2来响应,此对话将继续,直到用户2接受或取消呼叫。
我正在寻找一个更好的解决方案来实现这一点,因为它似乎不是一个很好的方法,并有许多问题。

vc9ivgsu

vc9ivgsu1#

我找到了解决办法。好像任何人都有同样的问题。为每个用户,我创建了一个分支称为'呼叫',这是负责来电。

这两个函数是我实现来执行或监听呼叫的:

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("Incoming 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) {

        }
    });
}

相关问题