基础7.4.9200

效果图

首先是显示悬浮窗的服务

/*** 视频悬浮窗服务*/
public class FloatVideoWindowService extends Service {private String currentBigUserId;//浮动布局viewprivate View mFloatingLayout;//容器父布局private TXCloudVideoView mTXCloudVideoView;private String TAG = getClass().getSimpleName();@Overridepublic void onCreate() {super.onCreate();initWindow();//设置悬浮窗基本参数(位置、宽高等)EventBus.getDefault().register(this);}@Subscribe(threadMode = ThreadMode.MAIN)public void onMessageEvent(Event<String> event) {if (event.getCode() == 1000) {findVideoView(event.getData());}}@Overridepublic IBinder onBind(Intent intent) {currentBigUserId = intent.getStringExtra("userId");initFloating();//悬浮框点击事件的处理return new MyBinder();}public class MyBinder extends Binder {public FloatVideoWindowService getService() {return FloatVideoWindowService.this;}}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {super.onDestroy();FloatWindow.destroy();EventBus.getDefault().unregister(this);if (mFloatingLayout != null) {// 移除悬浮窗口mFloatingLayout = null;Constents.isShowFloatWindow = false;}}/*** 设置悬浮框基本参数(位置、宽高等)*/private void initWindow() {mFloatingLayout = LayoutInflater.from(getApplicationContext()).inflate(R.layout.alert_float_video_layout, null);}private void initFloating() {mTXCloudVideoView = mFloatingLayout.findViewById(R.id.float_videoview);findVideoView(currentBigUserId);Constents.isShowFloatWindow = true;mFloatingLayout.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//在这里实现点击重新回到ActivityIntent intent = new Intent(FloatVideoWindowService.this, TRTCVideoCallActivity.class);intent.setFlags(FLAG_ACTIVITY_NEW_TASK);startActivity(intent);}});FloatWindow.with(getApplicationContext()).setView(mFloatingLayout).setWidth((int) DensityUtil.dip2px(96))                               //设置控件宽高.setHeight((int) DensityUtil.dip2px(136)).setMoveType(MoveType.slide,0,0).setX(100)                                   //设置控件初始位置.setY(Screen.height,0.3f).setDesktopShow(true)                        //桌面显示.setViewStateListener(mViewStateListener)    //监听悬浮控件状态改变
//                .setPermissionListener(mPermissionListener)  //监听权限申请结果.build();}ViewStateListener mViewStateListener = new ViewStateListener() {@Overridepublic void onPositionUpdate(int i, int i1) {if(mFloatingLayout == null){return;}int screenWidth = ScreenUtil.getScreenWidth(getApplicationContext());if(i == 0){mFloatingLayout.setBackgroundResource(R.drawable.white_radius_left_10);} else {if(i == screenWidth - mFloatingLayout.getWidth()){mFloatingLayout.setBackgroundResource(R.drawable.white_radius_right_10);} else {mFloatingLayout.setBackgroundResource(R.drawable.white_radius_10);}}}@Overridepublic void onShow() {}@Overridepublic void onHide() {}@Overridepublic void onDismiss() {}@Overridepublic void onMoveAnimStart() {}@Overridepublic void onMoveAnimEnd() {}@Overridepublic void onBackToDesktop() {}};private void findVideoView(String userId) {mTXCloudVideoView.removeVideoView();TRTCVideoLayoutManager mTRTCVideoViewLayout = Constents.mVideoViewLayout;TRTCVideoLayout lVideoViewLayout = mTRTCVideoViewLayout.findCloudViewView(userId);TXCloudVideoView mLocalVideoView =lVideoViewLayout.getVideoView();if (mLocalVideoView == null) {mLocalVideoView = mTRTCVideoViewLayout.allocCloudVideoView(userId).getVideoView();}if (Constents.currentUserID.equals(userId)) {TXCGLSurfaceView mTXCGLSurfaceView = mLocalVideoView.getGLSurfaceView();if (mTXCGLSurfaceView != null && mTXCGLSurfaceView.getParent() != null) {((ViewGroup) mTXCGLSurfaceView.getParent()).removeView(mTXCGLSurfaceView);mTXCloudVideoView.addVideoView(mTXCGLSurfaceView);}} else {TextureView mTextureView = mLocalVideoView.getVideoView();if (mTextureView != null && mTextureView.getParent() != null) {((ViewGroup) mTextureView.getParent()).removeView(mTextureView);mTXCloudVideoView.addVideoView(mTextureView);}}}
}

布局文件

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/small_size_frame_layout"android:layout_width="96dp"android:layout_height="136dp"android:background="@drawable/white_radius_10"android:orientation="vertical"android:padding="8dp"><com.tencent.rtmp.ui.TXCloudVideoViewandroid:id="@+id/float_videoview"android:layout_width="80dp"android:layout_height="120dp"android:descendantFocusability="blocksDescendants"android:orientation="vertical" /></FrameLayout>

这里我用了一个悬浮窗的库,比自己写的好用

implementation 'com.github.yhaolpz:FloatWindow:1.0.9'

在TRTCVideoCallActivity视频界面开启悬浮窗

public void startFloat() {String lastBigUserId = mLayoutManagerTrtc.getLastTRTCLayoutEntity();isStartService = true;moveTaskToBack(true);Constents.mVideoViewLayout = mLayoutManagerTrtc;Intent intent = new Intent(this, FloatVideoWindowService.class);//开启服务显示悬浮框intent.putExtra("userId", lastBigUserId);bindService(intent, mVideoServiceConnection, Context.BIND_AUTO_CREATE);}

悬浮窗点击返回TRTCVideoCallActivity时需要在onRestart里关闭服务并重新赋值TXCloudVideoView

@Overrideprotected void onRestart() {super.onRestart();if (isStartService) {isStartService = false;unbindService(mVideoServiceConnection);}String userId = mLayoutManagerTrtc.getLastTRTCLayoutEntity();TXCloudVideoView txCloudVideoView = mLayoutManagerTrtc.findCloudViewView(userId).getVideoView();if (txCloudVideoView == null) {txCloudVideoView = mLayoutManagerTrtc.allocCloudVideoView(userId).getVideoView();}if (Constents.currentUserID.equals(userId)) {TXCGLSurfaceView mTXCGLSurfaceView = txCloudVideoView.getGLSurfaceView();if (mTXCGLSurfaceView != null && mTXCGLSurfaceView.getParent() != null) {((ViewGroup) mTXCGLSurfaceView.getParent()).removeView(mTXCGLSurfaceView);txCloudVideoView.addVideoView(mTXCGLSurfaceView);}} else {TextureView mTextureView = txCloudVideoView.getVideoView();if (mTextureView != null && mTextureView.getParent() != null) {((ViewGroup) mTextureView.getParent()).removeView(mTextureView);txCloudVideoView.addVideoView(mTextureView);}}}

http://www.taodudu.cc/news/show-2552591.html

相关文章:

  • 使用mosquitto库命令与腾讯云通信
  • java腾讯云通信生成userSig
  • 腾讯云通信IM集成踩坑记
  • Android集成腾讯云通信IM
  • 腾讯通信云服务端使用心得,腾讯云IM
  • 腾讯云通信
  • 认证理论与技术——身份认证技术
  • 身份认证是计算机网络系统的用户,计算机网络知识:网络认证技术之身份认证技术...
  • 服务器端身份验证技术,身份认证技术和协议的常用方法
  • 统一身份认证
  • 网络与系统安全笔记------身份认证技术
  • 基于IPv6的5G专网终端身份认证技术与应用
  • php模拟腾讯微校第三方认证,身份验证技术方案1身份认证流程-微校-腾讯.PDF
  • 身份认证简单介绍
  • FIDO身份认证应用案例
  • 网络安全技术 | 身份认证的革命——生物特征身份认证
  • 网络安全技术第四章——身份认证技术(身份认证及方式、身份认证三要素、身份认证协议、KERBEROS协议、SSL协议)
  • 【信息安全】-身份认证技术
  • 移动接入的身份认证技术
  • 第四讲 身份认证技术
  • 浅析计算机用户身份识别技术,浅谈网络安全之身份认证技术
  • 浅析计算机用户身份识别技术,(浅析身份认证技术.doc
  • 计算机安全中采用的用户身份验证技术主要有,探究用户身份认证技术在信息安全中运用的意义...
  • 常见的身份认证技术
  • activex与matlab,基于ActiveX技术的LabVIEW与MATLAB混合编程总结
  • activex服务器与com组件,COM和ActiveX控件设计.ppt
  • IE浏览器插件ActiveX的制作以及Google 调用此插件
  • 纵观 ActiveX 平台的兴衰史,看开发控件的技术演变
  • ActiveX是什么?界面开发有哪些好用的ActiveX控件推荐?
  • 非IE浏览器下ActiveX技术的替代方案

腾讯云通信音视频通话最小化悬浮小窗相关推荐

  1. Android基于腾讯云实时音视频实现类似微信视频通话最小化悬浮

    最近项目中有需要语音.视频通话需求,看到这个像环信.融云等SDK都有具体Demo实现,但咋的领导对腾讯情有独钟啊,IM要用腾讯云IM,不妙的是腾讯云IM并不包含有音视频通话都要自己实现,没办法深入了解 ...

  2. android修改视频聊天帧率,Android基于腾讯云实时音视频仿微信视频通话最小化悬浮(4)...

    Activity中的操作 现在我们将思路了捋一下,假设现在我正在进行视频通话,点击视频最小化按钮,我们应该按顺序执行如下步骤:应该是会出现个悬浮框.我们用mServiceBound保存Service注 ...

  3. 音视频通话:腾讯云 webRTC音视频通话的使用

    最近项目中用到关于视频通话的功能,一开始使用腾讯云云直播提供的接口进行web端推流和拉流,但苦于获取不到音频,而且那个web推流用的flash谷歌在12月份就不支持了.所以我们最终确定使用webrtc ...

  4. Vue实现腾讯云_音视频通话的推拉流

    目标:单对单通信 大部分异步使用 async await 进行同步,try catch 捕获错误处理 先放一个流程图,解决80%的问题 安装 TRTC Web SDK 安装 npm install t ...

  5. 李郁韬:短期爆发还是未来趋势?腾讯云海量音视频通信服务背后的技术发展

    面临特殊时期,无论远程办公.还是学校"停课不停学"都成为时下的必然选择,众多视频会议平台也在特殊环境下开启了短期免费开放及功能服务.但与此同时不可避免会带来突发的大规模在线视频与协 ...

  6. uniapp对接腾讯云IM+音视频。音视频含UI集成

    uniapp对接腾讯云IM+音视频 文章目录 uniapp对接腾讯云IM+音视频 前言 一.准备工作 二.使用步骤 1.App.vue配置 2.登录时操作 login.vue 3.使用方法 一.音视频 ...

  7. 揭秘腾讯云最新音视频及融合通信技术实践

    社交到视频会议,从金融到医疗,云端通信能力正在与传统的电话/IM.呼叫中心.企业通信融合,打通各个端与渠道的数据,实现实时互联与掌控.而音视频技术在其中扮演着重要的角色,如何为用户提供更低延迟.更佳体 ...

  8. “音”你而来,“视”而可见 腾讯云+社区音视频技术开发实战沙龙圆满结束...

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云技术沙龙团队发布于腾讯云云+社区 近年来,得益于移动互联网的普及和智能终端设备的广泛应用,短视频.直播.在线教学等音视频通信模式 ...

  9. “音”你而来,“视”而可见 腾讯云+社区音视频技术开发实战沙龙圆满结束... 1

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云技术沙龙团队发布于腾讯云云+社区 近年来,得益于移动互联网的普及和智能终端设备的广泛应用,短视频.直播.在线教学等音视频通信模式 ...

  10. 【腾讯云】音视频存储管理CVS

    音视频存储管理(Cloud Video Storage)基于腾讯云强大的云存储平台,为客户提供音视频上传.存储.媒资管理等聚焦于音视频领域的安全可靠的云存储服务.

最新文章

  1. SUSE Linux SFTP服务器配置
  2. 数据事业部/数据项目/数据乐高
  3. LeetCode 92. Reverse Linked List II
  4. npm + webpack +react
  5. 精品软件推荐 Desktop Central - Free Windows Admin Tools
  6. shell 命令 netstat 查看端口占用
  7. 人工智能十大流行算法,通俗易懂讲明白
  8. 计算机音乐出山,出山 - 萧忆情Alex - 5SING中国原创音乐基地
  9. 读书报告1500字计算机大学篇,读书报告2000字大学篇
  10. 家庭用计算机是一体好还是,国产家用电脑一体机,性能够用就好!!!
  11. leetcode 第344题 (Java实现) 字符串反转
  12. ALC、AGC、DRC、EQ对比
  13. 航空航天与国防数字化验证解决方案 | 达索系统百世慧®
  14. 人工鱼群算法超详细解析附带JAVA代码
  15. anki公司即将出品Vector家庭机器人(正在预售)
  16. 智能家居-wigwag系统_英文介绍
  17. Windows远程桌面连接每次都提示输入密码的问题
  18. 【好工具】Chrome 浏览器开启视频画中画,看视频敲代码两不误!
  19. Recent Updates on Neuroendocrine Tumors From the Gastrointestinal and Pancreatobiliary Tracts
  20. Java菜鸟补给站---MySQL数据库 SQL 语句补充( 一 )

热门文章

  1. Redis设计与实现(一)| 数据结构 对象
  2. MySQL报错java.sql.SQLException: The server time zone value ‘乱码‘ is unrecognized or represents more tha
  3. _VMware_虚拟机到_KVM
  4. Windows 10, version 22H2 (released Oct 2022) 简体中文版、英文版下载
  5. php气泡效果,ps简单制作漂亮的人物气泡效果
  6. Cocoscreator 3.01 ios平台Facebook登陆
  7. vue - 禁止input[number]输入 +、-、e 符号,并且只能输入两位小数
  8. 使用Everything清理垃圾文件
  9. c语言正弦函数求导,正弦函数求导公式基本推导
  10. C语言4位BCD码加法器,四位二进制8421BCD码加法器.doc