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.IO; 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对讲 private string DeviceName = "";// 备注 /// /// 0:国内,1海外 /// 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 DeviceName = Intent.GetStringExtra("DeviceName"); 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"; } /// /// 初始化乐橙库 /// private void InitLCSDK() { InitParams initParams = new InitParams(this, URL, AccessToken); LCOpenSDK_Api.InitOpenApi(initParams); } /// /// 开始播放(预览) /// 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; } } /// /// 停止预览(停止播放画面) /// public void Stop() { mPlayWindow.StopRtspReal(true);//关闭视频 } /// /// 打开对讲 /// 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); } /// /// 关闭对讲 /// public void StopTalk() { LCOpenSDK_Talk.StopTalk(); LCOpenSDK_Talk.Listener = null; } /// /// 打开声音(预览的时候可以听到门口机传来的声音) /// /// public bool OpenAudio() { return mPlayWindow.PlayAudio() == 0; } /// /// 关闭声音(预览的时候关闭门口挤传来的声音,注意:打开对讲时需要先调用此方法关闭声音) /// /// public bool CloseAudio() { return mPlayWindow.StopAudio() == 0; } /// /// 开锁 /// public void Unlock() { // Dictionary dic = new Dictionary(); dic.Add("deviceId", this.DeviceId); dic.Add("callId", this.CallId); var requestJson = HttpUtil.GetSignRequestJson(dic); var revertObj = HttpUtil.RequestHttpsPostFroHome("/home-wisdom/platform/imou/openDoorbell", requestJson); if (revertObj.Code == StateCode.SUCCESS) { Toast.MakeText(this, Resources.GetString(Resource.String.unlock_success), ToastLength.Short).Show(); } else { Toast.MakeText(this, Resources.GetString(Resource.String.unlock_fail), ToastLength.Short).Show(); } } ///// ///// 发送广播,通知刷新图库的显示 ///// ///// //void SendBroadcastScanFile(Context context, string path) //{ // // 发送广播,通知刷新图库的显示 // Intent scanIntent = new Intent(Intent.ActionMediaScannerScanFile); // scanIntent.SetData(Android.Net.Uri.FromFile(new File(path))); // context.SendBroadcast(scanIntent); //} /// /// 截图 /// /// public void SnapShot(string path) { try { int code = mPlayWindow.SnapShot(path); if (code == 0) { //2021-09-01 增加发送广播,通知刷新图库的显示 HDLONUtils.SendBroadcastScanFile(this, path); //Android.Provider.MediaStore.Images.Media.InsertImage(this.getContentResolver(), path, "ss", "ss"); Toast.MakeText(this, Resources.GetString(Resource.String.screenshot_success), ToastLength.Short).Show(); } else { Toast.MakeText(this, Resources.GetString(Resource.String.screenshot_fail), ToastLength.Short).Show(); } } catch (System.Exception e) { string error = e.Message; } //运行到这,photoFile已经存在,这里需要获得这个文件的uri //* 分两种情况,android7.0以上和以下 // 先存入临时目录,然后再移动到相册目录中 //File photoFile = new File(path); //Android.Net.Uri photoUri; //if (Build.VERSION.SdkInt >= 24) //if (Build.VERSION.PreviewSdkInt >= 24) //{ // /** // * FileProvider.getUriForFile(),这个方法中需要填写三个参数, // * 第一个Context, // * 第二个S // * tring 任意 // * 第三个File // */ // photoUri = FileProvider.GetUriForFile(this, "HDL Video SnapShot", photoFile); //} //else //{ // photoUri = Android.Net.Uri.FromFile(photoFile); //} } private ContentResolver getContentResolver() { throw new NotImplementedException(); } /// /// 设置顶部状态栏背景透明 /// private void SetStatusBarColor() { Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds); Window.SetStatusBarColor(Color.Transparent); } /// /// 必要的一些权限 /// 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); } } } /// /// 点击事件 /// /// public void OnClick(View v) { if (v.Equals(ivBack)) { this.Finish(); } } protected override void OnDestroy() { base.OnDestroy(); Stop(); mPlayWindow.UninitPlayWindow();//销毁底层资源 } /// /// 对讲监听 /// class AudioTalkerListener : LCOpenSDK_TalkerListener { /// /// 对讲结果回调 /// /// /// 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, Resource.String.talk_open_failed, 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); } } } }