DLL/LC/Android/LC_SDK.dll | 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL-ON_Android/LeChengVideo/Form/MonitorFragment.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL-ON_Android/LeChengVideo/Form/ReverseCallFragment.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL-ON_Android/LeChengVideoActivity.cs | ●●●●● 补丁 | 查看 | 原始文档 | 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.dllBinary 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.soBinary files differ
HDL-ON_Android/libs/armeabi-v7a/libLCOpenApiClient.soBinary files differ
HDL-ON_Android/libs/armeabi-v7a/libLechangeSDK.soBinary files differ
HDL-ON_Android/libs/armeabi-v7a/libSmartConfig.soBinary files differ
HDL-ON_Android/libs/armeabi-v7a/libSoftAPConfig.soBinary files differ
HDL-ON_Android/libs/armeabi-v7a/libconfigsdk.soBinary files differ
HDL-ON_Android/libs/armeabi-v7a/libgnustl_shared.soBinary files differ
HDL-ON_Android/libs/armeabi-v7a/libjninetsdk.soBinary files differ
HDL-ON_Android/libs/armeabi-v7a/libnetsdk.soBinary files differ