当前位置: 首页 > news >正文

做的网站提示不安全问题深圳网络推广代运营

做的网站提示不安全问题,深圳网络推广代运营,wordpress访问文件夹,手机如何注册wordpress在人际互动的手机APP中,增加语音视频聊天功能是一个常见的需求。而现在,更进一步,在某些场景下,我们需要能将自己的手机屏幕分享给他人,或者是观看他人的手机屏幕。那么,这些常见的功能是如何实现的了&…

在人际互动的手机APP中,增加语音视频聊天功能是一个常见的需求。而现在,更进一步,在某些场景下,我们需要能将自己的手机屏幕分享给他人,或者是观看他人的手机屏幕。那么,这些常见的功能是如何实现的了?

我分享一个安卓版的Demo供大家参考。
一.功能介绍
1. 视频聊天

(1)每个登录的用户都可向其他任意在线用户发送视频聊天请求。

(2)当收到来自其他在线用户的视频聊天邀请时,可接受或拒绝对方的请求。

(3)当接受其他在线用户的视频聊天邀请时,就启动视频聊天。

2.屏幕分享

(1)每个登录的用户都可向其他任意在线用户发送屏幕分享请求;当对方未响应时,可主动取消屏幕分享请求。

(2)当收到来自其他在线用户请求屏幕分享时,可接受或拒绝对方的请求。

(3)当发送方收到其他在线用户同意屏幕分享时,即可观看其屏幕

(4)被控端和主控端都可主动断开屏幕分享。

二.开发环境

1.开发工具:

Android Studio 4.0

2.开发语言:

JAVA

3.主要框架:

Netty 、OMCS

三.具体实现

类似视频聊天或屏幕分享这样的功能,一般是C/S架构的。在这种应用中,服务端相对简单,其主要是在客户端之间转发消息。本Demo提供了一个非常简易的C#服务端(开发环境:VS 2022),直接运行起来即可。下面我们将主要介绍安卓端的实现。

大家可以从文末下载安卓端的源码,在阅读本文时对照源码,就会更清楚些。
首先,我们先要确定客户端之间相互通信的消息类型。

1.自定义消息类型 InformationTypes

public class InformationTypes {/// <summary>/// 视频请求 0/// </summary>public static final int VideoRequest = 0;/// <summary>/// 回复视频请求的结果 1/// </summary>public static final int VideoResult = 1;/// <summary>/// 通知对方 挂断 视频连接 2/// </summary>public static final int CloseVideo = 2;/// <summary>/// 通知好友 网络原因,导致 视频中断 3/// </summary>public static final int NetReasonCloseVideo = 3;/// <summary>/// 通知对方(忙线中) 挂断 视频连接 4/// </summary>public static final int BusyLine = 4;/// <summary>/// 屏幕分享请求 5/// </summary>public static final int DesktopRequest = 5;/// <summary>/// 回复屏幕分享请求的结果 6/// </summary>public static final int DesktopResult = 6;/// <summary>///  主动取消屏幕分享请求/// </summary>public static final int CancelDesktop = 7;/// <summary>///  对方(主人端)主动断开屏幕分享/// </summary>public static final int OwnerCloseDesktop = 8;/// <summary>/// 客人端断开屏幕分享/// </summary>public static final int GuestCloseDesktop = 9;
}

 

这里我们定义了为了实现第一部分“功能介绍”中的功能,所需要用到的消息类型。

2. 获取安卓系统权限

在安卓上进行视频聊天和屏幕分享,APP需要向安卓系统申请3个权限:麦克风、摄像头、屏幕录制。

(1)获取相机、麦克风、存储权限

private void getPermission() {List<PermissionItem> permissionItems = new ArrayList<PermissionItem>();permissionItems.add(new PermissionItem(Manifest.permission.CAMERA, "相机", R.drawable.permission_ic_camera));permissionItems.add(new PermissionItem(Manifest.permission.RECORD_AUDIO, "麦克风", R.drawable.permission_ic_micro_phone));permissionItems.add(new PermissionItem(Manifest.permission.WRITE_EXTERNAL_STORAGE, "存储", R.drawable.permission_ic_storage));permissionItems.add(new PermissionItem(Manifest.permission.READ_EXTERNAL_STORAGE, "", 0));try {HiPermission.create(LoginActivity.this).title("欢迎访问" + getString(R.string.app_name)).permissions(permissionItems).checkMutiPermission(new PermissionCallback() {String TAG = getString(R.string.app_name);@Overridepublic void onClose() {Log.i(TAG, "onClose");}@Overridepublic void onFinish() {Log.i(TAG, "onFinish");}@Overridepublic void onDeny(String permission, int position) {Log.i(TAG, "onDeny- permission:" + permission + "   position:" + position);}@Overridepublic void onGuarantee(String permission, int position) {Log.i(TAG, "onGuarantee");}});} catch (Exception ex) {ex.printStackTrace();}}

 

当安卓手机首次进入该Demo时, 将弹窗提示获取设备权限:


注:若禁止了这两个权限,后续就无法进行正常的视频聊天了!

(2)屏幕录制权限

CameraSurfaceView2 myView = null;
MultimediaManagerFactory.GetSingleton().getAudioMessageController().dispose();
AndroidUtil.OpenSpeaker(this);
try {MultimediaManagerFactory.GetSingleton().openCamera();
} catch (Exception e) {e.printStackTrace();
}
this.tv_nick = (TextView) findViewById(R.id.tv_nick);
myView = (CameraSurfaceView2) findViewById(R.id.local_surface);
myView.setSurfaceEventLister(new CameraSurfaceView2.SurfaceEventLister() {@Overridepublic void surfaceCreated(SurfaceHolder surfaceHolder) {setShowPreviewHolder(surfaceHolder);}
});
myView.setZOrderOnTop(true);
MultimediaManagerFactory.GetSingleton().setCameraDeviceIndex(1);//设置为前置摄像头
//设置摄像头打开成功回调函数
MultimediaManagerFactory.GetSingleton().setCameraOpenCallBack(this);
if (StringHelper.isNullOrEmpty(userId)) {isSender = true;//我向对方发起视频userId = getIntent().getStringExtra(TalkingID);if (StringHelper.isNullOrEmpty(userId)) {tv_nick.setText("未知requestID");} else {ll_to_callLayout.setVisibility(View.VISIBLE);coming_callLayout.setVisibility(View.GONE);hangup.setVisibility(View.VISIBLE);MainActivity.getInstance().sendMediaCommunicate(userId, CommunicateType.Request);tv_tips.setText("正在等待对方接受邀请");}
}

4. 回复对方视频请求

当收到对方的视频聊天邀请时,将进入视频预览页面,显示视频邀请。

当点击“接听”或“挂断”按钮时,就会发送视频聊天回复消息:

//接听
answer.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {MainActivity.getInstance().stopRingForCalling();coming_callLayout.setVisibility(View.GONE);ll_to_callLayout.setVisibility(View.VISIBLE);openConnector();MainActivity.getInstance().sendMediaCommunicate(userId, CommunicateType.Agree);} catch (Exception ex) {ex.printStackTrace();}}
});
//拒绝
refuse.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {MainActivity.getInstance().sendMediaCommunicate(userId, CommunicateType.Reject);MainActivity.getInstance().stopRingForCalling();finish();} catch (Exception ex) {ex.printStackTrace();}}
});

 

5. 相互连接对方的摄像头、麦克风

当对方回复同意时,自己和对方将相互连接到对方的麦克风和摄像头。

private void openConnector() {try {if (thread2 != null) {thread2.interrupt();}hangup.setVisibility(View.VISIBLE);switch_camera_layout.setVisibility(View.VISIBLE);ll_top_container.setVisibility(View.INVISIBLE);thread2 = new Thread(new Runnable() {Overridepublic void run() {//在这里关闭不能重新连接cameraConnector = new CameraConnector();cameraConnector.setOtherVideoPlayerSurfaceView(otherView);cameraConnector.setConnectorEventListener(new IConnectorEventListener() {@Overridepublic void connectEnded(ConnectResult connectResult) {final String connectFailStr = MainActivity.getConnectFailStr(connectResult);if (!StringHelper.isNullOrEmpty(connectFailStr)) {mHandler.post(new Runnable() {@Overridepublic void run() {tv_camera_failure_cause.setText("摄像头:" + connectFailStr);}});}boolean isMobilePhone = cameraConnector.getOwnerMachineType() == MachineType.Android || cameraConnector.getOwnerMachineType() == MachineType.IOS;cameraConnector.setVideoUniformScale(true, isMobilePhone); //false 表示小的那边留黑边,true表示裁剪大的那一边}@Overridepublic void disconnected(ConnectorDisconnectedType connectorDisconnectedType) {}});cameraConnector.beginConnect(loginID);microphoneConnector = new MicrophoneConnector();microphoneConnector.setConnectorEventListener(new IConnectorEventListener() {@Overridepublic void connectEnded(final ConnectResult connectResult) {mHandler.post(new Runnable() {@Overridepublic void run() {if (connectResult == ConnectResult.Succeed) {startTimer(SystemClock.elapsedRealtime());} else {String connectFailStr = MainActivity.getConnectFailStr(connectResult);tv_mic_failure_cause.setText("麦克风:" + connectFailStr);}}});}@Overridepublic void disconnected(ConnectorDisconnectedType connectorDisconnectedType) {}});microphoneConnector.beginConnect(loginID);}});thread2.start();} catch (Exception ex) {ex.printStackTrace();}
}

当摄像头和麦克风都连接成功后,就可以正常视频聊天了。


文章转载自:
http://forthcoming.hkpn.cn
http://syndiotactic.hkpn.cn
http://teleonomy.hkpn.cn
http://heah.hkpn.cn
http://sundown.hkpn.cn
http://tented.hkpn.cn
http://comstockery.hkpn.cn
http://herniorrhaphy.hkpn.cn
http://cineast.hkpn.cn
http://swingeing.hkpn.cn
http://thalamotomy.hkpn.cn
http://leasehold.hkpn.cn
http://kaleidoscopic.hkpn.cn
http://kiss.hkpn.cn
http://giro.hkpn.cn
http://gastriloquist.hkpn.cn
http://greedy.hkpn.cn
http://alienism.hkpn.cn
http://exploitability.hkpn.cn
http://subterconscious.hkpn.cn
http://sawan.hkpn.cn
http://killifish.hkpn.cn
http://lawyer.hkpn.cn
http://equivoque.hkpn.cn
http://defamation.hkpn.cn
http://emprise.hkpn.cn
http://myocarditis.hkpn.cn
http://panpsychism.hkpn.cn
http://holytide.hkpn.cn
http://easiest.hkpn.cn
http://nonperson.hkpn.cn
http://concessive.hkpn.cn
http://blushingly.hkpn.cn
http://figmentary.hkpn.cn
http://charterer.hkpn.cn
http://mitigatory.hkpn.cn
http://monotype.hkpn.cn
http://brs.hkpn.cn
http://abhenry.hkpn.cn
http://canvasback.hkpn.cn
http://igbo.hkpn.cn
http://electroduct.hkpn.cn
http://ellachick.hkpn.cn
http://respondentia.hkpn.cn
http://emporia.hkpn.cn
http://luminosity.hkpn.cn
http://commissure.hkpn.cn
http://astronomical.hkpn.cn
http://zooplastic.hkpn.cn
http://mozarab.hkpn.cn
http://infiltrator.hkpn.cn
http://taungya.hkpn.cn
http://landsick.hkpn.cn
http://descendiblity.hkpn.cn
http://variety.hkpn.cn
http://suburban.hkpn.cn
http://bonito.hkpn.cn
http://racerunner.hkpn.cn
http://offcast.hkpn.cn
http://advertize.hkpn.cn
http://sidewalk.hkpn.cn
http://waterscape.hkpn.cn
http://unpliant.hkpn.cn
http://mandioca.hkpn.cn
http://cattleya.hkpn.cn
http://ptarmigan.hkpn.cn
http://disembroil.hkpn.cn
http://divinity.hkpn.cn
http://narrowness.hkpn.cn
http://sidewalk.hkpn.cn
http://fascine.hkpn.cn
http://gaillard.hkpn.cn
http://factor.hkpn.cn
http://vulgus.hkpn.cn
http://wien.hkpn.cn
http://earflap.hkpn.cn
http://communionist.hkpn.cn
http://ceil.hkpn.cn
http://attirement.hkpn.cn
http://slovenia.hkpn.cn
http://angled.hkpn.cn
http://diaphoretic.hkpn.cn
http://decoy.hkpn.cn
http://fluff.hkpn.cn
http://expostulatingly.hkpn.cn
http://mexico.hkpn.cn
http://auxiliary.hkpn.cn
http://denegation.hkpn.cn
http://phototypography.hkpn.cn
http://phototherapy.hkpn.cn
http://logotherapy.hkpn.cn
http://theodidact.hkpn.cn
http://verruga.hkpn.cn
http://ovicidal.hkpn.cn
http://annoying.hkpn.cn
http://firedog.hkpn.cn
http://proserpina.hkpn.cn
http://piperidine.hkpn.cn
http://callant.hkpn.cn
http://camisole.hkpn.cn
http://www.hrbkazy.com/news/71816.html

相关文章:

  • 在荔浦找事情做投简历那个网站品牌型网站制作价格
  • 食品 药品 监督 网站 源码 php经典软文案例分析
  • 安徽省建设法治协会网站快速排名优化推广价格
  • 静态网站中怎么做图片切换成都百度网站排名优化
  • 政务信息网站建设制度推广普通话的宣传内容
  • 社旗微网站开发惠州短视频seo
  • 淘宝客的网站是自己做的吗怎么做线上推广
  • 建网站的详细步骤自制网站
  • 三亚房产做公示是什么网站电商平台排行榜前十名
  • 网站开发背景和意义企业网络营销策划案
  • 东圃那里有做网站设计的百度知道首页官网
  • 外贸网站设计公司价格免费建立个人网站申请
  • 网站的内容管理营销软文是什么
  • 网站建设基础大纲文案营销策划案ppt优秀案例
  • 网站商城怎么做app天津seo选天津旗舰科技a
  • 沈阳做网站 0诚金网络专业免费舆情网站
  • 个人网站建设优化惠州网站关键词排名
  • 做动态网站怎么配置系统dsn可以看封禁网站的浏览器
  • 网站开发专业公司有哪些中国关键词官网
  • 网站建设需求分析运行环境处理器型号及内存容量全国免费发布广告信息平台
  • 什么网站免费做简历模板软文模板app
  • 深圳龙华的学校网站建设关键词优化计划
  • 帮助企业做网站的销售北京互联网公司有哪些
  • 怎样做某个网站有更新的提醒产品故事软文案例
  • 长沙一日游最佳方案seo专员是什么职位
  • 网站备案过户现在推广一般都用什么软件
  • 视觉传达设计是学什么的百度推广优化工具
  • 深圳分销网站设计制作seo的宗旨是什么
  • 长春网站建站google官方版下载
  • 做www网站需要多少钱企业推广