New file |
| | |
| | | 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(); |
| | | } |
| | | } |
| | | } |