lss
2021-04-22 fea52e269bd5ba6a69f421f48d6eaddfb86ad00f
2021-04-22
13个文件已添加
769 ■■■■■ 已修改文件
DLL/LC/Android/LC_SDK.dll 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/LeChengVideo/Form/MonitorFragment.cs 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/LeChengVideo/Form/ReverseCallFragment.cs 317 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/LeChengVideoActivity.cs 304 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/libs/armeabi-v7a/libGMCrypto.so 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/libs/armeabi-v7a/libLCOpenApiClient.so 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/libs/armeabi-v7a/libLechangeSDK.so 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/libs/armeabi-v7a/libSmartConfig.so 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/libs/armeabi-v7a/libSoftAPConfig.so 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/libs/armeabi-v7a/libconfigsdk.so 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/libs/armeabi-v7a/libgnustl_shared.so 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/libs/armeabi-v7a/libjninetsdk.so 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/libs/armeabi-v7a/libnetsdk.so 补丁 | 查看 | 原始文档 | blame | 历史
DLL/LC/Android/LC_SDK.dll
Binary files differ
HDL-ON_Android/LeChengVideo/Form/MonitorFragment.cs
New file
@@ -0,0 +1,148 @@

using System.Threading;
using Android.App;
using Android.Icu.Text;
using Android.OS;
using Android.Views;
using Android.Widget;
using Java.Util;
namespace HDL_ON_Android.LeChengView.Form
{
    public class MonitorFragment : Fragment, View.IOnClickListener
    {
        private View mView;
        // 截图
        private LinearLayout screenshotLayout;
        private ImageView screenImage;
        private TextView ScreenText;
        //开锁
        private LinearLayout unlockLayout;
        private ImageView unlockImag;
        private TextView unlockText;
        // 更新线程
        private Thread thread = null;
        private LeChengVideoActivity CurtActivity;
        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            CurtActivity = (LeChengVideoActivity)this.Activity;
        }
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            mView = inflater.Inflate(Resource.Layout.fragment_monitor, container, false);
            IniView();
            CurtActivity.Play();
            CurtActivity.OpenAudio();
            return mView;
        }
        private void IniView()
        {
            screenshotLayout = (LinearLayout)mView.FindViewById(Resource.Id.icon_sceenshotLayout);
            screenImage = (ImageView)mView.FindViewById(Resource.Id.icon_sceenshotImg);
            ScreenText = (TextView)mView.FindViewById(Resource.Id.icon_sceenshotText);
            unlockLayout = (LinearLayout)mView.FindViewById(Resource.Id.icon_unlockLayout);
            unlockImag = (ImageView)mView.FindViewById(Resource.Id.icon_unlockImg);
            unlockText = (TextView)mView.FindViewById(Resource.Id.icon_unlockText);
            unlockLayout.SetOnClickListener(this);
            screenshotLayout.SetOnClickListener(this);
        }
        /// <summary>
        /// 开锁
        /// </summary>
        private void Unlock()
        {
            //
        }
        /// <summary>
        /// 更新开锁按钮状态
        /// </summary>
        private void UpdataUnlockState()
        {
            try
            {
                //开锁成功,15秒内不给再点击按钮
                unlockLayout.Enabled = false;
                if (thread != null)
                {
                    try
                    {
                        thread.Interrupt();
                    }
                    catch { }
                    thread = null;
                }
                thread = new Thread(() =>
                {
                    try
                    {
                        Thread.Sleep(15 * 1000);
                        Activity.RunOnUiThread(() =>
                        {
                            if (unlockLayout != null)
                                unlockLayout.Enabled = true;
                        });
                    }
                    catch { }
                });
                thread.Start();
            }
            catch { }
        }
        public void OnClick(View v)
        {
            //
            if (v.Equals(unlockLayout))
            {
                //开锁
            }
            else if (v.Equals(screenshotLayout))
            {
                //有视频过来可调用此接口进行拍照
                // 内部储存/DCIM/Camera/.....jpg
                screenImage.Selected = true;
                SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
                string time = format.Format(new Date(SystemClock.CurrentThreadTimeMillis()));
                string ss = Android.OS.Environment.ExternalStorageDirectory.Path + "/DCIM/Camera";
                string path = ss + "/" + time + ".jpg";
            }
        }
        public override void OnDestroy()
        {
            base.OnDestroy();
            if (thread != null)
            {
                try
                {
                    thread.Interrupt();
                }
                catch { }
                thread = null;
            }
        }
    }
}
HDL-ON_Android/LeChengVideo/Form/ReverseCallFragment.cs
New file
@@ -0,0 +1,317 @@

using System;
using System.Collections.Generic;
using System.Threading;
using Android.App;
using Android.Icu.Text;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using HDL_ON.Common;
using HDL_ON.DAL.Server;
using Java.Util;
namespace HDL_ON_Android.LeChengView.Form
{
    public class ReverseCallFragment : Fragment, View.IOnClickListener
    {
        private View mView;
        private ImageView screenshotImg;// 截图
        private ImageView unlockImg;// 开锁
        private LinearLayout answerLayout; // 接听
        private ImageView hangupImg;// 挂断
        private ImageView answerImg;// 接听
        private TextView hangupText;
        private TextView tvTip;
        private System.Threading.Timer timer = null;
        private int Time = 0;
        private static LeChengVideoActivity CurtActivity;
        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            CurtActivity = (LeChengVideoActivity)this.Activity;
        }
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            mView = inflater.Inflate(Resource.Layout.fragment_call, container, false);
            IniView();
            CurtActivity.Play();
            CurtActivity.CloseAudio();
            return mView;
        }
        private void IniView()
        {
            screenshotImg = (ImageView)mView.FindViewById(Resource.Id.callScreenshotImg);//
            unlockImg = (ImageView)mView.FindViewById(Resource.Id.callUnlockImg);//
            tvTip = (TextView)mView.FindViewById(Resource.Id.callTipText);
            answerLayout = (LinearLayout)mView.FindViewById(Resource.Id.callAnswerLayout);
            hangupImg = (ImageView)mView.FindViewById(Resource.Id.callHangupImg);
            answerImg = (ImageView)mView.FindViewById(Resource.Id.callAnswerImg);
            hangupText = (TextView)mView.FindViewById(Resource.Id.callHangupText);
            screenshotImg.SetOnClickListener(this);
            unlockImg.SetOnClickListener(this);
            hangupImg.SetOnClickListener(this);
            answerImg.SetOnClickListener(this);
            hangupText.SetText(GetString(Resource.String.video_not_answer), null);
            tvTip.SetText(GetString(Resource.String.calling), null);
        }
        /// <summary>
        /// 开锁
        /// </summary>
        private void PostUnlock()
        {
            //开锁,当收到来电信息时可进行开锁操作
            new Thread(() =>
            {
                try
                {
                    Dictionary<string, object> d = new Dictionary<string, object>();
                    d.Add("deviceId", CurtActivity.DeviceId);//设备id
                    string jsonString = HttpUtil.GetSignRequestJson(d);
                    string url = "/home-wisdom/platform/imou/openDoorbell";
                    ResponsePackNew response = HttpUtil.RequestHttpsPost(url, jsonString);
                    Log.Info("LcVideo", "Post Unlock Response code=" + response.Code);
                }
                catch { }
            }).Start();
        }
        /// <summary>
        /// 更新开锁按钮状态,开锁成功,15秒内不给再点击按钮
        /// </summary>
        private void UpdataUnlockState()
        {
            try
            {
                if (unlockImg == null) return;
                unlockImg.Enabled = false;
                new Thread(() =>
                {
                    Thread.Sleep(15 * 1000);
                    Activity.RunOnUiThread(() =>
                    {
                        if (unlockImg != null)
                            unlockImg.Enabled = true;
                    });
                }).Start();
            }
            catch { }
        }
        private string GetTime(int time)
        {
            int m = time / 60;
            int s = time % 60;
            return UnitFormat(m) + ":" + UnitFormat(s);
        }
        private static string UnitFormat(int i)
        {
            string retStr = null;
            if (i >= 0 && i < 10)
                retStr = "0" + i;
            else
                retStr = "" + i;
            return retStr;
        }
        /// <summary>
        /// 通话记录计时器,从拉流成功开始计算时间
        /// </summary>
        public void TimeStarts()
        {
            try
            {
                if (timer != null)
                    timer.Dispose();
                TimerCallback timerCallback = new TimerCallback(Tick);
                timer = new System.Threading.Timer(timerCallback, null, 0, 1000);
            }
            catch (Exception) { }
        }
        public void TimeEnd()
        {
            Time = 0;
            if (timer != null)
            {
                timer.Dispose();
                timer = null;
            }
        }
        public void Tick(object state)
        {
            try
            {
                Activity.RunOnUiThread(() =>
                {
                    try
                    {
                        Time++;
                        if (tvTip != null)
                            tvTip.SetText(GetTime(Time), null);
                    }
                    catch { }
                });
            }
            catch { }
        }
        public void OnClick(View v)
        {
            if (v.Equals(answerImg))
            {
                //接收来电
                CurtActivity.StartTalk();
                answerLayout.Visibility = ViewStates.Gone;
                PostAnswer();
            }
            else if (v.Equals(hangupImg))
            {
                CurtActivity.StopTalk();
                PostHangup();
                TimeEnd();
                Activity.Finish();
            }
            else if (v.Equals(screenshotImg))
            {
                //有视频过来可调用此接口进行拍照
            }
            else if (v.Equals(unlockImg))
            {
                PostUnlock();
            }
        }
        /// <summary>
        /// post 截图
        /// </summary>
        /// <param name="path">截图保留的路径</param>
        private void PostScreenshot(string path)
        {
            new Thread(() =>
            {
                try
                {
                    string[] str = path.Split("/");
                    string img_name = str.GetValue(str.Length - 1).ToString().Replace(".jpg", "");
                    byte[] images = FileUtlis.Files.ReadFileForPath(path);
                    Dictionary<string, object> d = new Dictionary<string, object>();
                    d.Add("callId", VideoActivity.CallId);
                    d.Add("images", images);
                    d.Add("imagesName", img_name);
                    string jsonString = HttpUtil.GetSignRequestJson(d);
                    string url = "/home-wisdom/app/fl/vi/screenshot";
                    ResponsePackNew response = HttpUtil.RequestHttpsPost(url, jsonString);
                    Log.Info("LcVideo", "Post Screenshot Response code=" + response.Code);
                }
                catch { }
            }).Start();
        }
        /// <summary>
        /// post 接听电话记录
        /// </summary>
        public void PostAnswer()
        {
            new Thread(() =>
            {
                try
                {
                    Dictionary<string, object> d = new Dictionary<string, object>();
                    d.Add("callId", CurtActivity.CallId);//呼叫id
                    d.Add("callStatus", "RECEIVED");//可用值:MISSED,RECEIVED,REJECT
                    // d.Add("callDuration", Time);//通话时长(秒)
                    d.Add("interphoneTypeEnum", "IMOUVISIAL");//可用值:FLVI,IMOUVISIAL
                    string jsonString = HttpUtil.GetSignRequestJson(d);
                    string url = "/home-wisdom/platform/imou/updateCallStatus";
                    ResponsePackNew response = HttpUtil.RequestHttpsPost(url, jsonString);
                    Log.Info("LcVideo", "Post Answer Response code=" + response.Code);
                }
                catch { }
            }).Start();
        }
        /// <summary>
        /// post 挂断电话记录
        /// </summary>
        public void PostHangup()
        {
            new Thread(() =>
            {
                try
                {
                    Dictionary<string, object> d = new Dictionary<string, object>();
                    d.Add("callId", CurtActivity.CallId);//呼叫id
                    //d.Add("callStatus", "REJECT");//可用值:MISSED,RECEIVED,REJECT
                    d.Add("callDuration", Time);//通话时长(秒)
                    d.Add("interphoneTypeEnum", "IMOUVISIAL");//可用值:FLVI,IMOUVISIAL
                    string jsonString = HttpUtil.GetSignRequestJson(d);
                    string url = "/home-wisdom/platform/imou/updateCallStatus";
                    ResponsePackNew response = HttpUtil.RequestHttpsPost(url, jsonString);
                    Log.Info("LcVideo", "Post Hangup Response code=" + response.Code);
                }
                catch { }
            }).Start();
        }
        /// <summary>
        /// post 拒接记录,仅只有在正常挂断状态下才提交通话时间
        /// </summary>
        public void PostReject()
        {
            new Thread(() =>
            {
                try
                {
                    Dictionary<string, object> d = new Dictionary<string, object>();
                    d.Add("callId", CurtActivity.CallId);//呼叫id
                    d.Add("callStatus", "REJECT");//可用值:MISSED,RECEIVED,REJECT
                    string jsonString = HttpUtil.GetSignRequestJson(d);
                    string url = "/home-wisdom/platform/imou/updateCallStatus";
                    ResponsePackNew response = HttpUtil.RequestHttpsPost(url, jsonString);
                    Log.Info("LcVideo", "Post Reject Response code=" + response.Code);
                }
                catch { }
            }).Start();
        }
    }
}
HDL-ON_Android/LeChengVideoActivity.cs
New file
@@ -0,0 +1,304 @@

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Graphics;
using Android.OS;
using Android.Runtime;
using Android.Support.V4.App;
using Android.Support.V4.Content;
using Android.Util;
using Android.Views;
using Android.Widget;
using Com.Lechange.Opensdk.Api;
using Com.Lechange.Opensdk.Device;
using Com.Lechange.Opensdk.Listener;
using Com.Lechange.Opensdk.Media;
using HDL_ON.DAL.Server;
using HDL_ON_Android.LeChengView.Form;
using Java.Lang;
namespace HDL_ON_Android
{
    [Activity(Label = "LeChengVideoActivity", WindowSoftInputMode = SoftInput.AdjustResize, LaunchMode = LaunchMode.SingleInstance, ConfigurationChanges = (ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden | ConfigChanges.LayoutDirection | ConfigChanges.Locale | ConfigChanges.Orientation | ConfigChanges.ScreenSize), Theme = "@style/MyTheme1", ScreenOrientation = ScreenOrientation.Portrait)]
    public class LeChengVideoActivity : Activity, View.IOnClickListener
    {
        private static LeChengVideoActivity CurtActivity;
        //
        private string URL = "openapi.easy4ip.com:443";
        public string AccessToken = "";
        public string DeviceId = "";
        public string Psk = "";
        public string PlayToken = "";//播放playToken
        public string CallId = "";//呼叫Id
        private int Type = 0;//0监控,1对讲
        /// <summary>
        /// 0:国内,1海外
        /// </summary>
        private int Location = 0;
        private FrameLayout flWindow;
        private FrameLayout flWindowContent;
        private ImageView ivBack;
        private TextView tvName;
        private MonitorFragment monitorFragment = null;
        private ReverseCallFragment reverseCallFragment = null;
        public LCOpenSDK_PlayWindow mPlayWindow;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.activity_video_phone);
            CurtActivity = this;
            AccessToken = Intent.GetStringExtra("AccessToken");//"St_0000d307a13c965c4db285469484490e"
            DeviceId = Intent.GetStringExtra("DeviceId");//6K056CFAAJ8FFA1
            Psk = Intent.GetStringExtra("Psk");//6K056CFAAJ8FFA1
            PlayToken = Intent.GetStringExtra("PlayToken"); // 播放playToken//"8a5e041afa674a2ba3e84d90a54ea962"
            Type = Intent.GetIntExtra("Type", 0);//0监控,1对讲//1
            Location = Intent.GetIntExtra("Location", 0);//1
            CallId = Intent.GetStringExtra("callId");//1384766990812426242
            InitLCSDK();
            IniView();
            IniData();
            Permissions();
            if (Type == 0)
            {
                monitorFragment = new MonitorFragment();
                FragmentManager.BeginTransaction().Replace(Resource.Id.content, monitorFragment).Commit();
            }
            else
            {
                reverseCallFragment = new ReverseCallFragment();
                FragmentManager.BeginTransaction().Replace(Resource.Id.content, reverseCallFragment).Commit();
            }
        }
        private void IniView()
        {
            //
            flWindowContent = (FrameLayout)FindViewById(Resource.Id.remoteFrame);
            flWindow = (FrameLayout)FindViewById(Resource.Id.live_window);
            ivBack = (ImageView)FindViewById(Resource.Id.videoBackImg);
            tvName = (TextView)FindViewById(Resource.Id.nameText);
            tvName.SetText("DeviceName", null);
            ivBack.SetOnClickListener(this);
        }
        private void IniData()
        {
            //
            //SetStatusBarColor();// 这里设计的TopBarColor是白色,与系统导航栏字体颜色一直,暂时屏蔽不用
            mPlayWindow = new LCOpenSDK_PlayWindow();
            mPlayWindow.InitPlayWindow(this, flWindowContent, 0, true);
            //if (Location == 1)
                URL = "openapi.easy4ip.com:443";
        }
        /// <summary>
        ///  初始化乐橙库
        /// </summary>
        private void InitLCSDK()
        {
            InitParams initParams = new InitParams(this, URL, AccessToken);
            LCOpenSDK_Api.InitOpenApi(initParams);
        }
        /// <summary>
        /// 开始播放(预览)
        /// </summary>
        public void Play()
        {
            try
            {
                LCOpenSDK_ParamReal paramReal = new LCOpenSDK_ParamReal(AccessToken, DeviceId, 0, Psk, PlayToken, 1, false, true);
                mPlayWindow.PlayRtspReal(paramReal);
            }
            catch (System.Exception e)
            {
                string sss = e.Message;
            }
        }
        /// <summary>
        /// 停止预览(停止播放画面)
        /// </summary>
        public void Stop()
        {
            mPlayWindow.StopRtspReal(true);//关闭视频
        }
        /// <summary>
        /// 打开对讲
        /// </summary>
        public void StartTalk()
        {
            CloseAudio();// 关闭Audio
            LCOpenSDK_Talk.Listener = new AudioTalkerListener();//设置对讲监听
            // 对讲参数
            LCOpenSDK_ParamTalk paramTalk = new LCOpenSDK_ParamTalk(AccessToken, DeviceId, -1, Psk, PlayToken, true);
            LCOpenSDK_Talk.PlayTalk(paramTalk);
        }
        /// <summary>
        /// 关闭对讲
        /// </summary>
        public void StopTalk()
        {
            LCOpenSDK_Talk.StopTalk();
            LCOpenSDK_Talk.Listener = null;
        }
        /// <summary>
        /// 打开声音(预览的时候可以听到门口机传来的声音)
        /// </summary>
        /// <returns></returns>
        public bool OpenAudio()
        {
            return mPlayWindow.PlayAudio() == 0;
        }
        /// <summary>
        /// 关闭声音(预览的时候关闭门口挤传来的声音,注意:打开对讲时需要先调用此方法关闭声音)
        /// </summary>
        /// <returns></returns>
        public bool CloseAudio()
        {
            return mPlayWindow.StopAudio() == 0;
        }
        /// <summary>
        /// 设置顶部状态栏背景透明
        /// </summary>
        private void SetStatusBarColor()
        {
            Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
            Window.SetStatusBarColor(Color.Transparent);
        }
        /// <summary>
        /// 必要的一些权限
        /// </summary>
        private void Permissions()
        {
            string[] mPermissionList = new string[]
            {
                Manifest.Permission.WriteExternalStorage,
                Manifest.Permission.ReadExternalStorage,
                Manifest.Permission.Camera,
                Manifest.Permission.RecordAudio
            };
            foreach (string permissions in mPermissionList)
            {
                if (ContextCompat.CheckSelfPermission(this, permissions) != 0)
                {
                    ActivityCompat.RequestPermissions(this, new string[] { permissions }, 1);
                }
            }
        }
        /// <summary>
        /// 点击事件
        /// </summary>
        /// <param name="v"></param>
        public void OnClick(View v)
        {
            if (v.Equals(ivBack))
            {
                this.Finish();
            }
        }
        protected override void OnDestroy()
        {
            base.OnDestroy();
            Stop();
            mPlayWindow.UninitPlayWindow();//销毁底层资源
        }
        /// <summary>
        /// 对讲监听
        /// </summary>
        class AudioTalkerListener : LCOpenSDK_TalkerListener
        {
            /// <summary>
            /// 对讲结果回调
            /// </summary>
            /// <param name="error"></param>
            /// <param name="type"></param>
            public override void OnTalkResult(string error, int type)
            {
                base.OnTalkResult(error, type);
                try
                {
                    bool talkResult = false;
                    if (type == 99 || error.Equals("-1000") || error.Equals("0") || error.Equals("1") || error.Equals("3"))
                    {
                        talkResult = false;
                    }
                    else if (error.Equals("4"))
                    {
                        talkResult = true;
                    }
                    if (!talkResult)
                    {
                        // 提示对讲打开失败
                        CurtActivity.StopTalk();
                        CurtActivity.RunOnUiThread(() =>
                        {
                            Toast.MakeText(CurtActivity, "打开对讲失败", ToastLength.Short).Show();
                        });
                    }
                    else
                    {
                        CurtActivity.reverseCallFragment.PostAnswer();// post接听电话,给云端做记录
                        CurtActivity.reverseCallFragment.TimeStarts();//接通成功打开计时器
                    }
                }
                catch { }
            }
            public override void OnTalkPlayReady()
            {
                base.OnTalkPlayReady();
            }
            public override void OnAudioReceive(byte[] bytes, int p1, int p2, int p3, int p4)
            {
                base.OnAudioReceive(bytes, p1, p2, p3, p4);
            }
            public override void OnAudioRecord(byte[] bytes, int p1, int p2, int p3, int p4)
            {
                base.OnAudioRecord(bytes, p1, p2, p3, p4);
            }
            public override void OnDataLength(int i)
            {
                base.OnDataLength(i);
            }
        }
    }
}
HDL-ON_Android/libs/armeabi-v7a/libGMCrypto.so
Binary files differ
HDL-ON_Android/libs/armeabi-v7a/libLCOpenApiClient.so
Binary files differ
HDL-ON_Android/libs/armeabi-v7a/libLechangeSDK.so
Binary files differ
HDL-ON_Android/libs/armeabi-v7a/libSmartConfig.so
Binary files differ
HDL-ON_Android/libs/armeabi-v7a/libSoftAPConfig.so
Binary files differ
HDL-ON_Android/libs/armeabi-v7a/libconfigsdk.so
Binary files differ
HDL-ON_Android/libs/armeabi-v7a/libgnustl_shared.so
Binary files differ
HDL-ON_Android/libs/armeabi-v7a/libjninetsdk.so
Binary files differ
HDL-ON_Android/libs/armeabi-v7a/libnetsdk.so
Binary files differ