using System; using Android.App; using Android.Content.PM; using System.Threading; using Android.Content.Res; using Android.Graphics; using Android.OS; using Android.Runtime; using Android.Views; using Android.Widget; using Com.ETouchSky; using Com.Tool; using GateWay.Droid.FengLinVideo.Forms; using GateWay.Droid.FengLinVideo.widget; using Java.Text; using Java.Util; namespace GateWay.Droid { //注意: com.hdl.evoyohome ====》packcode=44492e5c51dda5e40862a4255396b741 包名是固定的,更改包名会导致可视对讲部分工作不正常 [Activity(Name = "com.hdl.home.wxapi.VideoActivity", WindowSoftInputMode = SoftInput.AdjustResize, LaunchMode = LaunchMode.SingleInstance, ConfigurationChanges = (ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden | ConfigChanges.LayoutDirection | ConfigChanges.Locale | ConfigChanges.Orientation | ConfigChanges.ScreenSize), Theme = "@style/MyTheme", ScreenOrientation = ScreenOrientation.Portrait)] public class VideoActivity : Android.App.Activity, View.IOnClickListener, ISurfaceHolderCallback, VideoPhoneJni.ICallBack,TipDiaglog.OnConfirmClickListener { private static Activity activity; private VideoPhone mPhone; private ISurfaceHolder mRemoteSurfaceHolder; private FrameLayout mRemoteFrameContainer; private SurfaceView mSurfaceRemote; private ImageView ivBack; private TextView tvName; private TextView tvRoomName; private MonitorFragment monitorFragment = null; private ReverseCallFragment reverseCallFragment = null; public string ESVideoUUID= "JJY000019VPLLF";//室外机UUID,例:JJY000007FSEYX f5f6fa public int ESRoomID = 0;//当前用户的房间 ID public string DeviceName;//室外机的名称,例,室外机 public string RoomName;//房间命名,例 8栋1单元0801 public bool IsCollect;//是否收藏 public int Tpye = 0;//类型,0 监控,1反呼 protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); try { activity = this; ESVideoUUID = Intent.GetStringExtra("ESVideoUUID");//室外机UUID,例:JJY000007FSEYX ESRoomID = Intent.GetIntExtra("ESRoomID", 0);//当前用户的房间 ID 101 DeviceName = Intent.GetStringExtra("DeviceName");//室外机的名称,例,室外机 RoomName = Intent.GetStringExtra("RoomName");//房间命名,例 8栋1单元0801 81 IsCollect = Intent.GetBooleanExtra("IsCollect", false);//是否收藏 Tpye = Intent.GetIntExtra("Type", 0);//类型,0 监控,1反呼 SetContentView(Resource.Layout.activity_video_phone); IniView(); IniData(); if (Tpye == 0) { Monitor(ESVideoUUID); //监控 monitorFragment = new MonitorFragment(mPhone); FragmentManager.BeginTransaction().Replace(Resource.Id.content, monitorFragment).Commit(); } else { string param = "address=" + ESVideoUUID + ",tag=mobile://123,"; reverseCallFragment = new ReverseCallFragment(mPhone, param); FragmentManager.BeginTransaction().Replace(Resource.Id.content, reverseCallFragment).Commit(); } } catch (Exception E) { var D=E.Message; } } //监控 private void Monitor(string address) { //监视功能 从平台拉取监视列表,调用此接口可以一台一台监视 if (mPhone != null) { string UserData = ""; //此参数 可以向门口机设备传递数据, //注意:RequestAudio 请求对方音频,RequestVideo请求对方视频 SendAudio发送本地音频 SendVideo 发送本地视频 一般门口不接收到视频,所以最好设置0,减少流量消耗 string param = "SendAudio=0\r\n" + "SendVideo=0\r\n" + "RequestAudio=0\r\n" + "RequestVideo=0\r\n" + "UserData=" + UserData + "\r\n"; mPhone.Monitor(address, param); } } private void IniView() { mRemoteFrameContainer = (FrameLayout)FindViewById(Resource.Id.remoteFrame); ivBack = (ImageView)FindViewById(Resource.Id.icon_back); tvName = (TextView)FindViewById(Resource.Id.tv_name); tvRoomName = (TextView)FindViewById(Resource.Id.tv_roomName); tvRoomName.SetText(RoomName, null); tvName.SetText(DeviceName, null); ivBack.SetOnClickListener(this); } private void IniData() { try { if (mPhone == null) { string _params = "port=8554\r\n" + "packcode=cd89ae3460c8f396c748bb7d2668dfd0\r\n"; //初始化对讲端口,默认就好,跟门口机设置要匹配,注意新接口需要增加packcode参数,需要把你们的包名发过来 mPhone = new VideoPhone(this, this, _params); if (mRemoteSurfaceHolder != null) { mPhone.SetRemoteSurfaceHolder(mRemoteSurfaceHolder, "mRemoteSurfaceHolder!=null"); //设置来电窗口 } ViewGroup v = (ViewGroup)FindViewById(Resource.Id.localVideo); mPhone.SetLocalVideoContainer(v);//设置本地视频窗口,一定要调用,不然后会出现没声音 } else { mPhone.StopStream(); mPhone.Release(); mPhone = null; } } catch (Exception e) { string error = e.Message; } } protected override void OnResume() { base.OnResume(); if (mPhone != null) { mPhone.OnActivityResume(); } } protected override void OnPause() { base.OnPause(); if (mPhone != null) { //mPhone.OnActivityPause(); } } protected override void OnDestroy() { base.OnDestroy(); if (mPhone != null) { mPhone.HangUp(); mPhone.Release(); mPhone = null; //mPhone.OnActivityDestroy(); } } public override void OnBackPressed() { if (mPhone != null) mPhone.HangUp(); else Finish(); } public void OnClick(View v) { if (v.Equals(ivBack)) { if (mPhone != null) mPhone.HangUp(); else Finish(); } } //不能用View.INVISIBLE来完全隐藏,否则MediaCodec.configure会报ava.lang.IllegalArgumentException: The surface has been released //[Obsolete] private void showRemoteVideo() { try { if (mSurfaceRemote != null) { return; } mSurfaceRemote = new SurfaceView(this, null); ISurfaceHolder holder = mSurfaceRemote.Holder; holder.AddCallback(this);//ISurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS holder.SetType(SurfaceType.PushBuffers); //发现第一次show时会闪屏一下,后面hide再show时不会闪屏 FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent); //v.setId(View.generateViewId()); mSurfaceRemote.LayoutParameters = lp; mRemoteFrameContainer.AddView(mSurfaceRemote); } catch { } } private void hideRemoteVideo() { try { if (mSurfaceRemote != null) { mRemoteFrameContainer.RemoveView(mSurfaceRemote); mSurfaceRemote = null; } } catch { } } /// /// 弹出已挂断提示 /// private void showTipDialog(string title, string text, string btnText,bool isClose) { try { TipDiaglog diaglog = new TipDiaglog(this); diaglog.SetAutoClose(isClose); diaglog.SetTitleText(title);//"提示" diaglog.SetContentText(text);//"已挂断" diaglog.SetConfirmText(btnText);//"确认" diaglog.SetCanceledOnTouchOutside(false); diaglog.Show(); diaglog.Create(); diaglog.SetConfirmClickListener(this); } catch (Exception e) { string ss = e.Message; } } public void SurfaceChanged(ISurfaceHolder holder, [GeneratedEnum] Format format, int width, int height) { mRemoteSurfaceHolder = holder; if (mPhone != null) { mPhone.SetRemoteSurfaceHolder(holder, "surfaceChanged"); } } public void SurfaceCreated(ISurfaceHolder holder) { mRemoteSurfaceHolder = holder; if (mPhone != null) { mPhone.SetRemoteSurfaceHolder(holder, "surfaceCreated"); } } public void SurfaceDestroyed(ISurfaceHolder holder) { mRemoteSurfaceHolder = null; if (mPhone != null) { mPhone.SetRemoteSurfaceHolder(null, "surfaceDestroyed"); } } //由于android框架限制,要满足如下条件才能开流:activity要在前台,并且surfaceview可用 private void startStream(String reason) { if (mPhone != null) { try { //开流之前可配置视频尺寸,码率,帧率 针对的是本地 //mPhone.SetVideoSize(640, 480);//1920x1080,1280x720,640x480 //mPhone.SetBps(1.5 * 1024 * 1024); //mPhone.SetFps(30); mPhone.StartStream(); } catch (Exception e) { string ss = e.Message; } } } //[Obsolete] public void OnPhoneEvent(string msg) { try { if (monitorFragment != null) { monitorFragment.onPhoneEvent(msg); } if (reverseCallFragment != null) { reverseCallFragment.onPhoneEvent(msg); } TextProtocol tp = new TextProtocol(); tp.Parse(msg); string event1 = tp.GetString("event"); switch (event1) { case "EVT_Ringing": mPhone.RequestCallerSendVideo(); showRemoteVideo(); break; case "EVT_Connected": if (!mPhone.IsStreamRunning) { //由于android框架限制,要满足如下条件才能开流: activity要在前台,并且surfaceview可用 startStream("EVT_Connected"); } showRemoteVideo(); break; case "EVT_StartStream": startStream("EVT_StreamStream"); break; case "EVT_StopStream": mPhone.StopStream(); break; case "EVT_MonitorConnected": if (!mPhone.IsStreamRunning) { startStream("EVT_MonitorConnected"); } showRemoteVideo(); break; case "EVT_HangUp": hideRemoteVideo(); if (mPhone != null) { mPhone.StopStream(); } showTipDialog("提示", "已挂断", "确认", true); break; case "EVT_RECV_CUSTOM_DATA": string data = tp.GetString("data"); //updataUnlockState(); break; case "EVT_SnapAck": int error = tp.GetInt("error"); string filePath = tp.GetString("filePath"); if (error == 0) { showTipDialog("提示", "抓图成功", "确认", false); } else { showTipDialog("提示", "抓图失败\n\r" + error, "确认", false); } break; } } catch (Exception e) { string error = e.Message; } } public void OnRecvAudioFrame(byte[] p0) { //throw new NotImplementedException(); } public void OnRecvVideoFrame(byte[] p0) { //throw new NotImplementedException(); } public void onSureClick(TipDiaglog dialoog, View v, bool bol) { dialoog.Dismiss(); if (bol) this.Finish(); } } }