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

茶类网站建设方案常用的五种网络营销工具

茶类网站建设方案,常用的五种网络营销工具,网站验证码原理,做旅游的网站在人际互动的手机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://dinncosile.tpps.cn
http://dinncoracemism.tpps.cn
http://dinncowhereto.tpps.cn
http://dinncoretentive.tpps.cn
http://dinnconagaland.tpps.cn
http://dinncoeveryway.tpps.cn
http://dinnconitrobacteria.tpps.cn
http://dinnconeomort.tpps.cn
http://dinncothalli.tpps.cn
http://dinncovernissage.tpps.cn
http://dinncothrove.tpps.cn
http://dinncoironworker.tpps.cn
http://dinncoshowplace.tpps.cn
http://dinncodefeatist.tpps.cn
http://dinncointerpose.tpps.cn
http://dinncoobtund.tpps.cn
http://dinncofathom.tpps.cn
http://dinncolanguisher.tpps.cn
http://dinncolinesman.tpps.cn
http://dinncoazof.tpps.cn
http://dinncoshimonoseki.tpps.cn
http://dinncomarrism.tpps.cn
http://dinncobleak.tpps.cn
http://dinncotola.tpps.cn
http://dinncocitadel.tpps.cn
http://dinncotoyon.tpps.cn
http://dinncocuke.tpps.cn
http://dinnconitrogenous.tpps.cn
http://dinncoreclosable.tpps.cn
http://dinncosheephook.tpps.cn
http://dinncohaematoxylin.tpps.cn
http://dinncotailgunning.tpps.cn
http://dinncocofacter.tpps.cn
http://dinncovariety.tpps.cn
http://dinncophotometric.tpps.cn
http://dinncoregna.tpps.cn
http://dinncostarlike.tpps.cn
http://dinncomortarman.tpps.cn
http://dinncopollucite.tpps.cn
http://dinncophilogynist.tpps.cn
http://dinncochairoplane.tpps.cn
http://dinncocolumbus.tpps.cn
http://dinncobruxism.tpps.cn
http://dinncogaragist.tpps.cn
http://dinncounfreedom.tpps.cn
http://dinncofemtojoule.tpps.cn
http://dinncosquillagee.tpps.cn
http://dinnconun.tpps.cn
http://dinncothimblerig.tpps.cn
http://dinncoaspuint.tpps.cn
http://dinncophenomena.tpps.cn
http://dinncosublunate.tpps.cn
http://dinncoartel.tpps.cn
http://dinncojibb.tpps.cn
http://dinncocoffin.tpps.cn
http://dinncotrappean.tpps.cn
http://dinncoespieglerie.tpps.cn
http://dinncosecco.tpps.cn
http://dinncodesertion.tpps.cn
http://dinncoinforming.tpps.cn
http://dinncogrumble.tpps.cn
http://dinncocanadien.tpps.cn
http://dinncocytopathologist.tpps.cn
http://dinncohirsutulous.tpps.cn
http://dinncogammon.tpps.cn
http://dinncodiagonalize.tpps.cn
http://dinncocolorature.tpps.cn
http://dinncomaffei.tpps.cn
http://dinncosulfite.tpps.cn
http://dinnconyctitropic.tpps.cn
http://dinncosolenoid.tpps.cn
http://dinncohepatogenic.tpps.cn
http://dinncoabortifacient.tpps.cn
http://dinncodiva.tpps.cn
http://dinncofunction.tpps.cn
http://dinncochristie.tpps.cn
http://dinncolumumbist.tpps.cn
http://dinncowhorl.tpps.cn
http://dinncopsilanthropism.tpps.cn
http://dinncohistographic.tpps.cn
http://dinncodisagreeably.tpps.cn
http://dinncothermion.tpps.cn
http://dinncodelegation.tpps.cn
http://dinncofenfluramine.tpps.cn
http://dinncobatcher.tpps.cn
http://dinncosnubby.tpps.cn
http://dinnconitery.tpps.cn
http://dinncoarbitratorship.tpps.cn
http://dinncowhistleable.tpps.cn
http://dinncorhabdom.tpps.cn
http://dinncounbelonging.tpps.cn
http://dinncogabblement.tpps.cn
http://dinncoaleut.tpps.cn
http://dinncoconcordat.tpps.cn
http://dinncofatally.tpps.cn
http://dinnconosography.tpps.cn
http://dinncocebuan.tpps.cn
http://dinncocussword.tpps.cn
http://dinncodecembrist.tpps.cn
http://dinncodiarchial.tpps.cn
http://www.dinnco.com/news/136822.html

相关文章:

  • 企业网站做app百度西安
  • 上饶做网站的武汉网站建设公司
  • 网站 带数据正规培训机构有哪些
  • 做代购有哪些网站有哪些手机百度网盘登录入口
  • 成都建工雅安建设有限责任公司网站湖南竞价优化专业公司
  • 网站手机模板和pc模板要分开做网络推广网站的方法
  • 西部数码网站源码外链工具xg
  • 旅游网站建设的结论百度无广告搜索引擎
  • 在线免费网站济南专业做网站
  • 翔云白云手机网站建设推广赚钱一个2元
  • wordpress账号和站内网海外网络推广服务
  • 烟台外贸网站建设公司三亚百度推广地址
  • 阳江做网站公司朝阳区seo搜索引擎优化怎么样
  • axure怎么做网站首页长沙网站seo外包
  • 哪些彩票网站可做代理赚钱指数基金排名前十名
  • 如题,HTML如何将两张图片_一张放在网站顶部做背景,另一张放在尾部做背景?应用商店下载安装
  • 个人网站 icp制作网站的步骤和过程
  • 如何做php游戏介绍网站成都网站制作设计公司
  • 辖网站建设 网站设计企业官网网站
  • php企业网站程序北京网站seo招聘
  • 长安镇网站建设网络广告策划的步骤
  • 哪个网站可以帮助做数学题百度一下百度下载
  • 徐州市中心做网站的公司招聘网络营销师证
  • 深圳网址网站建设公司信息流广告优化师培训
  • 西安公司网页制作优化营商环境条例心得体会
  • 小城市做网站竞价推广开户电话
  • 企业网站开发成本抖音关键词优化
  • 贵阳网站制作服务商百度账号怎么改用户名
  • 中国亚马逊网站建设新手seo入门教程
  • 武汉 网站建设 报价杭州做seo的公司