NimUICallInit.java 6.32 KB
Newer Older
万齐军 committed
1 2 3 4 5 6
package com.yidianling.im.helper;

import android.annotation.SuppressLint;
import android.content.Context;
import android.text.TextUtils;

万齐军 committed
7
import com.netease.lava.nertc.sdk.NERtcEx;
万齐军 committed
8
import com.netease.lava.nertc.sdk.NERtcOption;
万齐军 committed
9 10
import com.netease.lava.nertc.sdk.video.NERtcEncodeConfig;
import com.netease.lava.nertc.sdk.video.NERtcVideoConfig;
万齐军 committed
11 12 13 14 15
import com.netease.nimlib.sdk.RequestCallback;
import com.netease.yunxin.nertc.nertcvideocall.bean.InvitedInfo;
import com.netease.yunxin.nertc.ui.CallKitNotificationConfig;
import com.netease.yunxin.nertc.ui.CallKitUI;
import com.netease.yunxin.nertc.ui.CallKitUIOptions;
万齐军 committed
16
import com.netease.yunxin.nertc.ui.extension.SelfConfigExtension;
万齐军 committed
17 18 19 20 21
import com.netease.yunxin.nertc.ui.service.DefaultIncomingCallEx;
import com.ydl.ydlcommon.modular.ModularServiceManagerKt;
import com.ydl.ydlcommon.utils.log.XLog;
import com.yidianling.im.R;
import com.yidianling.im.config.NimApplication;
22
import com.yidianling.im.config.NimSDKOptionConfig;
万齐军 committed
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
import com.yidianling.im.http.ImHttpImpl;
import com.yidianling.user.api.bean.UserResponseBean;
import com.yidianling.user.api.service.IUserService;

import org.jetbrains.annotations.NotNull;

import java.util.HashMap;
import java.util.Map;

import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;


public class NimUICallInit {

    private static boolean hasReportSupportLine = false;
    private static String curChannelName;

    public static void initNim2(Context context) {
        UserResponseBean.UserInfo userInfo = ModularServiceManagerKt.findRouteService(IUserService.class).getUserInfo();
        if (userInfo == null) return;
        String userId = userInfo.getUid();
        android.util.Log.e("qwert", userId);
        String appKey = NimApplication.getInstance().getAppKey();
        CallKitUIOptions options = new CallKitUIOptions.Builder()
                // 必要:音视频通话 sdk appKey,用于通话中使用
                .rtcAppKey(appKey)
50
                .logRootPath(NimSDKOptionConfig.getAppCacheDir(context) + "/yidianling")
万齐军 committed
51 52 53 54 55
                // 必要:当前用户 AccId
                .currentUserAccId(userId)
                .currentUserRtcUId(Long.parseLong(userId))
                // 通话接听成功的超时时间单位 毫秒,默认30s
                .timeOutMillisecond(30 * 1000L)
万齐军 committed
56 57 58 59 60 61 62 63 64 65 66
                .rtcCallExtension(new SelfConfigExtension(){
                    @Override
                    public void configVideoConfig() {
                        NERtcVideoConfig videoConfig = new NERtcVideoConfig();
                        videoConfig.frameRate = NERtcEncodeConfig.NERtcVideoFrameRate.FRAME_RATE_FPS_15;
                        videoConfig.bitrate = 600;
                        videoConfig.width = 640;
                        videoConfig.height = 480;
                        NERtcEx.getInstance().setLocalVideoConfig(videoConfig);
                    }
                })
万齐军 committed
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
                // 此处为 收到来电时展示的 notification 相关配置,如图标,提示语等。
                .notificationConfigFetcher(invitedInfo -> new CallKitNotificationConfig(R.drawable.avchat_imcoming_call))
                // 收到被叫时若 app 在后台,在恢复到前台时是否自动唤起被叫页面,默认为 true
                .resumeBGInvitation(true)
                .incomingCallEx(new DefaultIncomingCallEx() {
                    @Override
                    public boolean onIncomingCall(@NotNull InvitedInfo invitedInfo) {
                        XLog.INSTANCE.i("incomingCallEx", invitedInfo.toString());
                        curChannelName = invitedInfo.channelName;
                        return super.onIncomingCall(invitedInfo);
                    }
                })
                .enableOrder(false)
//                .p2pAudioActivity(TestActivity.class)
//                .p2pVideoActivity(TestActivity.class)
                // 请求 rtc token 服务,若非安全模式则不需设置
                .rtcTokenService((uid, callback) -> requestRtcToken(uid, callback)) // 自己实现的 token 请求方法
                // 设置初始化 rtc sdk 相关配置,按照所需进行配置
                .rtcSdkOption(new NERtcOption())
                // 呼叫组件初始化 rtc 范围,true-全局初始化,false-每次通话进行初始化以及销毁
                // 全局初始化有助于更快进入首帧页面,当结合其他组件使用时存在rtc初始化冲突可设置false
                .rtcInitScope(true)
                .build();
// 若重复初始化会销毁之前的初始化实例,重新初始化
        CallKitUI.init(context.getApplicationContext(), options);
    }

    @SuppressLint("CheckResult")
    private static void requestRtcToken(long uid, RequestCallback<String> callback) {
        Map<String, String> body = new HashMap<>();
        if (curChannelName != null) {
            body.put("channelName", curChannelName);
        }
        body.put("uid", String.valueOf(uid));
        ImHttpImpl.Companion.getInstance().getImApi().nim2Token(body)
                .subscribeOn(Schedulers.io())
                .observeOn(Schedulers.io())
                .subscribe(resp -> {
                    curChannelName = null;
                    if (resp.code == 200) {
                        callback.onSuccess(resp.data);
                    } else {
                        XLog.INSTANCE.i("requestRtcToken", resp.msg);
                        callback.onFailed(resp.code);
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        curChannelName = null;
                        callback.onException(throwable);
                    }
                });
    }

    @SuppressLint("CheckResult")
    public static void reportSupportLine() {
        if (hasReportSupportLine) return;
        Map<String, Object> report = new HashMap<>();
        report.put("callKeys", new String[]{"netease_app2"});//支持云信2.0呼叫通话
        ImHttpImpl.Companion.getInstance().getImApi()
                .reportSupportLine(report)
                .subscribeOn(Schedulers.io())
                .subscribe(resp -> {
                    if (TextUtils.equals(resp.code, "200")) {
                        hasReportSupportLine = true;
                    }
                });
    }
}