From c7f797851aadaeab49a83ce285b6c3fff2971517 Mon Sep 17 00:00:00 2001
From: JLChen <551775569@qq.com>
Date: 星期五, 20 八月 2021 11:03:43 +0800
Subject: [PATCH] 2021-08-20 1.优化更新

---
 HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/utils/HDLImageUtils.java                  |    6 
 HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/AndroidManifest.xml                                                   |    1 
 Shared.Droid.HDLLinphone/Shared.Droid.HDLLinphone/Properties/AssemblyInfo.cs                                        |    4 
 Shared.Droid.HDLLinphone/Shared.Droid.HDLLinphone/Jars/HDLLinphoneSDK-V1.0.1.aar                                    |    0 
 HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/callback/OnHDLLinphoneCallListener.java   |    5 
 HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/service/HDLLinphoneService.java      |  183 +++++++++--
 HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/activity/HDLLinphoneMonitorActivity.java  |    8 
 /dev/null                                                                                                           |   44 --
 HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/activity/HDLLinphoneIntercomActivity.java |    5 
 HDLLinphoneSDKDemoNew/app/src/main/res/layout/activity_main.xml                                                     |   10 
 HDLLinphoneSDKDemoNew/app/src/main/java/com/example/hdllinphonesdkdemo/MainActivity.java                            |  104 ++++--
 HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/linphone/KeepAliveHandler.java       |    4 
 HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/utils/HDLLog.java                         |   42 ++
 HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/HDLLinphoneKit.java                       |  461 ++++++++++++++++++++----------
 HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/callback/PhoneCallback.java          |    2 
 HDLLinphoneSDKDemoNew/app/libs/HDLLinphoneSDK-V1.0.1.aar                                                            |    0 
 HDLLinphoneSDKDemoNew/app/src/main/java/com/example/hdllinphonesdkdemo/HDLUtils.java                                |    2 
 HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/callback/RegistrationCallback.java   |    2 
 18 files changed, 580 insertions(+), 303 deletions(-)

diff --git a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/libs/liblinphone-android-sdk.aar b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/libs/liblinphone-android-sdk.aar
deleted file mode 100644
index 97bf338..0000000
--- a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/libs/liblinphone-android-sdk.aar
+++ /dev/null
Binary files differ
diff --git a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/AndroidManifest.xml b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/AndroidManifest.xml
index fa531e0..701ff46 100644
--- a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/AndroidManifest.xml
+++ b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/AndroidManifest.xml
@@ -13,6 +13,7 @@
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 
+    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
     <uses-feature
         android:name="android.hardware.camera"
         android:required="false" />
diff --git a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/HDLLinphoneKit.java b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/HDLLinphoneKit.java
index c6d339b..ce44248 100644
--- a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/HDLLinphoneKit.java
+++ b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/HDLLinphoneKit.java
@@ -2,8 +2,6 @@
 
 import android.content.Context;
 import android.content.Intent;
-import android.util.Log;
-import android.view.SurfaceView;
 import android.view.TextureView;
 import android.widget.Toast;
 
@@ -12,17 +10,20 @@
 import com.hdl.hdllinphonesdk.callback.OnLPOpenDoorCallBack;
 import com.hdl.hdllinphonesdk.core.callback.PhoneCallback;
 import com.hdl.hdllinphonesdk.core.callback.RegistrationCallback;
-import com.hdl.hdllinphonesdk.core.linphone.LinphoneUtils;
 import com.hdl.hdllinphonesdk.core.service.HDLLinphoneService;
 import com.hdl.hdllinphonesdk.utils.HDLLog;
 
+import org.linphone.core.AccountCreator;
 import org.linphone.core.Address;
+import org.linphone.core.AudioDevice;
+import org.linphone.core.AuthInfo;
 import org.linphone.core.Call;
 import org.linphone.core.CallParams;
-import org.linphone.core.CallStats;
 import org.linphone.core.Core;
 import org.linphone.core.CoreException;
+import org.linphone.core.Factory;
 import org.linphone.core.ProxyConfig;
+import org.linphone.core.TransportType;
 
 import static java.lang.Thread.sleep;
 
@@ -31,20 +32,22 @@
  */
 public class HDLLinphoneKit {
     public static final String KEY_TITLE_NAME = "lpTitleName";
-
     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() {
+
     }
 
+    /**
+     * getInstance
+     * @return HDLLinphoneKit
+     */
     public static synchronized HDLLinphoneKit getInstance() {
         if (instance == null) {
             synchronized (HDLLinphoneKit.class) {
@@ -57,33 +60,53 @@
     }
 
     /**
+     * 鑾峰彇 LinphoneCore
+     *
+     * @return Core
+     */
+    public Core getCore() {
+        if(!HDLLinphoneService.isReady()){
+            CheckIfNeedstartService();
+            return null;
+        }else {
+            return HDLLinphoneService.getCore();
+        }
+    }
+
+    /**
      * 鍒濆鍖朙inphone
+     * @param context
      */
     public void initLinphone(Context context) {
         viewContext = context.getApplicationContext();
         if (!HDLLinphoneService.isReady()) {
-            startService(context);
-            addCallback(new RegistrationCallback() {
-                @Override
-                public void registrationOk() {
-                    super.registrationOk();
-                    Log.e(HDLLinphoneKitNAME, "registrationOk: ");
-                    callBackRegistrationOk(viewContext);
-
-                }
-
-                @Override
-                public void registrationFailed() {
-                    super.registrationFailed();
-                    Log.e(HDLLinphoneKitNAME, "registrationFailed: ");
-//                    Toast.makeText(LoginActivity.this, "鐧诲綍澶辫触锛�", Toast.LENGTH_SHORT).show();
-                }
-            }, null);
-
+            CheckIfNeedstartService();
         } else {
 
         }
+    }
 
+    /**
+     * startService
+     */
+    private synchronized void CheckIfNeedstartService(){
+        startService(viewContext);
+        addCallback(new RegistrationCallback() {
+            @Override
+            public void registrationOk() {
+                super.registrationOk();
+                HDLLog.e(HDLLinphoneKitNAME, "registrationOk: ");
+                callBackRegistrationOk(viewContext);
+
+            }
+
+            @Override
+            public void registrationFailed() {
+                super.registrationFailed();
+                HDLLog.e(HDLLinphoneKitNAME, "registrationFailed: ");
+//                    Toast.makeText(LoginActivity.this, "鐧诲綍澶辫触锛�", Toast.LENGTH_SHORT).show();
+            }
+        }, null);
     }
 
     /**
@@ -94,9 +117,15 @@
             @Override
             public void incomingCall(Call linphoneCall) {
                 super.incomingCall(linphoneCall);
+                if (linphoneCall != null) {
+                    String callUsername = linphoneCall.getRemoteAddress().getUsername();
+                    HDLLog.I("鏉ョ數鍙风爜锛�" + callUsername);
+//                    HDLLog.Log("鏉ョ數鍙风爜DisplayName锛�" + linphoneCall.getRemoteAddress().getDisplayName());
+                    if (mOnHDLLinphoneCallListener != null) {
+                        mOnHDLLinphoneCallListener.onIncomingCall(callUsername);
+                    }
+                }
 
-                String callUsername = linphoneCall.getRemoteAddress().getUsername();
-                HDLLog.E("鏉ョ數鍙风爜锛�" + callUsername);
                 if (isAutoJumpCallView) {
                     //鏄惁闇�瑕佽嚜鍔ㄦ墦寮�鍛煎彨椤甸潰
                     gotoHDLLinphoneIntercomActivity();
@@ -137,38 +166,48 @@
     }
 
     /**
-     * showToast
-     */
-    private void showToast(String text) {
-        Toast.makeText(viewContext, text, Toast.LENGTH_SHORT).show();
-    }
-
-
-    /**
      * 寮�鍚湇鍔�
      *
      * @param context 涓婁笅鏂�
      */
     public void startService(Context context) {
-        if (!HDLLinphoneService.isReady()) {
-            Intent intent = new Intent(Intent.ACTION_MAIN);
-            intent.setClass(context, HDLLinphoneService.class);
-            context.startService(intent);
+        try {
+            if (!HDLLinphoneService.isReady()) {
+                Intent intent = new Intent(Intent.ACTION_MAIN);
+                intent.setClass(context, HDLLinphoneService.class);
+                context.startService(intent);
+//                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+//                    context.startForegroundService(intent);//瑙e喅android8.0浠ヤ笂鏃犳硶鍚姩鏈嶅姟鐨勯棶棰�
+//                } else {
+//                    context.startService(intent);
+//                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
         }
     }
 
-//    /**
-//     * 璁剧疆 sip 璐︽埛淇℃伅
-//     *
-//     * @param username sip 璐︽埛
-//     * @param password 瀵嗙爜
-//     * @param serverIP sip 鏈嶅姟鍣�
-//     */
-//    public void setAccount(String username, String password, String serverIP) {
-//        mUsername = username;
-//        mPassword = password;
-//        mServerIP = serverIP;
-//    }
+    /**
+     * onResume
+     */
+    public void onResume() {
+
+    }
+
+    /**
+     * onPause
+     */
+    public void onPause() {
+
+    }
+
+    /**
+     * onDestroy
+     */
+    public void onDestroy() {
+        removePreviewWindow();
+        removeVideoWindow();
+    }
 
     /**
      * 璁剧疆 sip 璐︽埛淇℃伅
@@ -222,6 +261,7 @@
 
     /**
      * 閫�鍑烘竻绌鸿处鍙�
+     * enableRegister false
      */
     public void logout() {
         try {
@@ -235,63 +275,29 @@
                         config.done();
                     }
                 }
-                core.clearAllAuthInfo();
-                core.clearProxyConfig();
+                core.clearAllAuthInfo();//娓呴櫎鎵�鏈夎璇佷俊鎭��
+
+//                core.clearProxyConfig();//浠庨厤缃腑鍒犻櫎鎵�鏈変唬鐞嗐�傛敞鎰忥細鐩墠涓嶈兘鐩存帴鍒犳墍鏈変唬鐞嗭紝鍥犱负鏈嶅姟鍣ㄤ笂杩樻槸鏍囪宸叉敞鍐�
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
-
     /**
-     * 鍛煎彨鎸囧畾鍙风爜
-     *
-     * @param num 鍛煎彨鍙风爜
+     * 娓呴櫎閰嶇疆琛�, 鍒囨崲璐﹀彿鏃朵細鐢ㄥ埌
      */
-    public void callTo(String num, boolean isVideoCall) {
-        LinphoneUtils.getInstance().callTo(num, isVideoCall);
+    public void clearProxyConfig(){
+        Core core = HDLLinphoneService.getCore();
+        if (core != null) {
+            core.clearAllAuthInfo();//娓呴櫎鎵�鏈夎璇佷俊鎭��
+            core.clearProxyConfig();//浠庨厤缃腑鍒犻櫎鎵�鏈変唬鐞嗐��
+        }
     }
 
     /**
-     * 鎺ュ惉鏉ョ數
+     * ServiceWaitThread
      */
-    public void acceptCall() {
-        LinphoneUtils.getInstance().acceptCall();
-    }
-
-//    /**
-//     * 鎺ュ惉鏉ョ數
-//     */
-//    public void acceptCallWithVideo(boolean enableVideo) {
-//        LinphoneUtils.getInstance().acceptCallWithVideo(enableVideo);
-//    }
-
-    /**
-     * 鎸傛柇褰撳墠閫氳瘽
-     */
-    public void hangUp() {
-        LinphoneUtils.getInstance().hangUp();
-    }
-
-    /**
-     * 鍒囨崲闈欓煶
-     *
-     * @param isMicMuted 鏄惁闈欓煶
-     */
-    public void toggleMicro(boolean isMicMuted) {
-        LinphoneUtils.getInstance().toggleMicro(isMicMuted);
-    }
-
-    /**
-     * 鍒囨崲鍏嶆彁
-     *
-     * @param isSpeakerEnabled 鏄惁鍏嶆彁
-     */
-    public void toggleSpeaker(boolean isSpeakerEnabled) {
-        LinphoneUtils.getInstance().toggleSpeaker(isSpeakerEnabled);
-    }
-
     private class ServiceWaitThread extends Thread {
         private PhoneCallback mPhoneCallback;
         private RegistrationCallback mRegistrationCallback;
@@ -325,83 +331,203 @@
             if (mUsername == null || mPassword == null || mServerIP == null) {
                 throw new RuntimeException("The sip account is not configured.");
             }
-            LinphoneUtils.getInstance().registerUserAuth(mUsername, mPassword, mServerIP);
+            registerUserAuth(mUsername, mPassword, mServerIP);
         } catch (CoreException e) {
             e.printStackTrace();
         }
     }
+    /**
+     * 鎻愪氦璐﹀彿鍜屽瘑鐮佹敞鍐屽埌鏈嶅姟鍣�
+     *
+     * @param name
+     * @param password
+     * @param host
+     * @throws CoreException
+     */
+    public void registerUserAuth(String name, String password, String host) throws CoreException {
+        Core mLinphoneCore = HDLLinphoneService.getCore();
+        if(mLinphoneCore == null) return;
 
-//    public static boolean getVideoEnabled() {
-//        CallParams remoteParams = HDLLinphoneService.getCore().getCurrentCall().getRemoteParams();
-//        return remoteParams != null && remoteParams.videoEnabled();
-//    }
+        AuthInfo authInfo = Factory.instance().createAuthInfo(name, null, password,
+                null, null, host);
+
+        AccountCreator mAccountCreator = mLinphoneCore.createAccountCreator(null);
+        mAccountCreator.setUsername(name);
+        mAccountCreator.setDomain(host);
+        mAccountCreator.setPassword(password);
+        mAccountCreator.setTransport(TransportType.Udp);
+        ProxyConfig prxCfg = mAccountCreator.createProxyConfig();
+
+        prxCfg.enableQualityReporting(false);
+        prxCfg.setQualityReportingCollector(null);
+        prxCfg.setQualityReportingInterval(0);
+        prxCfg.enableRegister(true);
+        mLinphoneCore.addProxyConfig(prxCfg);//娣诲姞浠g悊閰嶇疆銆傚鏋滃惎鐢ㄤ簡娉ㄥ唽锛岃繖灏嗗紑濮嬪湪浠g悊涓婃敞鍐屻��
+        mLinphoneCore.addAuthInfo(authInfo);//娣诲姞璁よ瘉淇℃伅鍒�,璇ヤ俊鎭墖娈靛皢鍦ㄦ墍鏈夐渶瑕佺殑SIP浜嬪姟涓娇鐢ㄨ韩浠介獙璇�
+        mLinphoneCore.setDefaultProxyConfig(prxCfg);//璁剧疆榛樿浠g悊銆�
+    }
 
     /**
-     * 璁剧疆 SurfaceView
+     * 鍛煎彨
+     */
+    public Call startSingleCallingTo(String userName, boolean isVideoCall) {
+        Core mLinphoneCore = HDLLinphoneService.getCore();
+        if(mLinphoneCore == null) return null;
+
+        Call call = null;
+        Core core = HDLLinphoneService.getCore();
+        if(core != null) {
+            Address addressToCall = core.interpretUrl(userName);
+            CallParams params = core.createCallParams(null);
+
+            if (isVideoCall) {
+                params.enableVideo(true);
+                params.enableLowBandwidth(false);
+            } else {
+                params.enableVideo(false);
+            }
+
+            if (addressToCall != null) {
+                call = core.inviteAddressWithParams(addressToCall, params);
+            }
+        }
+        return call;
+    }
+
+    /**
+     * 鍛煎彨鎸囧畾鍙风爜
+     *
+     * @param num 鍛煎彨鍙风爜
+     */
+    public void callTo(String num, boolean isVideoCall) {
+        if (!HDLLinphoneService.isReady() || !HDLLinphoneService.getCoreIsNotNull()) {
+            return;
+        }
+        if (!num.equals("")) {
+            startSingleCallingTo(num, isVideoCall);
+        }
+    }
+
+    /**
+     * 鎺ュ惉鏉ョ數
+     */
+    public void acceptCall() {
+        try {
+            if(HDLLinphoneService.getCore() == null) return;
+            Call currentCall = HDLLinphoneService.getCore().getCurrentCall();
+            CallParams params = HDLLinphoneService.getCore().createCallParams(currentCall);
+            params.enableVideo(true);
+            currentCall.acceptWithParams(params);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 鎺ュ惉鏉ョ數
+     */
+    public void acceptCallWithVideo(boolean enableVideo) {
+        try {
+            if(HDLLinphoneService.getCore() == null) return;
+            Call currentCall = HDLLinphoneService.getCore().getCurrentCall();
+            CallParams params = HDLLinphoneService.getCore().createCallParams(currentCall);
+            params.enableVideo(enableVideo);
+            currentCall.acceptWithParams(params);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 鎸傛柇鐢佃瘽
+     */
+    public void hangUp() {
+        Core mLinphoneCore = HDLLinphoneService.getCore();
+        if(mLinphoneCore == null) return;
+        Call currentCall = mLinphoneCore.getCurrentCall();
+        if (currentCall != null) {
+//            mLinphoneCore.terminateCall(currentCall);
+            mLinphoneCore.terminateAllCalls();
+        } else if (mLinphoneCore.isInConference()) {
+            mLinphoneCore.terminateConference();
+        } else {
+            mLinphoneCore.terminateAllCalls();
+        }
+    }
+
+    /**
+     * 鏄惁闈欓煶
+     *
+     * @param isMicMuted
+     */
+    public void toggleMicro(boolean isMicMuted) {
+        Core mLinphoneCore = HDLLinphoneService.getCore();
+        if(mLinphoneCore == null) return;
+        mLinphoneCore.enableMic(!isMicMuted);
+    }
+
+    /**
+     * 鏄惁澶栨斁
+     *
+     * @param isSpeakerEnabled
+     */
+    public void toggleSpeaker(boolean isSpeakerEnabled) {
+        routeAudioToSpeakerHelper(isSpeakerEnabled);
+    }
+
+    /**
+     * 璁剧疆澶栨斁璁惧
+     */
+    private void routeAudioToSpeakerHelper(boolean speakerOn) {
+        org.linphone.core.tools.Log.w("[Audio Manager] Routing audio to " + (speakerOn ? "speaker" : "earpiece"));
+        try {
+            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()) {
+                if (speakerOn && audioDevice.getType() == AudioDevice.Type.Speaker) {
+                    currentCall.setOutputAudioDevice(audioDevice);
+                    return;
+                } else if (!speakerOn && audioDevice.getType() == AudioDevice.Type.Earpiece) {
+                    currentCall.setOutputAudioDevice(audioDevice);
+                    return;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 璁剧疆 TextureView
      *
      * @param renderingView 杩滅▼ TextureView
      * @param previewView   鏈湴 TextureView
      */
     public void setAndroidVideoWindow(final TextureView renderingView, final TextureView previewView) {
-        mRenderingView = renderingView;
-        mPreviewView = previewView;
+//        mRenderingView = renderingView;
+//        mPreviewView = previewView;
         setVideoWindow(renderingView);
         setPreviewWindow(previewView);
 
     }
 
     /**
-     * onResume
+     * 璁剧疆鎾斁View
+     * @param o
      */
-    public void onResume() {
-//        if (mRenderingView != null) {
-//            ((TextureView) mRenderingView).onResume();
-//        }
-
-//        if (mAndroidVideoWindow != null) {
-//            synchronized (mAndroidVideoWindow) {
-//                LinphoneManager.getLc().setNativeVideoWindowId(mAndroidVideoWindow);
-//            }
-//        }
-    }
-
-    /**
-     * onPause
-     */
-    public void onPause() {
-//        if (mAndroidVideoWindow != null) {
-//            synchronized (mAndroidVideoWindow) {
-//                LinphoneManager.getLc().setNativeVideoWindowId(null);
-//            }
-//        }
-//
-//        if (mRenderingView != null) {
-//            ((GLSurfaceView) mRenderingView).onPause();
-//        }
-    }
-
-    /**
-     * onDestroy
-     */
-    public void onDestroy() {
-        mPreviewView = null;
-        mRenderingView = null;
-
-    }
-
-//    private void fixZOrder(SurfaceView rendering, SurfaceView preview) {
-//        rendering.setZOrderOnTop(false);
-//        preview.setZOrderOnTop(true);
-//        preview.setZOrderMediaOverlay(true); // Needed to be able to display control layout over
-//    }
-
     private void setVideoWindow(Object o) {
         Core linphoneCore = HDLLinphoneService.getCore();
         if (linphoneCore != null) {
             linphoneCore.setNativeVideoWindowId(o);
         }
     }
-
+    /**
+     * 绉婚櫎鎾斁View
+     */
     private void removeVideoWindow() {
         Core linphoneCore = HDLLinphoneService.getCore();
         if (linphoneCore != null) {
@@ -409,28 +535,25 @@
         }
     }
 
+    /**
+     * 璁剧疆鏈満鎽勫儚澶撮噰闆嗙殑View
+     * @param o
+     */
     private void setPreviewWindow(Object o) {
         Core linphoneCore = HDLLinphoneService.getCore();
         if (linphoneCore != null) {
             linphoneCore.setNativePreviewWindowId(o);
         }
     }
-
+    /**
+     * 绉婚櫎瑙嗛閲囬泦View
+     */
     private void removePreviewWindow() {
         Core linphoneCore = HDLLinphoneService.getCore();
         if (linphoneCore != null) {
             linphoneCore.setNativePreviewWindowId(null);
         }
     }
-
-//    /**
-//     * 鑾峰彇 LinphoneCore
-//     *
-//     * @return LinphoneCore
-//     */
-//    public Core getLC() {
-//        return HDLLinphoneService.getCore();
-//    }
 
     /**
      * 鑾峰彇褰撳墠閫氳瘽鐘舵��
@@ -452,6 +575,11 @@
     public boolean isAutoJumpCallView() {
         return isAutoJumpCallView;
     }
+
+    /**
+     * 璁剧疆鏄惁鑷姩璺宠浆鍛煎彨椤甸潰鏍囧織
+     * @param autoJumpCallView
+     */
     public void setAutoJumpCallView(boolean autoJumpCallView) {
         isAutoJumpCallView = autoJumpCallView;
     }
@@ -491,12 +619,27 @@
      */
     private OnHDLLinphoneCallListener mOnHDLLinphoneCallListener;
 
+    /**
+     * 鑾峰彇onHDLLinphoneCallListener
+     * 鎺ュ惉銆佹寕鏂�佸紑閿佺瓑 Listener瀹炵幇
+     * @return OnHDLLinphoneCallListener
+     */
     public OnHDLLinphoneCallListener getOnHDLLinphoneCallListener() {
         return mOnHDLLinphoneCallListener;
     }
 
+    /**
+     * 璁剧疆onHDLLinphoneCallListener
+     * @param onHDLLinphoneCallListener
+     */
     public void setOnHDLLinphoneCallListener(OnHDLLinphoneCallListener onHDLLinphoneCallListener) {
         mOnHDLLinphoneCallListener = onHDLLinphoneCallListener;
     }
 
+    /**
+     * showToast
+     */
+    private void showToast(String text) {
+        Toast.makeText(viewContext, text, Toast.LENGTH_SHORT).show();
+    }
 }
diff --git a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/activity/HDLLinphoneIntercomActivity.java b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/activity/HDLLinphoneIntercomActivity.java
index a174b8b..fc949ce 100644
--- a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/activity/HDLLinphoneIntercomActivity.java
+++ b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/activity/HDLLinphoneIntercomActivity.java
@@ -26,6 +26,7 @@
 import com.hdl.hdllinphonesdk.callback.OnLPOpenDoorCallBack;
 import com.hdl.hdllinphonesdk.R;
 import com.hdl.hdllinphonesdk.utils.HDLImageUtils;
+import com.hdl.hdllinphonesdk.utils.HDLLog;
 
 /**
  * Linphone鎺ュ惉椤甸潰
@@ -97,7 +98,7 @@
         }
         HDLLinphoneKit.getInstance().onDestroy();
 
-        Log.i(TAG,"onDestroy");
+        HDLLog.i(TAG,"onDestroy");
 
     }
 
@@ -263,7 +264,7 @@
             if (isAnswer) {
                 //濡傛灉涔嬪墠宸茬粡鎺ュ惉浜嗭紝鍥炶皟鏄寕鏂�
                 callTime = getTimerCallTime();
-                Log.i("callTime","callTime"+callTime);
+                HDLLog.i("callTime","callTime"+callTime);
                 HDLLinphoneKit.getInstance().getOnHDLLinphoneCallListener().onHangUpAction(callTime);
             } else {
                 //濡傛灉涔嬪墠娌℃帴鍚簡锛屽洖璋冩槸鎷掓帴
diff --git a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/activity/HDLLinphoneMonitorActivity.java b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/activity/HDLLinphoneMonitorActivity.java
index cefa1be..a5c8cb3 100644
--- a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/activity/HDLLinphoneMonitorActivity.java
+++ b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/activity/HDLLinphoneMonitorActivity.java
@@ -25,6 +25,7 @@
 import com.hdl.hdllinphonesdk.R;
 import com.hdl.hdllinphonesdk.callback.OnLPOpenDoorCallBack;
 import com.hdl.hdllinphonesdk.utils.HDLImageUtils;
+import com.hdl.hdllinphonesdk.utils.HDLLog;
 
 /**
 *鐩戣椤甸潰
@@ -83,7 +84,7 @@
         }
         HDLLinphoneKit.getInstance().onDestroy();
 
-        Log.i(TAG,"onDestroy");
+        HDLLog.i(TAG,"onDestroy");
 
     }
 
@@ -293,14 +294,15 @@
         HDLLinphoneKit.getInstance().setAndroidVideoWindow(video_lp_rendering, video_lp_rendering2);
     }
 
-
+    /**
+     * 椤甸潰鍏抽棴骞挎挱鐩戝惉
+     */
     public class FinishVideoActivityReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
             HDLLinphoneMonitorActivity.this.finish();
         }
     }
-
     private HDLLinphoneMonitorActivity.FinishVideoActivityReceiver mReceiver;
     public static final String RECEIVE_FINISH_VIDEO_ACTIVITY = "receive_finish_video_activity";
 
diff --git a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/callback/OnHDLLinphoneCallListener.java b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/callback/OnHDLLinphoneCallListener.java
index 584d059..10ca1db 100644
--- a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/callback/OnHDLLinphoneCallListener.java
+++ b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/callback/OnHDLLinphoneCallListener.java
@@ -27,6 +27,9 @@
      */
     void onScreenshotSuccessfulAction(Bitmap image);
 
-
+    /**
+     * 鏉ョ數涓�
+     */
+    void onIncomingCall(String username);
 
 }
diff --git a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/callback/PhoneCallback.java b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/callback/PhoneCallback.java
index fa60b94..62fe585 100644
--- a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/callback/PhoneCallback.java
+++ b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/callback/PhoneCallback.java
@@ -3,7 +3,7 @@
 import org.linphone.core.Call;
 
 /**
- * 鐘舵�佸洖璋�
+ * 閫氳瘽鐘舵�佸洖璋�
  */
 
 public abstract class PhoneCallback {
diff --git a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/callback/RegistrationCallback.java b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/callback/RegistrationCallback.java
index ca1cfb8..714fbb7 100644
--- a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/callback/RegistrationCallback.java
+++ b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/callback/RegistrationCallback.java
@@ -1,7 +1,7 @@
 package com.hdl.hdllinphonesdk.core.callback;
 
 /**
- * RegistrationCallback
+ * 娉ㄥ唽鐘舵�佸洖璋�
  */
 
 public abstract class RegistrationCallback {
diff --git a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/linphone/KeepAliveHandler.java b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/linphone/KeepAliveHandler.java
index 90f243f..c62cb31 100644
--- a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/linphone/KeepAliveHandler.java
+++ b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/linphone/KeepAliveHandler.java
@@ -6,7 +6,7 @@
 import android.util.Log;
 
 import com.hdl.hdllinphonesdk.core.service.HDLLinphoneService;
-
+import com.hdl.hdllinphonesdk.utils.HDLLog;
 
 /**
  * KeepAliveHandler
@@ -22,7 +22,7 @@
             try {
                 Thread.sleep(2000);
             } catch (InterruptedException e) {
-                Log.e(TAG, "Cannot sleep for 2s");
+                HDLLog.e(TAG, "Cannot sleep for 2s");
             }
         }
     }
diff --git a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/linphone/LinphoneManager.java b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/linphone/LinphoneManager.java
deleted file mode 100644
index a12c316..0000000
--- a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/linphone/LinphoneManager.java
+++ /dev/null
@@ -1,593 +0,0 @@
-//package com.hdl.hdllinphonesdk.core.linphone;
-//
-//import android.content.Context;
-//import android.content.pm.PackageManager;
-//import android.os.Handler;
-//import android.os.Looper;
-//
-//
-//import com.hdl.hdllinphonesdk.HDLLinphoneKit;
-//import com.hdl.hdllinphonesdk.R;
-//
-//
-//import org.linphone.core.AudioDevice;
-//import org.linphone.core.AuthInfo;
-//import org.linphone.core.AuthMethod;
-//import org.linphone.core.Call;
-//import org.linphone.core.CallLog;
-//import org.linphone.core.CallStats;
-//import org.linphone.core.ChatMessage;
-//import org.linphone.core.ChatRoom;
-//import org.linphone.core.Conference;
-//import org.linphone.core.ConfiguringState;
-//import org.linphone.core.Content;
-//import org.linphone.core.Core;
-//import org.linphone.core.CoreException;
-//import org.linphone.core.CoreListener;
-//import org.linphone.core.EcCalibratorStatus;
-//import org.linphone.core.Event;
-//import org.linphone.core.Factory;
-//import org.linphone.core.Friend;
-//import org.linphone.core.FriendList;
-//import org.linphone.core.GlobalState;
-//import org.linphone.core.InfoMessage;
-//import org.linphone.core.PayloadType;
-//import org.linphone.core.PresenceModel;
-//import org.linphone.core.ProxyConfig;
-//import org.linphone.core.PublishState;
-//import org.linphone.core.RegistrationState;
-//import org.linphone.core.SubscriptionState;
-//import org.linphone.core.ToneID;
-//import org.linphone.core.VersionUpdateCheckResult;
-//import org.linphone.core.VideoActivationPolicy;
-//import org.linphone.core.VideoDefinition;
-//import org.linphone.core.tools.Log;
-//
-//import java.io.File;
-//import java.io.IOException;
-//import java.nio.ByteBuffer;
-//import java.util.Timer;
-//import java.util.TimerTask;
-//
-//import static com.hdl.hdllinphonesdk.HDLLinphoneKit.HDLLinphoneKitNAME;
-//
-///**
-// * Linphone 绠$悊鍣�
-// */
-//
-//public class LinphoneManager implements CoreListener {
-//    private static final String TAG = "LinphoneManager";
-//    private static LinphoneManager instance;
-//    private Context mServiceContext;
-//    private Core mLc;
-//    private Timer mTimer;
-//    private static boolean sExited;
-//
-//    private String mLPConfigXsd = null;
-//    private String mLinphoneFactoryConfigFile = null;
-//    public String mLinphoneConfigFile = null;
-//    private String mLinphoneRootCaFile = null;
-//    private String mRingSoundFile = null;
-//    private String mRingBackSoundFile = null;
-//    private String mPauseSoundFile = null;
-//    private String mChatDatabaseFile = null;
-//
-//
-////    private String mErrorToneFile = null;
-//
-//    public LinphoneManager(Context serviceContext) {
-//        mServiceContext = serviceContext;
-//        Factory.instance().setDebugMode(true, HDLLinphoneKitNAME);
-//        sExited = false;
-//
-//        String basePath = mServiceContext.getFilesDir().getAbsolutePath();
-//        mLPConfigXsd = basePath + "/lpconfig.xsd";
-//        mLinphoneFactoryConfigFile = basePath + "/linphonerc";
-//        mLinphoneConfigFile = basePath + "/.linphonerc";
-//        mLinphoneRootCaFile = basePath + "/rootca.pem";
-//        mRingSoundFile = basePath + "/oldphone_mono.wav";
-//        mRingBackSoundFile = basePath + "/ringback.wav";
-//        mPauseSoundFile = basePath + "/toy_mono.wav";
-//        mChatDatabaseFile = basePath + "/linphone-history.db";
-////        mErrorToneFile = basePath + "/error.wav";
-//    }
-//
-//    public synchronized static final LinphoneManager createAndStart(Context context) {
-//        if (instance != null) {
-//            throw new RuntimeException("Linphone Manager is already initialized");
-//        }
-//        instance = new LinphoneManager(context);
-//        instance.startLibLinphone(context);
-//        return instance;
-//    }
-//
-//    public static synchronized Core getLcIfManagerNotDestroyOrNull() {
-//        if (sExited || instance == null) {
-//            Log.e("Trying to get linphone core while LinphoneManager already destroyed or not created");
-//            return null;
-//        }
-//        return getLc();
-//    }
-//
-//    public static final boolean isInstanceiated() {
-//        return instance != null;
-//    }
-//
-//    public static synchronized final Core getLc() {
-//        return getInstance().mLc;
-//    }
-//
-//    public static synchronized final LinphoneManager getInstance() {
-//        if (instance != null) {
-//            return instance;
-//        }
-//        if (sExited) {
-//            throw new RuntimeException("Linphone Manager was already destroyed. "
-//                    + "Better use getLcIfManagerNotDestroyed and check returned value");
-//        }
-//        throw new RuntimeException("Linphone Manager should be created before accessed");
-//    }
-//
-//    private synchronized void startLibLinphone(Context context) {
-//        try {
-//            copyAssetsFromPackage();
-////            mLc = Factory.instance().createCore(this, mLinphoneConfigFile,
-////                    mLinphoneFactoryConfigFile, null, context);
-//            mLc = Factory.instance().createCore( mLinphoneConfigFile,
-//                    mLinphoneFactoryConfigFile,  context);
-//            mLc.addListener((CoreListener)context);
-//
-//            try {
-//                initLibLinphone();
-//            } catch (CoreException e) {
-//                Log.e(e);
-//            }
-//
-//            TimerTask task = new TimerTask() {
-//                @Override
-//                public void run() {
-//                    new Handler(Looper.getMainLooper()).post(new Runnable() {
-//                        @Override
-//                        public void run() {
-//                            if (mLc != null) {
-//                                mLc.iterate();
-//                            }
-//                        }
-//                    });
-//                }
-//            };
-//            mTimer = new Timer("Linphone Scheduler");
-//            mTimer.schedule(task, 0, 20);
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//            Log.e(TAG, "startLibLinphone: cannot start linphone");
-//        }
-//    }
-//
-//    private synchronized void initLibLinphone() throws CoreException {
-////        mLc.setContext(mServiceContext);
-//        setUserAgent();
-//        mLc.setRemoteRingbackTone(mRingSoundFile);
-//        mLc.setTone(ToneID.CallWaiting, mRingSoundFile);
-//        mLc.setRing(mRingSoundFile);
-////        mLc.setRootCA(mLinphoneRootCaFile);
-//        mLc.setPlayFile(mPauseSoundFile);
-////        mLc.setChatDatabasePath(mChatDatabaseFile);
-//        mLc.enableIpv6(true);
-//        mLc.enableDnsSrv(true);
-////        mLc.setCallErrorTone(Reason.NotFound, mErrorToneFile);//璁剧疆鍛煎彨閿欒鎾斁鐨勯搩澹�
-//
-//        setBackCamAsDefault();
-//
-//        int availableCores = Runtime.getRuntime().availableProcessors();
-//        Log.w(TAG, "MediaStreamer : " + availableCores + " cores detected and configured");
-////        mLc.setCpuCount(availableCores);
-//
-//        int migrationResult = getLc().migrateToMultiTransport();
-//        Log.d(TAG, "Migration to multi transport result = " + migrationResult);
-//
-//        mLc.setNetworkReachable(true);
-//
-//        //鍥炲0娑堥櫎
-////        boolean isEchoCancellation = (boolean) SPUtils.get(mServiceContext, "echo_cancellation", true);
-//        mLc.enableEchoCancellation(true);
-//        //鑷�傚簲鐮佺巼鎺у埗
-////        boolean isAdaptiveRateControl = (boolean) SPUtils.get(mServiceContext, "adaptive_rate_control", true);
-//        mLc.enableAdaptiveRateControl(true);
-//
-//        //audio 鐮佺巼璁剧疆
-//        LinphoneUtils.getConfig(mServiceContext).setInt("audio", "codec_bitrate_limit", 36);
-//
-////        mLc.setPreferredVideoSizeByName("qvga");
-//
-//        VideoDefinition preferredVideoDefinition =
-//                Factory.instance().createVideoDefinitionFromName("qvga");
-//        getLc().setPreferredVideoDefinition(preferredVideoDefinition);
-//
-//        mLc.setUploadBandwidth(1536);
-//        mLc.setDownloadBandwidth(1536);
-//        mLc.setVideoPreset("custom");
-//
-////        mLc.setVideoPolicy(mLc.getVideoAutoInitiatePolicy(), true);
-////        mLc.setVideoPolicy(true, mLc.getVideoAutoAcceptPolicy());
-////        mLc.enableVideo(true, true);
-////        mLc.enableDownloadOpenH264(true);
-//
-//        mLc.enableVideoCapture(true);
-//        mLc.enableVideoDisplay(true);
-//        mLc.getConfig().setBool("app", "open_h264_download_enabled", true);
-//        VideoActivationPolicy vap = getLc().getVideoActivationPolicy();
-//        vap.setAutomaticallyInitiate(true);
-//        mLc.setVideoActivationPolicy(vap);
-//
-//        // 璁剧疆缂栫爜鏍煎紡
-//        setCodecMime();
-//
-////        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
-////        filter.addAction(Intent.ACTION_SCREEN_OFF);
-////        mServiceContext.registerReceiver(mKeepAliveReceiver, filter);
-//    }
-//
-//    private void setCodecMime() {
-////        for (PayloadType payloadType : mLc.getAudioCodecs()) {
-////            try {
-////                mLc.enablePayloadType(payloadType, true);
-////            } catch (CoreException e) {
-////                e.printStackTrace();
-////            }
-//////            android.util.Log.e(TAG, "setCodecMime = " + payloadType.getMime() + " Rate " + payloadType.getRate() + " receviceFmtp " + payloadType.getRecvFmtp());
-//////            if (payloadType.getMime().equals("PCMA") && payloadType.getRate() == 8000) {
-//////                try {
-//////                    android.util.Log.e(TAG, "setCodecMime: " + payloadType.getMime() + " " + payloadType.getRate());
-//////                    mLc.enablePayloadType(payloadType, true);
-//////                } catch (CoreException e) {
-//////                    android.util.Log.e(TAG, "setCodecMime: " + e);
-//////                }
-//////            } else {
-//////                try {
-//////                    mLc.enablePayloadType(payloadType, false);
-//////                } catch (CoreException e) {
-//////                    e.printStackTrace();
-//////                }
-//////            }
-////        }
-////        for (PayloadType payloadType : mLc.getVideoCodecs()) {
-////            try {
-////                android.util.Log.e(TAG, "setCodecMime: mime: " + payloadType.getMime() + " rate: " + payloadType.getRate());
-////                mLc.enablePayloadType(payloadType, true);
-////            } catch (CoreException e) {
-////                e.printStackTrace();
-////            }
-////        }
-//
-//        PayloadType[] ptList = mLc.getAudioPayloadTypes();
-//        for (PayloadType pt : ptList) {
-//
-//            org.linphone.mediastream.Log.d("payloadaudio",pt.getMimeType());
-//            if (pt.getMimeType().equals("PCMA") && pt.getClockRate() == 8000) {
-//                pt.enable(true);
-//
-//            } else {
-//                pt.enable(false);
-//            }
-//        }
-//        mLc.setAudioPayloadTypes(ptList);
-//
-//        PayloadType[] ptVideoList = mLc.getVideoPayloadTypes();
-//        for (PayloadType pt : ptVideoList) {
-//            pt.enable(true);
-//        }
-//        mLc.setVideoPayloadTypes(ptVideoList);
-//    }
-//
-//    private void copyAssetsFromPackage() throws IOException {
-//        LinphoneUtils.copyIfNotExist(mServiceContext, R.raw.oldphone_mono, mRingSoundFile);
-//        LinphoneUtils.copyIfNotExist(mServiceContext, R.raw.ringback, mRingBackSoundFile);
-//        LinphoneUtils.copyIfNotExist(mServiceContext, R.raw.toy_mono, mPauseSoundFile);
-//        LinphoneUtils.copyIfNotExist(mServiceContext, R.raw.linphonerc_default, mLinphoneConfigFile);
-//        LinphoneUtils.copyIfNotExist(mServiceContext, R.raw.linphonerc_factory, new File(mLinphoneFactoryConfigFile).getName());
-//        LinphoneUtils.copyIfNotExist(mServiceContext, R.raw.lpconfig, mLPConfigXsd);
-//        LinphoneUtils.copyIfNotExist(mServiceContext, R.raw.rootca, mLinphoneRootCaFile);
-//    }
-//
-//    private void setUserAgent() {
-//        try {
-//            String versionName = mServiceContext.getPackageManager().getPackageInfo(mServiceContext.getPackageName(),
-//                    0).versionName;
-//            if (versionName == null) {
-//                versionName = String.valueOf(mServiceContext.getPackageManager().getPackageInfo(mServiceContext.getPackageName(), 0).versionCode);
-//            }
-//            mLc.setUserAgent(HDLLinphoneKitNAME, versionName);
-//        } catch (PackageManager.NameNotFoundException e) {
-//            e.printStackTrace();
-//        }
-//    }
-//
-//    public static synchronized void destroy() {
-//        if (instance == null) {
-//            return;
-//        }
-//        sExited = true;
-//        instance.doDestroy();
-//    }
-//
-//    private void doDestroy() {
-//        try {
-//            mTimer.cancel();
-//            mLc.stop();
-//        } catch (RuntimeException e) {
-//            e.printStackTrace();
-//        } finally {
-//            mLc = null;
-//            instance = null;
-//        }
-//    }
-//
-//
-//    private void setBackCamAsDefault() {
-////        int camId = 0;
-////        AndroidCameraConfiguration.AndroidCamera[] cameras = AndroidCameraConfiguration.retrieveCameras();
-////        for (AndroidCameraConfiguration.AndroidCamera androidCamera :
-////                cameras) {
-////            if (!androidCamera.frontFacing) {
-////                camId = androidCamera.id;
-////            }
-////        }
-////        android.util.Log.e(TAG, "setBackCamAsDefault: cameraId is " + camId);
-////        mLc.setVideoDevice(0);
-//    }
-//
-//    @Override
-//    public void onQrcodeFound(Core core, String result) {
-//
-//    }
-//
-//    @Override
-//    public void onInfoReceived(Core core, Call call, InfoMessage message) {
-//
-//    }
-//
-//    @Override
-//    public void onTransferStateChanged(Core core, Call transfered, Call.State callState) {
-//
-//    }
-//
-//    @Override
-//    public void onCallEncryptionChanged(Core core, Call call, boolean mediaEncryptionEnabled, String authenticationToken) {
-//
-//    }
-//
-//    @Override
-//    public void onEcCalibrationAudioInit(Core core) {
-//
-//    }
-//
-//    @Override
-//    public void onDtmfReceived(Core core, Call call, int dtmf) {
-//
-//    }
-//
-//    @Override
-//    public void onChatRoomStateChanged(Core core, ChatRoom chatRoom, ChatRoom.State state) {
-//
-//    }
-//
-//    @Override
-//    public void onLogCollectionUploadStateChanged(Core core, Core.LogCollectionUploadState state, String info) {
-//
-//    }
-//
-//    @Override
-//    public void onAudioDevicesListUpdated(Core core) {
-//
-//    }
-//
-//    @Override
-//    public void onCallIdUpdated(Core core, String previousCallId, String currentCallId) {
-//
-//    }
-//
-//    @Override
-//    public void onMessageSent(Core core, ChatRoom chatRoom, ChatMessage message) {
-//
-//    }
-//
-//    @Override
-//    public void onFriendListRemoved(Core core, FriendList friendList) {
-//
-//    }
-//
-//    @Override
-//    public void onSubscribeReceived(Core core, Event linphoneEvent, String subscribeEvent, Content body) {
-//
-//    }
-//
-//    @Override
-//    public void onAuthenticationRequested(Core core, AuthInfo authInfo, AuthMethod method) {
-//
-//    }
-//
-//    @Override
-//    public void onEcCalibrationAudioUninit(Core core) {
-//
-//    }
-//
-//    @Override
-//    public void onLogCollectionUploadProgressIndication(Core core, int offset, int total) {
-//
-//    }
-//
-//    @Override
-//    public void onImeeUserRegistration(Core core, boolean status, String userId, String info) {
-//
-//    }
-//
-//    @Override
-//    public void onRegistrationStateChanged(Core core, ProxyConfig proxyConfig, RegistrationState state, String message) {
-//
-//    }
-//
-//    @Override
-//    public void onCallStateChanged(Core core, Call call, Call.State state, String message) {
-//
-//    }
-//
-//    @Override
-//    public void onConfiguringStatus(Core core, ConfiguringState status, String message) {
-//
-//    }
-//
-//    @Override
-//    public void onGlobalStateChanged(Core core, GlobalState state, String message) {
-//
-//    }
-//
-//    @Override
-//    public void onChatRoomEphemeralMessageDeleted(Core core, ChatRoom chatRoom) {
-//
-//    }
-//
-//    @Override
-//    public void onFriendListCreated(Core core, FriendList friendList) {
-//
-//    }
-//
-//    @Override
-//    public void onBuddyInfoUpdated(Core core, Friend linphoneFriend) {
-//
-//    }
-//
-//    @Override
-//    public void onChatRoomSubjectChanged(Core core, ChatRoom chatRoom) {
-//
-//    }
-//
-//    @Override
-//    public void onNotifyReceived(Core core, Event linphoneEvent, String notifiedEvent, Content body) {
-//
-//    }
-//
-//    @Override
-//    public void onLastCallEnded(Core core) {
-//
-//    }
-//
-//    @Override
-//    public void onChatRoomRead(Core core, ChatRoom chatRoom) {
-//
-//    }
-//
-//    @Override
-//    public void onNotifyPresenceReceived(Core core, Friend linphoneFriend) {
-//
-//    }
-//
-//    @Override
-//    public void onConferenceStateChanged(Core core, Conference conference, Conference.State state) {
-//
-//    }
-//
-//    @Override
-//    public void onVersionUpdateCheckResultReceived(Core core, VersionUpdateCheckResult result, String version, String url) {
-//
-//    }
-//
-//    @Override
-//    public void onMessageReceived(Core core, ChatRoom chatRoom, ChatMessage message) {
-//
-//    }
-//
-//    @Override
-//    public void onCallStatsUpdated(Core core, Call call, CallStats callStats) {
-//
-//    }
-//
-//    @Override
-//    public void onFirstCallStarted(Core core) {
-//
-//    }
-//
-//    @Override
-//    public void onSubscriptionStateChanged(Core core, Event linphoneEvent, SubscriptionState state) {
-//
-//    }
-//
-//    @Override
-//    public void onMessageReceivedUnableDecrypt(Core core, ChatRoom chatRoom, ChatMessage message) {
-//
-//    }
-//
-//    @Override
-//    public void onEcCalibrationResult(Core core, EcCalibratorStatus status, int delayMs) {
-//
-//    }
-//
-//    @Override
-//    public void onIsComposingReceived(Core core, ChatRoom chatRoom) {
-//
-//    }
-//
-//    @Override
-//    public void onReferReceived(Core core, String referTo) {
-//
-//    }
-//
-//    @Override
-//    public void onNetworkReachable(Core core, boolean reachable) {
-//
-//    }
-//
-//    @Override
-//    public void onPublishStateChanged(Core core, Event linphoneEvent, PublishState state) {
-//
-//    }
-//
-//    @Override
-//    public void onAudioDeviceChanged(Core core, AudioDevice audioDevice) {
-//
-//    }
-//
-//    @Override
-//    public void onCallLogUpdated(Core core, CallLog callLog) {
-//
-//    }
-//
-//    @Override
-//    public void onCallCreated(Core core, Call call) {
-//
-//    }
-//
-//    @Override
-//    public void onNotifyPresenceReceivedForUriOrTel(Core core, Friend linphoneFriend, String uriOrTel, PresenceModel presenceModel) {
-//
-//    }
-//
-//    @Override
-//    public void onNewSubscriptionRequested(Core core, Friend linphoneFriend, String url) {
-//
-//    }
-//
-////    public void resetCameraFromPreferences(boolean useFrontCam) {
-////        Core core = getCore();
-////        if (core == null) return;
-////
-////
-////        String firstDevice = null;
-////        for (String camera : core.getVideoDevicesList()) {
-////            if (firstDevice == null) {
-////                firstDevice = camera;
-////            }
-////
-////            if (useFrontCam) {
-////                if (camera.contains("Front")) {
-////                    Log.i("[Manager] Found front facing camera: " + camera);
-////                    core.setVideoDevice(camera);
-////                    return;
-////                }
-////            }
-////        }
-////
-////        Log.i("[Manager] Using first camera available: " + firstDevice);
-////        core.setVideoDevice(firstDevice);
-////    }
-//}
diff --git a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/linphone/LinphoneUtils.java b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/linphone/LinphoneUtils.java
deleted file mode 100644
index 62df14b..0000000
--- a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/linphone/LinphoneUtils.java
+++ /dev/null
@@ -1,267 +0,0 @@
-package com.hdl.hdllinphonesdk.core.linphone;
-
-import android.content.Context;
-
-import com.hdl.hdllinphonesdk.core.service.HDLLinphoneService;
-
-import org.linphone.core.AccountCreator;
-import org.linphone.core.Address;
-import org.linphone.core.AudioDevice;
-import org.linphone.core.AuthInfo;
-import org.linphone.core.Call;
-import org.linphone.core.CallParams;
-import org.linphone.core.Core;
-import org.linphone.core.CoreException;
-import org.linphone.core.Factory;
-import org.linphone.core.ProxyConfig;
-import org.linphone.core.TransportType;
-import org.linphone.core.tools.Log;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * 璇煶閫氳瘽宸ュ叿绫�
- */
-
-public class LinphoneUtils {
-
-    private static final String TAG = "LinphoneUtils";
-    private static volatile LinphoneUtils sLinphoneUtils;
-
-    public static LinphoneUtils getInstance() {
-        if (sLinphoneUtils == null) {
-            synchronized (LinphoneUtils.class) {
-                if (sLinphoneUtils == null) {
-                    sLinphoneUtils = new LinphoneUtils();
-                }
-            }
-        }
-        return sLinphoneUtils;
-    }
-
-    private LinphoneUtils() {
-
-    }
-
-    /**
-     * 娉ㄥ唽鍒版湇鍔″櫒
-     *
-     * @param name
-     * @param password
-     * @param host
-     * @throws CoreException
-     */
-    public void registerUserAuth(String name, String password, String host) throws CoreException {
-        Core mLinphoneCore = HDLLinphoneService.getCore();
-        if(mLinphoneCore == null) return;
-
-        AuthInfo authInfo = Factory.instance().createAuthInfo(name, null, password,
-                null, null, host);
-
-        AccountCreator mAccountCreator = mLinphoneCore.createAccountCreator(null);
-        mAccountCreator.setUsername(name);
-        mAccountCreator.setDomain(host);
-        mAccountCreator.setPassword(password);
-        mAccountCreator.setTransport(TransportType.Udp);
-        ProxyConfig prxCfg = mAccountCreator.createProxyConfig();
-
-        prxCfg.enableQualityReporting(false);
-        prxCfg.setQualityReportingCollector(null);
-        prxCfg.setQualityReportingInterval(0);
-        prxCfg.enableRegister(true);
-////        mLinphoneCore.enableDnsSrv(true);
-        mLinphoneCore.addProxyConfig(prxCfg);
-        mLinphoneCore.addAuthInfo(authInfo);
-        mLinphoneCore.setDefaultProxyConfig(prxCfg);
-    }
-
-    public Call startSingleCallingTo(PhoneBean bean, boolean isVideoCall) {
-        Core mLinphoneCore = HDLLinphoneService.getCore();
-        if(mLinphoneCore == null) return null;
-        Address address;
-        Call call = null;
-        try {
-            address = mLinphoneCore.interpretUrl(bean.getUserName() + "@" + bean.getHost());
-        } catch (Exception e) {
-            e.printStackTrace();
-            return null;
-        }
-        address.setDisplayName(bean.getDisplayName());
-        CallParams params = mLinphoneCore.createCallParams(null);
-        if (isVideoCall) {
-            params.enableVideo(true);
-            params.enableLowBandwidth(false);
-        } else {
-            params.enableVideo(false);
-        }
-        try {
-            call = mLinphoneCore.inviteAddressWithParams(address, params);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return call;
-    }
-
-    /**
-     * 鍛煎彨
-     */
-    public Call startSingleCallingTo(String userName, boolean isVideoCall) {
-        Core mLinphoneCore = HDLLinphoneService.getCore();
-        if(mLinphoneCore == null) return null;
-
-        Call call = null;
-        Core core = HDLLinphoneService.getCore();
-        if(core != null) {
-            Address addressToCall = core.interpretUrl(userName);
-            CallParams params = core.createCallParams(null);
-
-            if (isVideoCall) {
-                params.enableVideo(true);
-                params.enableLowBandwidth(false);
-            } else {
-                params.enableVideo(false);
-            }
-
-            if (addressToCall != null) {
-                call = core.inviteAddressWithParams(addressToCall, params);
-            }
-        }
-        return call;
-    }
-
-    /**
-     * 鍛煎彨鎸囧畾鍙风爜
-     *
-     * @param num 鍛煎彨鍙风爜
-     */
-    public void callTo(String num, boolean isVideoCall) {
-        if (!HDLLinphoneService.isReady() || !HDLLinphoneService.getCoreIsNotNull()) {
-            return;
-        }
-        if (!num.equals("")) {
-           startSingleCallingTo(num, isVideoCall);
-        }
-    }
-
-    /**
-     * 鎺ュ惉鏉ョ數
-     */
-    public void acceptCall() {
-        try {
-            if(HDLLinphoneService.getCore() == null) return;
-            Call currentCall = HDLLinphoneService.getCore().getCurrentCall();
-            CallParams params = HDLLinphoneService.getCore().createCallParams(currentCall);
-            params.enableVideo(true);
-            currentCall.acceptWithParams(params);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * 鎺ュ惉鏉ョ數
-     */
-    public void acceptCallWithVideo(boolean enableVideo) {
-        try {
-            if(HDLLinphoneService.getCore() == null) return;
-            Call currentCall = HDLLinphoneService.getCore().getCurrentCall();
-            CallParams params = HDLLinphoneService.getCore().createCallParams(currentCall);
-            params.enableVideo(enableVideo);
-            currentCall.acceptWithParams(params);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * 鎸傛柇鐢佃瘽
-     */
-    public void hangUp() {
-        Core mLinphoneCore = HDLLinphoneService.getCore();
-        if(mLinphoneCore == null) return;
-        Call currentCall = mLinphoneCore.getCurrentCall();
-        if (currentCall != null) {
-//            mLinphoneCore.terminateCall(currentCall);
-            mLinphoneCore.terminateAllCalls();
-        } else if (mLinphoneCore.isInConference()) {
-            mLinphoneCore.terminateConference();
-        } else {
-            mLinphoneCore.terminateAllCalls();
-        }
-    }
-
-    /**
-     * 鏄惁闈欓煶
-     *
-     * @param isMicMuted
-     */
-    public void toggleMicro(boolean isMicMuted) {
-        Core mLinphoneCore = HDLLinphoneService.getCore();
-        if(mLinphoneCore == null) return;
-        mLinphoneCore.enableMic(!isMicMuted);
-    }
-
-    /**
-     * 鏄惁澶栨斁
-     *
-     * @param isSpeakerEnabled
-     */
-    public void toggleSpeaker(boolean isSpeakerEnabled) {
-        routeAudioToSpeakerHelper(isSpeakerEnabled);
-    }
-
-    private void routeAudioToSpeakerHelper(boolean speakerOn) {
-        Log.w("[Audio Manager] Routing audio to " + (speakerOn ? "speaker" : "earpiece"));
-        try {
-            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()) {
-                if (speakerOn && audioDevice.getType() == AudioDevice.Type.Speaker) {
-                    currentCall.setOutputAudioDevice(audioDevice);
-                    return;
-                } else if (!speakerOn && audioDevice.getType() == AudioDevice.Type.Earpiece) {
-                    currentCall.setOutputAudioDevice(audioDevice);
-                    return;
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public static void copyIfNotExist(Context context, int resourceId, String target) throws IOException {
-        File fileToCopy = new File(target);
-        if (!fileToCopy.exists()) {
-            copyFromPackage(context, resourceId, fileToCopy.getName());
-        }
-    }
-
-    public static void copyFromPackage(Context context, int resourceId, String target) throws IOException {
-        FileOutputStream outputStream = context.openFileOutput(target, 0);
-        InputStream inputStream = context.getResources().openRawResource(resourceId);
-        int readByte;
-        byte[] buff = new byte[8048];
-        while ((readByte = inputStream.read(buff)) != -1) {
-            outputStream.write(buff, 0, readByte);
-        }
-        outputStream.flush();
-        outputStream.close();
-        inputStream.close();
-    }
-
-    public static void sleep(int time) {
-        try {
-            Thread.sleep(time);
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        }
-    }
-
-}
diff --git a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/linphone/PhoneBean.java b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/linphone/PhoneBean.java
deleted file mode 100644
index 2185e9e..0000000
--- a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/linphone/PhoneBean.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.hdl.hdllinphonesdk.core.linphone;
-
-/**
- * sip 璐﹀彿淇℃伅
- */
-
-public class PhoneBean {
-    private String displayName;
-    private String userName;
-    private String host;
-    private String password;
-
-    public String getDisplayName() {
-        return displayName;
-    }
-
-    public void setDisplayName(String displayName) {
-        this.displayName = displayName;
-    }
-
-    public String getUserName() {
-        return userName;
-    }
-
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    public String getHost() {
-        return host;
-    }
-
-    public void setHost(String host) {
-        this.host = host;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-}
diff --git a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/service/HDLLinphoneService.java b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/service/HDLLinphoneService.java
index 9472865..8772ac9 100644
--- a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/service/HDLLinphoneService.java
+++ b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/core/service/HDLLinphoneService.java
@@ -1,6 +1,9 @@
 package com.hdl.hdllinphonesdk.core.service;
 
 import android.app.AlarmManager;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.app.Service;
 import android.content.Context;
@@ -11,14 +14,14 @@
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.SystemClock;
+import android.support.v4.app.NotificationCompat;
 
 
-import com.hdl.hdllinphonesdk.HDLLinphoneKit;
 import com.hdl.hdllinphonesdk.R;
 import com.hdl.hdllinphonesdk.core.callback.PhoneCallback;
 import com.hdl.hdllinphonesdk.core.callback.RegistrationCallback;
 import com.hdl.hdllinphonesdk.core.linphone.KeepAliveHandler;
-import com.hdl.hdllinphonesdk.core.linphone.LinphoneUtils;
+import com.hdl.hdllinphonesdk.utils.HDLLog;
 
 import org.linphone.core.Call;
 import org.linphone.core.Core;
@@ -51,7 +54,7 @@
     private PendingIntent mKeepAlivePendingIntent;
     private static PhoneCallback sPhoneCallback;//閫氳瘽鐘舵�佸洖璋�
     private static RegistrationCallback sRegistrationCallback;//璐﹀彿娉ㄥ唽鐧诲綍鐘舵�佸洖璋�
-    private String mRingSoundFile,mPauseSoundFile = null;
+    private String mRingSoundFile, mPauseSoundFile = null;
 
     private Handler mHandler;
     private Timer mTimer;
@@ -73,6 +76,9 @@
     }
 
     public static Core getCore() {
+        if(sInstance == null){
+            return null;
+        }
         return sInstance.mCore;
     }
 
@@ -82,26 +88,35 @@
         return null;
     }
 
+    /**
+     * 娣诲姞閫氳瘽鐘舵�佸洖璋�
+     * @param phoneCallback
+     */
     public static void addPhoneCallback(PhoneCallback phoneCallback) {
         sPhoneCallback = phoneCallback;
     }
-
     public static void removePhoneCallback() {
         if (sPhoneCallback != null) {
             sPhoneCallback = null;
         }
     }
 
+    /**
+     * 娣诲姞娉ㄥ唽鐘舵�佸洖璋�
+     * @param registrationCallback
+     */
     public static void addRegistrationCallback(RegistrationCallback registrationCallback) {
         sRegistrationCallback = registrationCallback;
     }
-
     public static void removeRegistrationCallback() {
         if (sRegistrationCallback != null) {
             sRegistrationCallback = null;
         }
     }
 
+    /**
+     * 绉婚櫎鎵�浠allback
+     */
     public void removeAllCallback() {
         removePhoneCallback();
         removeRegistrationCallback();
@@ -110,16 +125,13 @@
     @Override
     public void onCreate() {
         super.onCreate();
-
+        hdlStartForeground();
         initLinphone();
-
         Intent intent = new Intent(this, KeepAliveHandler.class);
         mKeepAlivePendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
         ((AlarmManager) this.getSystemService(Context.ALARM_SERVICE)).setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                 SystemClock.elapsedRealtime() + 60000, 60000, mKeepAlivePendingIntent);
-
     }
-
 
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
@@ -162,7 +174,7 @@
     @Override
     public void onDestroy() {
         removeAllCallback();
-
+        logout();
         mCore.removeListener(mCoreListener);
         mTimer.cancel();
         mCore.stop();
@@ -174,6 +186,7 @@
 
         ((AlarmManager) this.getSystemService(Context.ALARM_SERVICE)).cancel(mKeepAlivePendingIntent);
 
+        hdlStopForeground();
         super.onDestroy();
     }
 
@@ -189,21 +202,18 @@
      * 鍒濆鍖朙inphone
      */
     private void initLinphone() {
-
         String basePath = getFilesDir().getAbsolutePath();
         Factory.instance().setLogCollectionPath(basePath);
         Factory.instance().enableLogCollection(LogCollectionState.Enabled);
         Factory.instance().setDebugMode(false, getString(R.string.app_name));
         // Dump some useful information about the device we're running on
-        Log.i(START_LINPHONE_LOGS);
-        dumpDeviceInformation();
-        dumpInstalledLinphoneInformation();
+//        HDLLog.I(START_LINPHONE_LOGS);
+//        dumpDeviceInformation();
+//        dumpInstalledLinphoneInformation();
         mHandler = new Handler();
         // This will be our main Core listener, it will change activities depending on events
         initCoreListener();
-
         copyAssetsFromPackage(basePath);
-
         // Create the Core and add our listener
         mCore = Factory.instance()
                 .createCore(basePath + "/.linphonerc", basePath + "/linphonerc", this);
@@ -212,11 +222,14 @@
         configureCore();
     }
 
+    /**
+     * 鍒濆鍖朇oreListener鐩戝惉
+     */
     private void initCoreListener() {
         mCoreListener = new CoreListenerStub() {
             @Override
             public void onCallStateChanged(Core core, Call linphoneCall, Call.State state, String message) {
-                Log.e(START_LINPHONE_LOGS, "callState: " + state.toString());
+                HDLLog.e(START_LINPHONE_LOGS, "callState: " + state.toString());
                 currentCallState = state;
                 if (sPhoneCallback != null) {
                     if (state == Call.State.IncomingReceived) {
@@ -237,20 +250,28 @@
 
             @Override
             public void onRegistrationStateChanged(Core core, ProxyConfig proxyConfig, RegistrationState registrationState, String message) {
-
                 String state = registrationState.toString();
-                Log.i(START_LINPHONE_LOGS, "registrationState: " + state);
-                if (sRegistrationCallback != null) {
+                HDLLog.i(START_LINPHONE_LOGS, "registrationState: " + state);
 
-                    if (state.equals(RegistrationState.None.toString())) {
+                if (state.equals(RegistrationState.None.toString())) {
+                    if (sRegistrationCallback != null){
                         sRegistrationCallback.registrationNone();
-                    } else if (state.equals(RegistrationState.Progress.toString())) {
+                    }
+                } else if (state.equals(RegistrationState.Progress.toString())) {
+                    if (sRegistrationCallback != null){
                         sRegistrationCallback.registrationProgress();
-                    } else if (state.equals(RegistrationState.Ok.toString())) {
+                    }
+                } else if (state.equals(RegistrationState.Ok.toString())) {
+                    if (sRegistrationCallback != null) {
                         sRegistrationCallback.registrationOk();
-                    } else if (state.equals(RegistrationState.Cleared.toString())) {
+                    }
+                } else if (state.equals(RegistrationState.Cleared.toString())) {
+                    removeProxyConfig(core, proxyConfig);
+                    if (sRegistrationCallback != null) {
                         sRegistrationCallback.registrationCleared();
-                    } else if (state.equals(RegistrationState.Failed.toString())) {
+                    }
+                } else if (state.equals(RegistrationState.Failed.toString())) {
+                    if (sRegistrationCallback != null) {
                         sRegistrationCallback.registrationFailed();
                     }
                 }
@@ -258,6 +279,26 @@
         };
     }
 
+    /**
+     * 鏀跺埌娉ㄩ攢鎴愬姛鍚庣Щ闄ゅ綋鍓嶄唬鐞�
+     * @param core
+     * @param proxyConfig
+     */
+    void removeProxyConfig(Core core, ProxyConfig proxyConfig) {
+        try {
+            HDLLog.i(START_LINPHONE_LOGS, "registrationState: 娉ㄩ攢鎴愬姛绉婚櫎璐﹀彿锛�" + proxyConfig.getIdentityAddress().getUsername());
+            //鏀跺埌娉ㄩ攢鎴愬姛鍚庣Щ闄ゅ綋鍓嶄唬鐞�
+            if (core != null) {
+                core.removeProxyConfig(proxyConfig);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * mCore鍚姩榛樿鍙傛暟閰嶇疆
+     */
     private void configureCore() {
         // We will create a directory for user signed certificates if needed
         String basePath = getFilesDir().getAbsolutePath();
@@ -265,19 +306,18 @@
         File f = new File(userCerts);
         if (!f.exists()) {
             if (!f.mkdir()) {
-                Log.e(userCerts + " can't be created.");
+                HDLLog.E(userCerts + " can't be created.");
             }
         }
+        //璁剧疆UserAgent
         setUserAgent();
 
         mCore.setUserCertificatesPath(userCerts);
 //        mCore.setNativeRingingEnabled(true);
-//
 //        mCore.setRemoteRingbackTone(mRingSoundFile);
 //        mCore.setTone(ToneID.CallWaiting, mRingSoundFile);
         mCore.setRing(mRingSoundFile);
 //        mCore.setPlayFile(mPauseSoundFile);
-
 //        mCore.enableVideoCapture(false);//绂佺敤鎵嬫満鎽勫儚澶磋棰戦噰闆�
 
         mCore.setNetworkReachable(true);
@@ -288,7 +328,6 @@
         mCore.enableEchoLimiter(true);
 
         //鑷�傚簲鐮佺巼鎺у埗
-//        boolean isAdaptiveRateControl = (boolean) SPUtils.get(mServiceContext, "adaptive_rate_control", true);
         mCore.enableAdaptiveRateControl(true);
         //audio 鐮佺巼璁剧疆
         mCore.getConfig().setInt("audio", "codec_bitrate_limit", 36);
@@ -309,6 +348,9 @@
         setCodecMime();
     }
 
+    /**
+     * 璁剧疆缂栫爜鏍煎紡
+     */
     private void setCodecMime() {
         PayloadType[] ptList = mCore.getAudioPayloadTypes();
         for (PayloadType pt : ptList) {
@@ -330,6 +372,10 @@
         mCore.setVideoPayloadTypes(ptVideoList);
     }
 
+    /**
+     * 璁剧疆鏄惁鍚敤閾冨0锛岀洰鍓嶅彂鐜拌缃棤鏁堝緟鍒嗘瀽鍘熷洜
+     * @param use
+     */
     public void enableDeviceRingtone(boolean use) {
         if (use) {
             mCore.setRing(null);
@@ -338,6 +384,9 @@
         }
     }
 
+    /**
+     * 璁剧疆UserAgent
+     */
     private void setUserAgent() {
         try {
             String versionName = this.getPackageManager().getPackageInfo(this.getPackageName(),
@@ -351,6 +400,9 @@
         }
     }
 
+    /**
+     * 鎵撳嵃鐩稿叧淇℃伅
+     */
     private void dumpDeviceInformation() {
         StringBuilder sb = new StringBuilder();
         sb.append("DEVICE=").append(Build.DEVICE).append("\n");
@@ -362,9 +414,12 @@
             sb.append(abi).append(", ");
         }
         sb.append("\n");
-        Log.i(sb.toString());
+        HDLLog.I(sb.toString());
     }
 
+    /**
+     * 鎵撳嵃鐗堟湰鍙蜂俊鎭�
+     */
     private void dumpInstalledLinphoneInformation() {
         PackageInfo info = null;
         try {
@@ -374,11 +429,11 @@
         }
 
         if (info != null) {
-            Log.i(
+            HDLLog.i(
                     "[Service] Linphone version is ",
                     info.versionName + " (" + info.versionCode + ")");
         } else {
-            Log.i("[Service] Linphone version is unknown");
+            HDLLog.I("[Service] Linphone version is unknown");
         }
     }
 
@@ -393,18 +448,10 @@
             // The factory config is used to override any other setting, let's copy it each time
             copyFromPackage(R.raw.linphonerc_factory, "linphonerc");
             mRingSoundFile = basePath + "/oldphone_mono.wav";
-            copyIfNotExist(R.raw.oldphone_mono,  basePath + "/oldphone_mono.wav");
+            copyIfNotExist(R.raw.oldphone_mono, basePath + "/oldphone_mono.wav");
             copyIfNotExist(R.raw.ringback, basePath + "/ringback.wav");
             mPauseSoundFile = basePath + "/toy_mono.wav";
-            copyIfNotExist( R.raw.toy_mono, basePath + "/toy_mono.wav");
-
-//        LinphoneUtils.copyIfNotExist(mServiceContext, R.raw.ringback, mRingBackSoundFile);
-//        LinphoneUtils.copyIfNotExist(mServiceContext, R.raw.toy_mono, mPauseSoundFile);
-//        LinphoneUtils.copyIfNotExist(mServiceContext, R.raw.linphonerc_default, mLinphoneConfigFile);
-//        LinphoneUtils.copyIfNotExist(mServiceContext, R.raw.linphonerc_factory, new File(mLinphoneFactoryConfigFile).getName());
-//        LinphoneUtils.copyIfNotExist(mServiceContext, R.raw.lpconfig, mLPConfigXsd);
-//        LinphoneUtils.copyIfNotExist(mServiceContext, R.raw.rootca, mLinphoneRootCaFile);
-
+            copyIfNotExist(R.raw.toy_mono, basePath + "/toy_mono.wav");
 
         } catch (IOException ioe) {
             Log.e(ioe);
@@ -412,6 +459,12 @@
 
     }
 
+    /**
+     * copyIfNotExist
+     * @param ressourceId
+     * @param target
+     * @throws IOException
+     */
     private void copyIfNotExist(int ressourceId, String target) throws IOException {
         File lFileToCopy = new File(target);
         if (!lFileToCopy.exists()) {
@@ -419,6 +472,12 @@
         }
     }
 
+    /**
+     * copyFromPackage
+     * @param ressourceId
+     * @param target
+     * @throws IOException
+     */
     private void copyFromPackage(int ressourceId, String target) throws IOException {
         FileOutputStream lOutputStream = openFileOutput(target, 0);
         InputStream lInputStream = getResources().openRawResource(ressourceId);
@@ -438,4 +497,44 @@
     public Call.State getCurrentCallState() {
         return currentCallState;
     }
+
+    /**
+     * 娉ㄩ攢鎵�鏈夎处鍙�
+     */
+    void logout() {
+        try {
+            if (mCore != null) {
+                ProxyConfig[] configs = mCore.getProxyConfigList();
+                for (ProxyConfig config : configs) {
+                    if (config != null) {
+                        config.edit();
+                        config.enableRegister(false);
+                        config.done();
+                    }
+                }
+                HDLLog.E("娉ㄩ攢鎵�鏈夎处鍙�");
+//                core.clearAllAuthInfo();
+//                core.clearProxyConfig();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    //閫氱煡ID
+    public static final int NOTIFICATION_ID = 2;
+    /**
+     * 瑙e喅android8.0浠ヤ笂鏃犳硶鍚姩鏈嶅姟鐨勯棶棰�
+     */
+    void hdlStartForeground() {
+
+    }
+    /**
+     * stopForeground
+     */
+    void hdlStopForeground() {
+//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+//            stopForeground(true);
+//        }
+    }
 }
diff --git a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/utils/HDLImageUtils.java b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/utils/HDLImageUtils.java
index 2acaa72..4896f19 100644
--- a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/utils/HDLImageUtils.java
+++ b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/utils/HDLImageUtils.java
@@ -81,15 +81,15 @@
 
             }
         } catch (FileNotFoundException e) {
-            Log.e("FileNotFoundException", "FileNotFoundException:" + e.getMessage().toString());
+            HDLLog.e("FileNotFoundException", "FileNotFoundException:" + e.getMessage().toString());
             e.printStackTrace();
             return false;
         } catch (IOException e) {
-            Log.e("IOException", "IOException:" + e.getMessage().toString());
+            HDLLog.e("IOException", "IOException:" + e.getMessage().toString());
             e.printStackTrace();
             return false;
         } catch (Exception e) {
-            Log.e("IOException", "IOException:" + e.getMessage().toString());
+            HDLLog.e("IOException", "IOException:" + e.getMessage().toString());
             e.printStackTrace();
             return false;
 
diff --git a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/utils/HDLLog.java b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/utils/HDLLog.java
index 5cedce7..9a7d629 100644
--- a/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/utils/HDLLog.java
+++ b/HDLLinphoneSDKDemoNew/HDLLinphoneSDK/src/main/java/com/hdl/hdllinphonesdk/utils/HDLLog.java
@@ -4,11 +4,36 @@
 
 import static com.hdl.hdllinphonesdk.HDLLinphoneKit.HDLLinphoneKitNAME;
 
+/**
+ * 鎵撳嵃宸ュ叿
+ */
 public class HDLLog {
-    private static boolean isOpen = true;
-    public static void Log(String message){
-        if(isOpen){
+    /**
+     * 鏄惁鍚敤鎵撳嵃
+     */
+    private static boolean enableLog = true;
+
+    public static boolean isEnableLog() {
+        return enableLog;
+    }
+
+    public static void setEnableLog(boolean enableLog) {
+        HDLLog.enableLog = enableLog;
+    }
+
+    public static void I(String message){
+        if(enableLog){
             Log.i(HDLLinphoneKitNAME, message);
+        }
+    }
+    /**
+     * 鎵撳嵃
+     * @param tag
+     * @param msg
+     */
+    public static void i(String tag, String msg){
+        if(enableLog){
+            Log.i(tag, msg);
         }
     }
 
@@ -17,9 +42,18 @@
      * @param message
      */
     public static void E(String message){
-        if(isOpen){
+        if(enableLog){
             Log.e(HDLLinphoneKitNAME, message);
         }
     }
 
+    /**
+     * Error 鎵撳嵃绾㈣壊鐨勯敊璇俊鎭�
+     */
+    public static void e(String tag, String msg){
+        if(enableLog){
+            Log.e(tag, msg);
+        }
+    }
+
 }
diff --git a/HDLLinphoneSDKDemoNew/app/libs/HDLLinphoneSDK-V1.0.1.aar b/HDLLinphoneSDKDemoNew/app/libs/HDLLinphoneSDK-V1.0.1.aar
index 34ae179..f9b1d2e 100644
--- a/HDLLinphoneSDKDemoNew/app/libs/HDLLinphoneSDK-V1.0.1.aar
+++ b/HDLLinphoneSDKDemoNew/app/libs/HDLLinphoneSDK-V1.0.1.aar
Binary files differ
diff --git a/HDLLinphoneSDKDemoNew/app/src/main/java/com/example/hdllinphonesdkdemo/HDLUtils.java b/HDLLinphoneSDKDemoNew/app/src/main/java/com/example/hdllinphonesdkdemo/HDLUtils.java
index 9111da8..abb81fd 100644
--- a/HDLLinphoneSDKDemoNew/app/src/main/java/com/example/hdllinphonesdkdemo/HDLUtils.java
+++ b/HDLLinphoneSDKDemoNew/app/src/main/java/com/example/hdllinphonesdkdemo/HDLUtils.java
@@ -23,7 +23,7 @@
 ////                mAudioPlayUtil.playAudioFile(AudioPlayUtil.CAPTURE_SOUND);
 //
 //                final String strCaptureFile = context.getCapturesFolder() + "/" + System.currentTimeMillis() + ".jpg";
-//                Log.e(TAG, "captured picture file path is " + strCaptureFile);
+//                HDLLog.e(TAG, "captured picture file path is " + strCaptureFile);
 //
 //                if (TextUtils.isEmpty(strCaptureFile)) {
 //                    bmp.recycle();
diff --git a/HDLLinphoneSDKDemoNew/app/src/main/java/com/example/hdllinphonesdkdemo/MainActivity.java b/HDLLinphoneSDKDemoNew/app/src/main/java/com/example/hdllinphonesdkdemo/MainActivity.java
index c316c7a..f17663c 100644
--- a/HDLLinphoneSDKDemoNew/app/src/main/java/com/example/hdllinphonesdkdemo/MainActivity.java
+++ b/HDLLinphoneSDKDemoNew/app/src/main/java/com/example/hdllinphonesdkdemo/MainActivity.java
@@ -13,8 +13,9 @@
 import com.hdl.hdllinphonesdk.HDLLinphoneKit;
 import com.hdl.hdllinphonesdk.activity.HDLLinphoneMonitorActivity;
 import com.hdl.hdllinphonesdk.callback.OnHDLLinphoneCallListener;
-import com.hdl.hdllinphonesdk.core.EasyLinphone;
+//import com.hdl.hdllinphonesdk.core.EasyLinphone;
 import com.hdl.hdllinphonesdk.core.service.HDLLinphoneService;
+import com.hdl.hdllinphonesdk.utils.HDLLog;
 
 import org.linphone.core.Address;
 import org.linphone.core.Call;
@@ -25,7 +26,7 @@
 public class MainActivity extends Activity {
     private static final String TAG = "MainActivity";
 
-    private TextView mTextView,mTextView2,mTextView3;
+    private TextView mTextView,mTextView2,mTextView3,mTextView4;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -34,7 +35,7 @@
         mTextView = findViewById(R.id.tv_hello);
         mTextView2 = findViewById(R.id.mTextView2);
         mTextView3 = findViewById(R.id.mTextView3);
-
+        mTextView4 = findViewById(R.id.mTextView4);
 
         mTextView.setOnClickListener(new View.OnClickListener() {
             @Override
@@ -49,73 +50,95 @@
 //                HDLLinphoneKit.getInstance().setAccountAndLogin("61723164995710", "8ec02ce0", "sipproxy.ucpaas.com:25060");
 
 //                HDLLinphoneKit.getInstance().setAccountAndLogin("5555", "85521566", "116.62.26.215:5060");
+//                HDLLinphoneKit.getInstance().setAccountAndLogin("5555", "85521566", "test-gz.hdlcontrol.com:5060");
+//                HDLLinphoneKit.getInstance().setAccountAndLogin("6666", "85521566", "test-gz.hdlcontrol.com:5060");
+
+                HDLLinphoneKit.getInstance().setAccountAndLogin("7777", "85521566", "test-gz.hdlcontrol.com:5060");
+//
+//                HDLLinphoneKit.getInstance().setAccountAndLogin("8888", "85521566", "test-gz.hdlcontrol.com:5060");
+//
+//                HDLLinphoneKit.getInstance().setAccountAndLogin("4444", "85521566", "test-gz.hdlcontrol.com:5060");
+
+
+            }
+        });
+
+        mTextView4.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
                 HDLLinphoneKit.getInstance().setAccountAndLogin("5555", "85521566", "test-gz.hdlcontrol.com:5060");
-
-
-
             }
         });
 
         mTextView2.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-//                HDLLinphoneKit.getInstance().callTo("61723164995779",true);
-//                HDLcallTo("61723164995779",true);
-                HDLcallTo("1427186301744910338",true);
-                startActivity(HDLLinphoneMonitorActivity.class);
+
+                logoutLog();
+                return;
+////                HDLLinphoneKit.getInstance().callTo("61723164995779",true);
+////                HDLcallTo("61723164995779",true);
+//                HDLLinphoneKit.getInstance().callTo("1427186301744910338",true);
+//                startActivity(HDLLinphoneMonitorActivity.class);
+
+
             }
         });
 
         mTextView3.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                logout();
+                HDLLinphoneKit.getInstance().logout();
             }
         });
 
         HDLLinphoneKit.getInstance().initLinphone(this);
+        HDLLinphoneKit.getInstance().setAutoJumpCallView(true);
         setOnHDLLinphoneCallListener();
     }
 
+
+
+    /**
+     * 閫�鍑烘竻绌鸿处鍙�
+     * enableRegister false
+     */
     public void logout() {
         try {
             Core core = HDLLinphoneService.getCore();
-            ProxyConfig[] configs = core.getProxyConfigList();
-            for (ProxyConfig config : configs) {
-                if (config != null) {
-                    config.edit();
-                    config.enableRegister(false);
-                    config.done();
+            if (core != null) {
+                ProxyConfig[] configs = core.getProxyConfigList();
+                for (ProxyConfig config : configs) {
+                    if (config != null) {
+                        config.edit();
+                        config.enableRegister(false);
+                        config.done();
+                    }
                 }
+                core.clearAllAuthInfo();//娓呴櫎鎵�鏈夎璇佷俊鎭��
+//                core.clearProxyConfig();//浠庨厤缃腑鍒犻櫎鎵�鏈変唬鐞嗐��
             }
-//            core.clearAllAuthInfo();
-//            core.clearProxyConfig();
-
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
-    public Call HDLcallTo(String userName, boolean isVideoCall) {
-        Call call = null;
-        Core core = HDLLinphoneService.getCore();
-        Address addressToCall = core.interpretUrl(userName);
-        CallParams params = core.createCallParams(null);
+    public void logoutLog() {
+        try {
+            Core core = HDLLinphoneService.getCore();
+            ProxyConfig[] configs = core.getProxyConfigList();
+            if(configs != null) {
+                HDLLog.E("registrationState璐︽埛length" + configs.length);
+            }
 
-        if (isVideoCall) {
-            params.enableVideo(true);
-            params.enableLowBandwidth(false);
-        } else {
-            params.enableVideo(false);
+            for (ProxyConfig config : configs) {
+                HDLLog.E("registrationState璐︽埛"+config.getIdentityAddress().getUsername());
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
         }
-
-        if (addressToCall != null) {
-            call = core.inviteAddressWithParams(addressToCall, params);
-        }
-
-        return call;
     }
-
 
     boolean openSuccess;
     void setOnHDLLinphoneCallListener(){
@@ -156,7 +179,12 @@
             public void onScreenshotSuccessfulAction(Bitmap image) {
                 showToast("鎴浘");
             }
-        });
+
+           @Override
+           public void onIncomingCall(String s) {
+
+           }
+       });
     }
 
     /**
diff --git a/HDLLinphoneSDKDemoNew/app/src/main/res/layout/activity_main.xml b/HDLLinphoneSDKDemoNew/app/src/main/res/layout/activity_main.xml
index 23f37d8..5032524 100644
--- a/HDLLinphoneSDKDemoNew/app/src/main/res/layout/activity_main.xml
+++ b/HDLLinphoneSDKDemoNew/app/src/main/res/layout/activity_main.xml
@@ -16,6 +16,16 @@
         android:background="@android:color/holo_blue_light"
 
         android:text="鐧诲綍" ></TextView>
+    <TextView
+        android:id="@+id/mTextView4"
+        android:layout_width="match_parent"
+        android:layout_height="50dp"
+        android:layout_marginTop="30dp"
+        android:gravity="center"
+        android:textColor="@android:color/white"
+        android:background="@android:color/holo_blue_light"
+
+        android:text="鐧诲綍2" ></TextView>
 
     <TextView
         android:id="@+id/mTextView2"
diff --git a/Shared.Droid.HDLLinphone/Shared.Droid.HDLLinphone/Jars/HDLLinphoneSDK-V1.0.1.aar b/Shared.Droid.HDLLinphone/Shared.Droid.HDLLinphone/Jars/HDLLinphoneSDK-V1.0.1.aar
index 34ae179..f9b1d2e 100644
--- a/Shared.Droid.HDLLinphone/Shared.Droid.HDLLinphone/Jars/HDLLinphoneSDK-V1.0.1.aar
+++ b/Shared.Droid.HDLLinphone/Shared.Droid.HDLLinphone/Jars/HDLLinphoneSDK-V1.0.1.aar
Binary files differ
diff --git a/Shared.Droid.HDLLinphone/Shared.Droid.HDLLinphone/Properties/AssemblyInfo.cs b/Shared.Droid.HDLLinphone/Shared.Droid.HDLLinphone/Properties/AssemblyInfo.cs
index c044a7a..b8df56d 100644
--- a/Shared.Droid.HDLLinphone/Shared.Droid.HDLLinphone/Properties/AssemblyInfo.cs
+++ b/Shared.Droid.HDLLinphone/Shared.Droid.HDLLinphone/Properties/AssemblyInfo.cs
@@ -22,5 +22,5 @@
 //      Minor Version 
 //      Build Number
 //      Revision
-[assembly: AssemblyVersion("1.0.1.2")]
-[assembly: AssemblyFileVersion("1.0.1.2")]
+[assembly: AssemblyVersion("1.0.1.3")]
+[assembly: AssemblyFileVersion("1.0.1.3")]

--
Gitblit v1.8.0