HDL Home App 第二版本 旧平台金堂用 正在使用
ZigbeeApp/GateWay.Droid/VideoActivity.cs
New file
@@ -0,0 +1,390 @@
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 { }
        }
        /// <summary>
        /// 弹出已挂断提示
        /// </summary>
        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();
        }
    }
}