562935844@qq.com
2022-06-28 a780f0b8d0ccec90d359c0c554f07d5afde9554c
HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/HDLLinphoneKit.java
@@ -2,10 +2,12 @@
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.TextureView;
import android.widget.Toast;
import com.hdl.hdllinphonesdk.activity.HDLLinphoneIntercomActivity;
import com.hdl.hdllinphonesdk.activity.HDLLinphoneReverseCallActivity;
import com.hdl.hdllinphonesdk.callback.OnHDLLinphoneCallListener;
import com.hdl.hdllinphonesdk.callback.OnLPOpenDoorCallBack;
import com.hdl.hdllinphonesdk.core.callback.PhoneCallback;
@@ -25,19 +27,44 @@
import org.linphone.core.ProxyConfig;
import org.linphone.core.TransportType;
import java.io.FileOutputStream;
import java.io.InputStream;
import static java.lang.Thread.sleep;
/**
 * Created by jlchen on 2021/8/4.
 */
public class HDLLinphoneKit {
    /**
     * 丰林可视对讲
     */
    public static final String INTER_PHONE_TYPE_FLVI = "FLVI";
    /**
     * 大华可视对讲
     */
    public static final String INTER_PHONE_TYPE_IMOUVISIAL = "IMOUVISIAL";
    /**
     * 萤石猫眼
     */
    public static final String INTER_PHONE_TYPE_EZVIZ = "EZVIZ";
    /**
     * HDL可视对讲
     */
    public static final String INTER_PHONE_TYPE_HDL = "HDL";
    /**
     * 全视通可视对讲
     */
    public static final String INTER_PHONE_TYPE_FREEVIEW = "FREEVIEW";
    public static final String KEY_TITLE_NAME = "lpTitleName";
    public static final String KEY_SIP_ACCOUNT = "lpSipAccount";
    public static final String HDLLinphoneKitNAME = "HDLLinphoneKit";
    private volatile static HDLLinphoneKit instance;
    private Context viewContext;
    private ServiceWaitThread mServiceWaitThread;
    private String mUsername, mPassword, mServerIP;
//    private TextureView mRenderingView, mPreviewView;
    //    private TextureView mRenderingView, mPreviewView;
    private boolean isAutoJumpCallView;//是否自动跳转呼叫页面
    private HDLLinphoneKit() {
@@ -46,6 +73,7 @@
    /**
     * getInstance
     *
     * @return HDLLinphoneKit
     */
    public static synchronized HDLLinphoneKit getInstance() {
@@ -65,16 +93,17 @@
     * @return Core
     */
    public Core getCore() {
        if(!HDLLinphoneService.isReady()){
        if (!HDLLinphoneService.isReady()) {
            CheckIfNeedstartService();
            return null;
        }else {
        } else {
            return HDLLinphoneService.getCore();
        }
    }
    /**
     * 初始化Linphone
     *
     * @param context
     */
    public void initLinphone(Context context) {
@@ -82,14 +111,13 @@
        if (!HDLLinphoneService.isReady()) {
            CheckIfNeedstartService();
        } else {
        }
    }
    /**
     * startService
     */
    private synchronized void CheckIfNeedstartService(){
    private synchronized void CheckIfNeedstartService() {
        startService(viewContext);
        addCallback(new RegistrationCallback() {
            @Override
@@ -97,7 +125,6 @@
                super.registrationOk();
                HDLLog.e(HDLLinphoneKitNAME, "registrationOk: ");
                callBackRegistrationOk(viewContext);
            }
            @Override
@@ -117,6 +144,7 @@
            @Override
            public void incomingCall(Call linphoneCall) {
                super.incomingCall(linphoneCall);
                Log.d("HDLLinphoneKit","------incomingCall------");
                if (linphoneCall != null) {
                    String callUsername = linphoneCall.getRemoteAddress().getUsername();
                    HDLLog.I("来电号码:" + callUsername);
@@ -135,21 +163,29 @@
            @Override
            public void outgoingInit() {
                super.outgoingInit();
<<<<<<< HEAD
                Log.d("HDLLinphoneKit","------outgoingInit------");
=======
>>>>>>> 1697a5c0a1d40e756738d1f99d496c6e33b3fd52
            }
            @Override
            public void callConnected() {
                super.callConnected();
                // 视频通话默认免提,语音通话默认非免提
                Log.d("HDLLinphoneKit","------callConnected------");
                toggleSpeaker(true);
            }
            @Override
            public void callEnd() {
                super.callEnd();
<<<<<<< HEAD
                Log.d("HDLLinphoneKit","------callEnd------");
//                context.sendBroadcast(new Intent(HDLLinphoneIntercomActivity.RECEIVE_FINISH_VIDEO_ACTIVITY));
=======
>>>>>>> 1697a5c0a1d40e756738d1f99d496c6e33b3fd52
            }
        });
    }
@@ -158,9 +194,13 @@
     * 跳转打开呼叫页面
     */
    public void gotoHDLLinphoneIntercomActivity() {
        Intent intent = new Intent(viewContext, HDLLinphoneIntercomActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        viewContext.startActivity(intent);
        try {
            Intent intent = new Intent(viewContext, HDLLinphoneIntercomActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            viewContext.startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
@@ -214,11 +254,11 @@
     * @param password 密码
     * @param serverIP sip 服务器
     */
    public void setAccountAndLogin(String username, String password, String serverIP) {
    public void setAccountAndLogin(String username, String password, String serverIP, String inter_type) {
        mUsername = username;
        mPassword = password;
        mServerIP = serverIP;
        login();
        login(inter_type);
    }
    /**
@@ -227,8 +267,7 @@
     * @param phoneCallback        通话回调
     * @param registrationCallback 注册状态回调
     */
    public void addCallback(RegistrationCallback registrationCallback,
                            PhoneCallback phoneCallback) {
    public void addCallback(RegistrationCallback registrationCallback, PhoneCallback phoneCallback) {
        if (HDLLinphoneService.isReady()) {
            HDLLinphoneService.addRegistrationCallback(registrationCallback);
            HDLLinphoneService.addPhoneCallback(phoneCallback);
@@ -241,19 +280,16 @@
    /**
     * 登录到 SIP 服务器
     */
    public void login() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (!HDLLinphoneService.isReady()) {
                    try {
                        sleep(80);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    public void login(String inter_type) {
        new Thread(() -> {
            while (!HDLLinphoneService.isReady()) {
                try {
                    sleep(80);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                loginToServer();
            }
            loginToServer(inter_type);
        }).start();
    }
@@ -282,7 +318,7 @@
    /**
     * 清除配置表, 切换账号时会用到
     */
    public void clearProxyConfig(){
    public void clearProxyConfig() {
        Core core = HDLLinphoneService.getCore();
        if (core != null) {
            core.setDefaultProxyConfig(null);
@@ -322,16 +358,23 @@
    /**
     * 登录 SIP 服务器
     */
    private void loginToServer() {
    private void loginToServer(String inter_type) {
        try {
            if (mUsername == null || mPassword == null || mServerIP == null) {
                throw new RuntimeException("The sip account is not configured.");
            }
            registerUserAuth(mUsername, mPassword, mServerIP);
            if (inter_type.equals(INTER_PHONE_TYPE_FREEVIEW)) {
                // 全视通可视对讲注册
                freeViewRegisterUserAuth(mUsername, mPassword, mServerIP);
            } else {
                // 其他可视对讲注册
                registerUserAuth(mUsername, mPassword, mServerIP);
            }
        } catch (CoreException e) {
            e.printStackTrace();
        }
    }
    /**
     * 提交账号和密码注册到服务器
     *
@@ -342,11 +385,9 @@
     */
    public void registerUserAuth(String name, String password, String host) throws CoreException {
        Core mLinphoneCore = HDLLinphoneService.getCore();
        if(mLinphoneCore == null) return;
        if (mLinphoneCore == null) return;
        AuthInfo authInfo = Factory.instance().createAuthInfo(name, null, password,
                null, null, host);
        AuthInfo authInfo = Factory.instance().createAuthInfo(name, null, password, null, null, host);
        AccountCreator mAccountCreator = mLinphoneCore.createAccountCreator(null);
        mAccountCreator.setUsername(name);
        mAccountCreator.setDomain(host);
@@ -364,15 +405,45 @@
    }
    /**
     * 呼叫
     * 提交账号和密码注册到全视通服务器
     *
     * @throws CoreException
     */
    public void freeViewRegisterUserAuth(String userName, String password, String domain) throws CoreException {
        Core mLinphoneCore = HDLLinphoneService.getCore();
        if (mLinphoneCore == null) return;
        AuthInfo authInfo = Factory.instance().createAuthInfo(userName, "", password, null, null, domain);
        AccountCreator mAccountCreator = mLinphoneCore.createAccountCreator(null);
        mAccountCreator.setUsername(userName);
        mAccountCreator.setDomain("yun");
        mAccountCreator.setPassword(password);
        mAccountCreator.setTransport(TransportType.Udp);
        ProxyConfig prxCfg = mAccountCreator.createProxyConfig();
        prxCfg.enableQualityReporting(false);
        prxCfg.setQualityReportingCollector(null);
        prxCfg.setQualityReportingInterval(0);
        prxCfg.enableRegister(true);
        prxCfg.setServerAddr("sip:139.159.157.75:46000;transport=udp");
        mLinphoneCore.addProxyConfig(prxCfg);//添加代理配置。如果启用了注册,这将开始在代理上注册。
        mLinphoneCore.addAuthInfo(authInfo);//添加认证信息到,该信息片段将在所有需要的SIP事务中使用身份验证
        mLinphoneCore.setDefaultProxyConfig(prxCfg);//设置默认代理。
    }
    /**
     * 呼叫,全视通可视对讲需要将 外出代理服务器打开,才能使用 空间号呼叫;
     * 暂时没找到怎么打开,所以需要手动加上proxy
     */
    public Call startSingleCallingTo(String userName, boolean isVideoCall) {
        Core mLinphoneCore = HDLLinphoneService.getCore();
        if(mLinphoneCore == null) return null;
        if (mLinphoneCore == null) return null;
        Call call = null;
        Core core = HDLLinphoneService.getCore();
        if(core != null) {
        if (core != null) {
            Address addressToCall = core.interpretUrl(userName);
            CallParams params = core.createCallParams(null);
@@ -387,6 +458,12 @@
            if (addressToCall != null) {
                call = core.inviteAddressWithParams(addressToCall, params);
                // 设置外放
                for (AudioDevice audioDevice : HDLLinphoneService.getCore().getAudioDevices()) {
                    if (audioDevice.getType() == AudioDevice.Type.Speaker) {
                        call.setOutputAudioDevice(audioDevice);
                    }
                }
            }
        }
        return call;
@@ -411,12 +488,15 @@
     */
    public void acceptCall() {
        try {
            if(HDLLinphoneService.getCore() == null) return;
            if (HDLLinphoneService.getCore() == null) return;
            Call currentCall = HDLLinphoneService.getCore().getCurrentCall();
            CallParams params = HDLLinphoneService.getCore().createCallParams(currentCall);
            params.enableVideo(true);
            params.enableLowBandwidth(false);
            params.setAudioBandwidthLimit(0); // disable limitation
            currentCall.acceptWithParams(params);
            Log.d("HDLLinphoneKit","---acceptCall= ");
        } catch (Exception e) {
            e.printStackTrace();
        }
@@ -427,7 +507,7 @@
     */
    public void acceptCallWithVideo(boolean enableVideo) {
        try {
            if(HDLLinphoneService.getCore() == null) return;
            if (HDLLinphoneService.getCore() == null) return;
            Call currentCall = HDLLinphoneService.getCore().getCurrentCall();
            CallParams params = HDLLinphoneService.getCore().createCallParams(currentCall);
            params.enableVideo(enableVideo);
@@ -443,7 +523,7 @@
     */
    public void hangUp() {
        Core mLinphoneCore = HDLLinphoneService.getCore();
        if(mLinphoneCore == null) return;
        if (mLinphoneCore == null) return;
        Call currentCall = mLinphoneCore.getCurrentCall();
        if (currentCall != null) {
//            mLinphoneCore.terminateCall(currentCall);
@@ -462,7 +542,7 @@
     */
    public void toggleMicro(boolean isMicMuted) {
        Core mLinphoneCore = HDLLinphoneService.getCore();
        if(mLinphoneCore == null) return;
        if (mLinphoneCore == null) return;
        mLinphoneCore.enableMic(!isMicMuted);
    }
@@ -479,23 +559,31 @@
     * 设置外放设备
     */
    private void routeAudioToSpeakerHelper(boolean speakerOn) {
        org.linphone.core.tools.Log.w("[Audio Manager] Routing audio to " + (speakerOn ? "speaker" : "earpiece"));
        Log.d("HDLLinphoneKit","设置外放设备[Audio Manager] Routing audio to " + (speakerOn ? "speaker" : "earpiece"));
        try {
            if(HDLLinphoneService.getCore() == null) return;
            if (HDLLinphoneService.getCore() == null) return;
            if (HDLLinphoneService.getCore().getCallsNb() == 0) return;
            Call currentCall = HDLLinphoneService.getCore().getCurrentCall();
            if (currentCall == null) currentCall = HDLLinphoneService.getCore().getCalls()[0];
            if (currentCall == null) return;
            for (AudioDevice audioDevice : HDLLinphoneService.getCore().getAudioDevices()) {
                Log.d("HDLLinphoneKit","audioDevice.getType()= " + audioDevice.getType());
            }
            for (AudioDevice audioDevice : HDLLinphoneService.getCore().getAudioDevices()) {
                Log.d("HDLLinphoneKit","设置外放设备speakerOn=" + speakerOn + " audioDevice.getType()=" + audioDevice.getType());
                if (speakerOn && audioDevice.getType() == AudioDevice.Type.Speaker) {
                    currentCall.setOutputAudioDevice(audioDevice);
                    Log.d("HDLLinphoneKit","AudioDevice.Type.Speaker");
                    return;
                } else if (!speakerOn && audioDevice.getType() == AudioDevice.Type.Earpiece) {
                    currentCall.setOutputAudioDevice(audioDevice);
                    return;
                }
            }
            currentCall.setSpeakerVolumeGain(1.0f);
            currentCall.setSpeakerMuted(speakerOn);
        } catch (Exception e) {
            e.printStackTrace();
        }
@@ -517,6 +605,7 @@
    /**
     * 设置播放View
     *
     * @param o
     */
    private void setVideoWindow(Object o) {
@@ -525,6 +614,7 @@
            linphoneCore.setNativeVideoWindowId(o);
        }
    }
    /**
     * 移除播放View
     */
@@ -537,6 +627,7 @@
    /**
     * 设置本机摄像头采集的View
     *
     * @param o
     */
    private void setPreviewWindow(Object o) {
@@ -545,6 +636,7 @@
            linphoneCore.setNativePreviewWindowId(o);
        }
    }
    /**
     * 移除视频采集View
     */
@@ -559,9 +651,9 @@
     * 获取当前通话状态
     */
    public Call.State getCallState() {
        if(HDLLinphoneService.getInstance() == null) {
        if (HDLLinphoneService.getInstance() == null) {
            return null;
        }else {
        } else {
            return HDLLinphoneService.getInstance().getCurrentCallState();
        }
    }
@@ -570,9 +662,9 @@
     * 获取当前通话状态是否为来电中
     */
    public boolean isIncomingReceivedCallState() {
        if(HDLLinphoneService.getInstance() == null || HDLLinphoneService.getInstance().getCurrentCallState() == null){
        if (HDLLinphoneService.getInstance() == null || HDLLinphoneService.getInstance().getCurrentCallState() == null) {
            return false;
        }else{
        } else {
            return (HDLLinphoneService.getInstance().getCurrentCallState() == Call.State.IncomingReceived);
        }
    }
@@ -586,6 +678,7 @@
    /**
     * 设置是否自动跳转呼叫页面标志
     *
     * @param autoJumpCallView
     */
    public void setAutoJumpCallView(boolean autoJumpCallView) {
@@ -630,6 +723,7 @@
    /**
     * 获取onHDLLinphoneCallListener
     * 接听、挂断、开锁等 Listener实现
     *
     * @return OnHDLLinphoneCallListener
     */
    public OnHDLLinphoneCallListener getOnHDLLinphoneCallListener() {
@@ -638,6 +732,7 @@
    /**
     * 设置onHDLLinphoneCallListener
     *
     * @param onHDLLinphoneCallListener
     */
    public void setOnHDLLinphoneCallListener(OnHDLLinphoneCallListener onHDLLinphoneCallListener) {