Как запустить клиент Agora, используя уведомление pu sh, чтобы начать видеовызов между двумя пользователями? - PullRequest
0 голосов
/ 25 апреля 2020

FCM с реализацией агоры

У меня есть часть агоры, но я должен реализовать консоль Firebase. Я настроил см. Ранее я использовал sinch для вызова между двумя приложениями, но теперь хочу перейти на вызов с agoro, но с той же концепцией. При этом мы отправляли токен на сервер и в соответствии с этим синхрольным использованием для обработки вызова.

public class MainActivity extends AppCompatActivity {
    private static final int PERMISSION_REQ_ID = 22;
    private static final String[] REQUESTED_PERMISSIONS = {
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.CAMERA,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };
    private static final String TAG="Agora ";

    private RtcEngine mRtcEmgine;
    private FrameLayout mLocalContainer;
    private RelativeLayout mRemoteContainer;
    private SurfaceView mLocalView;
    private SurfaceView mremoteView;
    private ImageView mCallBtn;
    private ImageView mMuteBtn;
    private ImageView mSwitchCameraBtn;
    private boolean mCallEnd;
    private boolean mMuted;
    private final IRtcEngineEventHandler mRtcHandler= new IRtcEngineEventHandler() {
        @Override
        public void onJoinChannelSuccess(String channel,final int uid, int elapsed) {
            super.onJoinChannelSuccess(channel, uid, elapsed);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Log.e("agora","Join channel success, uid "+(uid &0xFFFFFFFFL));
                }
            });
        }

        @Override
        public void onUserOffline(final int uid, int reason) {
            super.onUserOffline(uid, reason);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Log.e("agora","User Offline, uid "+(uid &0xFFFFFFFFL));
                    removeRemoteVideo();
                }
            });
        }

        @Override
        public void onRemoteVideoStateChanged(final int uid, int state, int reason, int elapsed) {
            super.onRemoteVideoStateChanged(uid, state, reason, elapsed);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Log.e("agora","First reomte video decoded, uid "+(uid &0xFFFFFFFFL));
                    setupRemoteVideo(uid);
                }
            });
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //initUI();
        mLocalContainer=findViewById(R.id.local_video_view_container);
        mRemoteContainer=findViewById(R.id.remote_video_view_container);
        mCallBtn=findViewById(R.id.btn_call);
        mCallBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mCallEnd){
                    startCall();
                    mCallEnd=false;
                    mCallBtn.setImageResource(R.drawable.btn_endcall);
                } 
                else {
                    endCall();
                    mCallEnd=true;
                    mCallBtn.setImageResource(R.drawable.btn_startcall);
                }
                showButton(!mCallEnd);
            }
        });
        mMuteBtn=findViewById(R.id.btn_mute);
        mMuteBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mMuted = !mMuted;
                mRtcEmgine.muteLocalAudioStream(mMuted);
                int res = mMuted ? R.drawable.btn_mute : R.drawable.btn_unmute;
                mMuteBtn.setImageResource(res);
            }
        });
        mSwitchCameraBtn=findViewById(R.id.btn_switch_camera);
        mSwitchCameraBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mRtcEmgine.switchCamera();
            }
        });

        if (checkSelfpermission(REQUESTED_PERMISSIONS[0]) &&
                checkSelfpermission(REQUESTED_PERMISSIONS[1]) &&
                checkSelfpermission(REQUESTED_PERMISSIONS[2]))
        {
            Log.e(TAG,"     true  ");
            initEngineAndJoinChannel();
        }
        else {
            Log.e(TAG,"     false  ");
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == PERMISSION_REQ_ID) {
            if (grantResults[0] != PackageManager.PERMISSION_GRANTED ||
                grantResults[1] != PackageManager.PERMISSION_GRANTED ||
                grantResults[2] != PackageManager.PERMISSION_GRANTED) {
                Log.e(TAG,"Need permissions " + Manifest.permission.RECORD_AUDIO +
                    "/" + Manifest.permission.CAMERA + "/" + Manifest.permission.WRITE_EXTERNAL_STORAGE);
                finish();
                return;
            }
            initEngineAndJoinChannel();
        }
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        if (!mCallEnd){
            leaveChannel();
        }
        RtcEngine.destroy();
    }

    private void initUI() {
        Log.e(TAG,"     UI  ");
        mLocalContainer=findViewById(R.id.local_video_view_container);
        mRemoteContainer=findViewById(R.id.remote_video_view_container);

        mCallBtn=findViewById(R.id.btn_call);
        mMuteBtn=findViewById(R.id.btn_mute);
        mSwitchCameraBtn=findViewById(R.id.btn_switch_camera);
    }

    private void initEngineAndJoinChannel() {
        initializeEngine();
        setupVideoConfig();
        setupLocalVideo();
        joinChannel();
    }

    private void setupVideoConfig() {
        Log.e(TAG,"running 2");
        mRtcEmgine.enableVideo();

        mRtcEmgine.setVideoEncoderConfiguration(new VideoEncoderConfiguration(
                VideoEncoderConfiguration.VD_640x360,
                VideoEncoderConfiguration.FRAME_RATE.FRAME_RATE_FPS_15,
                VideoEncoderConfiguration.STANDARD_BITRATE,
                VideoEncoderConfiguration.ORIENTATION_MODE.ORIENTATION_MODE_FIXED_PORTRAIT
                ));
    }

    private void setupLocalVideo() {
        Log.e(TAG,"running 3");
        mRtcEmgine.enableVideo();
        mLocalView=RtcEngine.CreateRendererView(getBaseContext());
        mLocalView.setZOrderMediaOverlay(true);
        mLocalContainer.addView(mLocalView);

        VideoCanvas localVideoCanvas = new VideoCanvas(mLocalView, VideoCanvas.RENDER_MODE_HIDDEN,0);
        mRtcEmgine.setupLocalVideo(localVideoCanvas);
    }

    private void setupRemoteVideo(int uid) {
        int count = mRemoteContainer.getChildCount();
        View view = null;
        for(int i = 0; i < count; i++) {
            View v= mRemoteContainer.getChildAt(i);
            if (v.getTag() instanceof Integer && ((int)v.getTag()) == uid) {
                view = v;
            }
        }
        if (view != null) {
            return;
        }
        mremoteView = RtcEngine.CreateRendererView(getBaseContext());
        mRemoteContainer.addView(mremoteView);
        mRtcEmgine.setupRemoteVideo(new VideoCanvas(mremoteView, VideoCanvas.RENDER_MODE_HIDDEN, uid));
        mremoteView.setTag(uid);
    }

    private void initializeEngine() {
        Log.e(TAG,"running 1");
        try {
            mRtcEmgine=RtcEngine.create(getBaseContext(),getString(R.string.agora_app_id),mRtcHandler);
        } 
        catch (Exception e) {
            Log.e(TAG,Log.getStackTraceString(e));
            throw new RuntimeException("NEED TO check rtc sdk fatal error \n"+Log.getStackTraceString(e));
        }
    }

    private  void removeRemoteVideo() {
        if (mremoteView != null) {
            mRemoteContainer.removeView(mremoteView);
        }
        mremoteView = null;
    }

    private void joinChannel() {
        Log.e(TAG,"running 4");
        String token = getString(R.string.agora_access_token);
        if (TextUtils.isEmpty(token)) {
            token = null;
        }
        mRtcEmgine.joinChannel(token,"demochannel", "", 0);
    }

    private void leaveChannel() {
        mRtcEmgine.leaveChannel();
    }

 /*   public void onLocalAudioMuteClicked(View view) {
        mMuted = !mMuted;
        mRtcEmgine.muteLocalAudioStream(mMuted);
        int res = mMuted ? R.drawable.btn_mute : R.drawable.btn_unmute;
        mMuteBtn.setImageResource(res);
    }*/

 /*   public void onSwitchClicked(View view) {
        mRtcEmgine.switchCamera();
    }*/

   /* public  void onCallClicked(View view) {
        if (mCallEnd){
            startCall();
            mCallEnd = false;
            mCallBtn.setImageResource(R.drawable.btn_endcall);
        }
        else {
            endCall();
            mCallEnd = true;
            mCallBtn.setImageResource(R.drawable.btn_startcall);
        }
        showButton(!mCallEnd);
    }*/

    private void startCall() {
        setupLocalVideo();
        joinChannel();
    }

    private void endCall() {
        removeLocalVideo();
        removeRemoteVideo();
        leaveChannel();
    }

    private void removeLocalVideo() {
        if (mLocalView != null) {
            mLocalContainer.removeView(mLocalView);
        }
        mLocalView = null;
    }

    private  void showButton(boolean show) {
        int visibilty = show ? View.VISIBLE : View.GONE;
        mMuteBtn.setVisibility(visibilty);
        mSwitchCameraBtn.setVisibility(visibilty);
    }

    private Boolean checkSelfpermission(String permission) {
        if (ContextCompat.checkSelfPermission(this,permission) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, REQUESTED_PERMISSIONS, MainActivity.PERMISSION_REQ_ID);
                return false;
            }
        return true;
    }
}
...