0

I have tried to make a video call with quickblox but it doesn't work, I start the call but on the other device onReceiveNewSession doesn't call.

and this is my code:-

This activity to start the call:-

package com.example.group.travilling.travilling.chat;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import com.example.group.travilling.travilling.R;
import com.example.group.travilling.travilling.common.Common;
import com.quickblox.auth.QBAuth;
import com.quickblox.auth.session.QBSession;
import com.quickblox.chat.QBChatService;
import com.quickblox.chat.QBSignaling;
import com.quickblox.chat.QBWebRTCSignaling;
import com.quickblox.chat.listeners.QBVideoChatSignalingManagerListener;
import com.quickblox.core.QBEntityCallback;
import com.quickblox.core.exception.QBResponseException;
import com.quickblox.users.model.QBUser;
import com.quickblox.videochat.webrtc.QBRTCClient;
import com.quickblox.videochat.webrtc.QBRTCSession;
import com.quickblox.videochat.webrtc.QBRTCTypes;
import com.quickblox.videochat.webrtc.callbacks.QBRTCClientSessionCallbacks;
import com.quickblox.videochat.webrtc.callbacks.QBRTCClientVideoTracksCallbacks;
import com.quickblox.videochat.webrtc.callbacks.QBRTCSessionConnectionCallbacks;
import com.quickblox.videochat.webrtc.exception.QBRTCException;
import com.quickblox.videochat.webrtc.view.QBRTCSurfaceView;
import com.quickblox.videochat.webrtc.view.QBRTCVideoTrack;

import org.webrtc.RendererCommon;
import org.webrtc.VideoRenderer;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.quickblox.videochat.webrtc.QBRTCTypes.QBConferenceType.QB_CONFERENCE_TYPE_VIDEO;

public class call_activity extends AppCompatActivity {
    SharedPreferences prefs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_audio_activity);
        prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());


        QBChatService.ConfigurationBuilder chatServiceConfigurationBuilder = new QBChatService.ConfigurationBuilder();
        chatServiceConfigurationBuilder.setSocketTimeout(180); //Sets chat socket's read timeout in seconds
        chatServiceConfigurationBuilder.setKeepAlive(true); //Sets connection socket's keepAlive option.
        QBChatService.setConfigurationBuilder(chatServiceConfigurationBuilder);


//        String login = "login";
//        String password = "password";

//        final QBUser user = new QBUser(login, password);
        final QBUser user = new QBUser("u" + prefs.getInt("account_phone_chat", 0) + "", Common.pass);

// CREATE SESSION WITH USER
// If you use create session with user data,
// then the user will be logged in automatically
        QBAuth.createSession().performAsync(new QBEntityCallback<QBSession>() {
            @Override
            public void onSuccess(final QBSession qbSession, Bundle bundle) {
                user.setId(Integer.parseInt(prefs.getString("user_id","0")));
                //                    qbUser.setPassword(BaseService.getBaseService().getToken());
                if (!QBChatService.getInstance().isLoggedIn()) {

                    QBChatService.getInstance().login(user, new QBEntityCallback() {
                        @Override
                        public void onSuccess(Object o, Bundle bundle) {
                            call();
                        }

                        @Override
                        public void onError(QBResponseException e) {
                            call();

                            Log.e("errorwhyis!", e.getMessage());
                        }
                    });
//                mDialog.dismiss();
                } else {
                    System.out.println("SFSSFFSFSFSDF");
                    call();

                }
            }


            @Override
            public void onError(QBResponseException e) {
                Log.e("error", e.getMessage() + "");
            }
        });

    }

    private void call() {


        //Add signalling manager
        add_signlling_manager();

        //Notify RTCClient that you are ready to receive calls
        QBRTCClient.getInstance(getBaseContext()).prepareToProcessCalls();

        //To listen for the callbacks use the following methods:

        QBRTCClient.getInstance(getBaseContext()).addSessionCallbacksListener(new QBRTCClientSessionCallbacks() {
            //            * Called each time when new session request is received.

            public void onReceiveNewSession(QBRTCSession session) {

                // obtain received user info
                Map<String, String> userInfo = session.getUserInfo();

                // .....
                // ..... your code
                // .....


                // Set userInfo
                // User can set any string key and value in user info
//                                Map<String,String> userInfo = new HashMap<String,String>();
//                                userInfo.put("Key", "Value");

                // Accept incoming call
                session.acceptCall(userInfo);

                // Rejecting call
//                                session.rejectCall(userInfo);


//                                session.hangUp(userInfo);

            }

            /**
             * Called in case when user didn't answer in timer expiration period
             */
            public void onUserNotAnswer(QBRTCSession session, Integer userID) {
                System.out.println("NOOOOOOAAAAAA");
            }

            /**
             * Called in case when opponent has rejected you call
             */
            public void onCallRejectByUser(QBRTCSession session, Integer userID, Map<String, String> userInfo) {
                System.out.println("NOOOOOOAAAAAA22");
            }

            /**
             * Called in case when opponent has accepted you call
             */
            public void onCallAcceptByUser(QBRTCSession session, Integer userID, Map<String, String> userInfo) {
                System.out.println("NOOOOOOAAAAAA233");


            }

            /**
             * Called in case when opponent hung up
             */
            @Override
            public void onReceiveHangUpFromUser(QBRTCSession qbrtcSession, Integer integer, Map<String, String> map) {

            }


            /**
             * Called in case when user didn't make any actions on received session
             */
            public void onUserNoActions(QBRTCSession session, Integer userID) {
                System.out.println("NOOOOOOAAAAAA555");
            }

            /**
             * Called in case when session will close
             */
            public void onSessionStartClose(QBRTCSession session) {
            }

            /**
             * Called when session is closed.
             */
            public void onSessionClosed(QBRTCSession session) {
            }

        });
//        QBRTCClient.getInstance(getBaseContext()).removeSessionsCallbacksListener(this);


        //Track connection state
        addSessionCallbacksListener(new QBRTCSessionConnectionCallbacks() {
            @Override
            public void onStartConnectToUser(QBRTCSession qbrtcSession, Integer integer) {
                System.out.println("NOOOOOOAAAAAA88");

            }

            @Override
            public void onConnectedToUser(QBRTCSession qbrtcSession, Integer integer) {
                System.out.println("NOOOOOOAAAAAA999");

            }

            @Override
            public void onConnectionClosedForUser(QBRTCSession qbrtcSession, Integer integer) {

            }

            @Override
            public void onDisconnectedFromUser(QBRTCSession qbrtcSession, Integer integer) {

            }

            @Override
            public void onDisconnectedTimeoutFromUser(QBRTCSession qbrtcSession, Integer integer) {

            }

            @Override
            public void onConnectionFailedWithUser(QBRTCSession qbrtcSession, Integer integer) {

            }

            @Override
            public void onError(QBRTCSession qbrtcSession, QBRTCException e) {

            }
        });


//Obtain video tracks via QBRTCClientVideoTracksCallbacks interface

        addVideoTrackCallbacksListener(new QBRTCClientVideoTracksCallbacks() {
            @Override
            public void onLocalVideoTrackReceive(QBRTCSession qbrtcSession, QBRTCVideoTrack qbrtcVideoTrack) {

            }

            @Override
            public void onRemoteVideoTrackReceive(QBRTCSession qbrtcSession, QBRTCVideoTrack qbrtcVideoTrack, Integer integer) {

            }
        });


        start_call();
    }

//Render video stream to view

    private void fillVideoView(int userId, QBRTCSurfaceView videoView, QBRTCVideoTrack videoTrack,
                               boolean remoteRenderer) {
        videoTrack.addRenderer(new VideoRenderer(videoView));
        updateVideoView(videoView, !remoteRenderer, RendererCommon.ScalingType.SCALE_ASPECT_FILL);
    }

    private void updateVideoView(QBRTCSurfaceView surfaceView, boolean mirror, RendererCommon.ScalingType scalingType) {
        surfaceView.setScalingType(scalingType);
        surfaceView.setMirror(mirror);
        surfaceView.requestLayout();
    }


    private void add_signlling_manager() {
        try {

            QBChatService.getInstance().getVideoChatWebRTCSignalingManager()
                    .addSignalingManagerListener(new QBVideoChatSignalingManagerListener() {
                        @Override
                        public void signalingCreated(QBSignaling qbSignaling, boolean createdLocally) {
                            if (!createdLocally) {
                                QBRTCClient.getInstance(getBaseContext()).addSignaling((QBWebRTCSignaling) qbSignaling);
                            }
                        }
                    });

        } catch (NullPointerException e) {
        }
    }

    //Prepare your activity class to audio/video calls
    public void addSessionCallbacksListener(QBRTCSessionConnectionCallbacks callback) {
    }

    public void addVideoTrackCallbacksListener(QBRTCClientVideoTracksCallbacks callback) {
    }

    //and next method on QBRTCClient instance:
    public void addSessionCallbacksListener(QBRTCClientSessionCallbacks callback) {
    }


    void start_call() {
        //start call
        QBRTCTypes.QBConferenceType qbConferenceType = QB_CONFERENCE_TYPE_VIDEO;

//Initiate opponents list
        List<Integer> opponents = new ArrayList<Integer>();
        opponents.add(Common.admin_id); //12345 - QBUser ID

//Set user information
// User can set any string key and value in user info
// Then retrieve this data from sessions which is returned in callbacks
// and parse them as he wish
        Map<String, String> userInfo = new HashMap<>();
        userInfo.put("Test", "state");

//Init session
        QBRTCSession session =
                QBRTCClient.getInstance(this).createNewSessionWithOpponents(opponents, qbConferenceType);

//Start call
        System.out.println("SSSSSSSSSSSTTTTTTTTTTTA");
        session.startCall(userInfo);
    }
}

And this service to receive the call >

package com.example.group.test_calender.traveling_admin.booking.chat;


import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;

import com.example.group.test_calender.traveling_admin.booking.common.Common;
import com.quickblox.auth.QBAuth;
import com.quickblox.auth.session.QBSession;
import com.quickblox.auth.session.QBSettings;
import com.quickblox.chat.QBChatService;
import com.quickblox.chat.QBSignaling;
import com.quickblox.chat.QBWebRTCSignaling;
import com.quickblox.chat.listeners.QBVideoChatSignalingManagerListener;
import com.quickblox.core.QBEntityCallback;
import com.quickblox.core.exception.QBResponseException;
import com.quickblox.users.model.QBUser;
import com.quickblox.videochat.webrtc.QBRTCClient;
import com.quickblox.videochat.webrtc.QBRTCSession;
import com.quickblox.videochat.webrtc.callbacks.QBRTCClientSessionCallbacks;

import java.util.Map;

//import static com.dev.trueme.TrueMeConstants.TRUE_ME_USERNEME;

public class VideoCallService extends Service implements QBRTCClientSessionCallbacks {

    public VideoCallService() {
    }

    @Override
    public IBinder onBind(Intent intent) {

        return null;
    }



    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        try {
            QBSettings.getInstance().init(getBaseContext(), Common.APP_ID, Common.AUTH_KEY, Common.AUTH_SECURITY);
            QBSettings.getInstance().setAccountKey(Common.ACCOUNT_KEY);
            QBChatService.setDebugEnabled(true);

            QBChatService.ConfigurationBuilder chatServiceConfigurationBuilder = new QBChatService.ConfigurationBuilder();
            chatServiceConfigurationBuilder.setSocketTimeout(180); //Sets chat socket's read timeout in seconds
            chatServiceConfigurationBuilder.setKeepAlive(true); //Sets connection socket's keepAlive option.
            QBChatService.setConfigurationBuilder(chatServiceConfigurationBuilder);

            Log.wtf("service", "start");
            LoginChatService();


        }catch (Exception e){
            Log.wtf("ex",""+e);
        }
        return START_STICKY;
    }


    private void InitSignalling() {

        QBChatService.getInstance().getVideoChatWebRTCSignalingManager()
                .addSignalingManagerListener(new QBVideoChatSignalingManagerListener() {
                    @Override
                    public void signalingCreated(QBSignaling qbSignaling, boolean createdLocally) {
                        if (!createdLocally) {
                            QBRTCClient.getInstance(VideoCallService.this).addSignaling((QBWebRTCSignaling) qbSignaling);
                        }
                    }
                });

    }
    public  void LoginChatService()
    {


        final QBUser user = new QBUser(Common.user, Common.pass);
//                    SharedPreferences s=getSharedPreferences("QBid",0);
        user.setId(30586775);

        QBAuth.createSession().performAsync(new QBEntityCallback<QBSession>() {
            @Override
            public void onSuccess(final QBSession qbSession, Bundle bundle) {
//                user.setId(qbSession.getUserId());
                //                    qbUser.setPassword(BaseService.getBaseService().getToken());
                if (!QBChatService.getInstance().isLoggedIn()) {

                    QBChatService.getInstance().login(user, new QBEntityCallback() {
                        @Override
                        public void onSuccess(Object o, Bundle bundle) {
                            ProcessCalls();
                            InitSignalling();
                            QBRTCClient.getInstance(getBaseContext()).addSessionCallbacksListener   (VideoCallService.this);
                        }

                        @Override
                        public void onError(QBResponseException e) {
                            Log.e("errorwhyis!", e.getMessage());
                            ProcessCalls();
                            InitSignalling();
                            QBRTCClient.getInstance(getBaseContext()).addSessionCallbacksListener(VideoCallService.this);

                        }
                    });
//                mDialog.dismiss();
                } else {
                    System.out.println("SFSSFFSFSFSDF");
                    ProcessCalls();
                    InitSignalling();
                    QBRTCClient.getInstance(getBaseContext()).addSessionCallbacksListener(VideoCallService.this);

                }
            }


            @Override
            public void onError(QBResponseException e) {
                Log.e("error", e.getMessage() + "");
            }
        });


    }

    private void ProcessCalls() {
        QBRTCClient.getInstance(this).prepareToProcessCalls();
    }


    @Override
    public void onReceiveNewSession(QBRTCSession qbrtcSession) {
        System.out.println("oiioikjskdkj");
//        DataHolder.getInstance().setServiceData(qbrtcSession,qbrtcSession.getUserInfo());
        startActivity(new Intent(this,VideoCallActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).putExtra("service",true));
    }

    @Override
    public void onUserNoActions(QBRTCSession qbrtcSession, Integer integer) {

    }

    @Override
    public void onSessionStartClose(QBRTCSession qbrtcSession) {

    }

    @Override
    public void onUserNotAnswer(QBRTCSession qbrtcSession, Integer integer) {

    }

    @Override
    public void onCallRejectByUser(QBRTCSession qbrtcSession, Integer integer, Map<String, String> map) {

    }

    @Override
    public void onCallAcceptByUser(QBRTCSession qbrtcSession, Integer integer, Map<String, String> map) {

    }

    @Override
    public void onReceiveHangUpFromUser(QBRTCSession qbrtcSession, Integer integer, Map<String, String> map) {

    }

    @Override
    public void onSessionClosed(QBRTCSession qbrtcSession) {

    }
}

Please If you have a solution or an example to do it help me.

Thank you.

Momen Zaqout
  • 1,508
  • 1
  • 16
  • 17
  • where are you start LoginChatService? Are you login different users on different devices? Provide your log from start app to call from both devices. Your code is hard for reading, please use Java Naming Conventions for names your methods and classes. – Valentyn Tereshchenko Aug 07 '17 at 07:56

1 Answers1

0

Make sure you have done below steps for establishing WebRTC peer to peer connection. Add native libraries - libjingle_peerconnection_so.so files. Put native library for each platform: arm64-v8a, armeabi-v7a, x86, x86_64 under app/src/main/jniLibs folder. You can find native files in sample under /src/main/jniLibs folder.

Check the DOC for screenshots.

Nir Patel
  • 357
  • 4
  • 17