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