基于linphone android sdk 的voip语音、视频通话 教程三、视频通话

article/2025/10/13 5:07:20

如果觉得下面的麻烦可以直接到https://item.taobao.com/item.htm?id=587133228080获取源码。源码功能性更好、更完善。

想测试apk请加群261074724 

最新的sdk4教程地址  https://blog.csdn.net/Java_lilin/article/details/84842314

前面两篇介绍了注册、拨打、接听等 参考地址https://me.csdn.net/java_lilin

一.拨打视频通话

 

1.创建VideoActivity.java 并且在AndroidManifest.xml配置

package com.lilin.mylinephone;
 
    。。。

import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class VideoActivity extends Activity implements OnClickListener{
      
    private VideoActivityReceiver mReceiver;
    public static final String RECEIVE_VIDEO_ACTIVITY = "receive_video_activity";
    
    private SurfaceView mRenderingView,mPreviewView;  
    private AndroidVideoWindowImpl mAndroidVideoWindow;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video); 
        init(); 
        
        //广播
        IntentFilter intentFilter = new IntentFilter(RECEIVE_VIDEO_ACTIVITY);
        mReceiver = new VideoActivityReceiver();
        registerReceiver(mReceiver, intentFilter);
        
        fixZOrder(mRenderingView, mPreviewView);
        
        mAndroidVideoWindow = new AndroidVideoWindowImpl(mRenderingView, mPreviewView, new AndroidVideoWindowImpl.VideoWindowListener() {
            public void onVideoRenderingSurfaceReady(AndroidVideoWindowImpl vw, SurfaceView surface) {
                mRenderingView = surface;
                LinphoneMiniManager.getLC().setVideoWindow(vw);
            }

            public void onVideoRenderingSurfaceDestroyed(AndroidVideoWindowImpl vw) {
                 LinphoneCore linphoneCore = LinphoneMiniManager.getLC();
                 if (linphoneCore != null) {
                     linphoneCore.setVideoWindow(null);
                 }
            }

            public void onVideoPreviewSurfaceReady(AndroidVideoWindowImpl vw, SurfaceView surface) {
                mPreviewView = surface;
                LinphoneMiniManager.getLC().setPreviewWindow(mPreviewView); 
            }

            public void onVideoPreviewSurfaceDestroyed(AndroidVideoWindowImpl vw) {
                LinphoneMiniManager.getLC().setPreviewWindow(null);
            }
        });
         
    }
    
    private void init() {
        ((Button) findViewById(R.id.id_video_gua)).setOnClickListener(this);
        ((Button) findViewById(R.id.id_video_mute)).setOnClickListener(this);
        ((Button) findViewById(R.id.id_video_speaker)).setOnClickListener(this);
        ((Button) findViewById(R.id.id_video_qiev)).setOnClickListener(this);
        mRenderingView = (SurfaceView) findViewById(R.id.id_video_rendering);
        mPreviewView = (SurfaceView) findViewById(R.id.id_video_preview); 
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        if (mRenderingView != null) {
            ((GLSurfaceView) mRenderingView).onResume();
        }

        if (mAndroidVideoWindow != null) {
            synchronized (mAndroidVideoWindow) {
                LinphoneMiniManager.getLC().setVideoWindow(mAndroidVideoWindow);
            }
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mAndroidVideoWindow != null) {
            synchronized (mAndroidVideoWindow) {
                 LinphoneMiniManager.getLC().setVideoWindow(null);
            }
        }

        if (mRenderingView != null) {
            ((GLSurfaceView) mRenderingView).onPause();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mReceiver != null) {
            unregisterReceiver(mReceiver);
        }
        mPreviewView = null;
        mRenderingView = null;

        if (mAndroidVideoWindow != null) {
            mAndroidVideoWindow.release();
            mAndroidVideoWindow = null;
        }
    }
    
    public class VideoActivityReceiver extends BroadcastReceiver { 
        @Override
        public void onReceive(Context context, Intent intent) {
             String action = intent.getStringExtra("action");
             switch (action) {
             case "end": 
                VideoActivity.this.finish();
                break;

            default:
                break;
            } 
        }
    }

    @Override
    public void onClick(View view) {
        LinphoneMiniManager instance = LinphoneMiniManager.getInstance();
        switch (view.getId()) { 
        case R.id.id_video_gua: 
            instance.hangUp();
            finish();
            break;
        case R.id.id_video_mute:
            
            break;
        case R.id.id_video_speaker:
             
            break;
        case R.id.id_video_qiev: 
            switchCamera(instance);
            break;
        default:
            break;
        }
    }
      
}
3. 在原来的MainActivity.java的xml添加一个按钮用于拨打

  <Button 
            android:layout_width="wrap_content"
            android:layout_marginTop="5dip"
            android:layout_height="wrap_content"
            android:id="@+id/id_btn_vda"
            android:text="视频拨打"
        />

MainActivity.java添加启动的

    case R.id.id_btn_vda: 
            try {
                instance.lilin_call(id_etext_dail.getText().toString(),host,true);
                startActivity(new Intent(MainActivity.this, VideoActivity.class));
            } catch (LinphoneCoreException e1) {Log.e("MainActivity", e1.getMessage());}  
            break;

好了  现在就可以拨打视频了 挂断的需要发送广播接受

在LinphoneMiniManager.java添加

    @Override
    public void displayStatus(LinphoneCore lc, String message) {
        Log.e("lilin  displayStatus: "+message ); 
        if(message.indexOf("Call terminated")!=-1){
            Intent intent = new Intent(VideoActivity.RECEIVE_VIDEO_ACTIVITY);
            intent.putExtra("action", "end"); 
            sendBroadcast( intent);  
        }
    }

好了  上面的就可以进行拨打视频通话了

二、接受视频通话

可以在接电话按钮中添加

case R.id.id_btn_jie:
            try { 
                instance.lilin_jie();
                if(instance.lilin_getVideoEnabled()) {//启动视频 
                    startActivity(new Intent(MainActivity.this, VideoActivity.class));
                }
            } catch (LinphoneCoreException e) {Log.e("MainActivity", e.getMessage()); } 

并在LinphoneMiniManager.java添加 

 public boolean lilin_getVideoEnabled() {
            LinphoneCallParams remoteParams = mLinphoneCore.getCurrentCall().getRemoteParams();
            return remoteParams != null && remoteParams.getVideoEnabled();
    }

public void hangUp() {
        LinphoneCall currentCall = mLinphoneCore.getCurrentCall();
        if (currentCall != null) {
            mLinphoneCore.terminateCall(currentCall);
        } else if (mLinphoneCore.isInConference()) {
            mLinphoneCore.terminateConference();
        } else {
            mLinphoneCore.terminateAllCalls();
        }
    } 

public void updateCall() { 
        LinphoneCall lCall = mLinphoneCore.getCurrentCall();
        if (lCall == null) {
            Log.e("Trying to updateCall while not in call: doing nothing");
            return;
        }  
        mLinphoneCore.updateCall(lCall,null);
    }

 

 

好了  所有的基本功能都已经实现了  其他的例如编码等需参考源码的写法

对此感兴趣的可以加群261074724 

 

 

 

 


http://chatgpt.dhexx.cn/article/I9d69ymL.shtml

相关文章

Web项目引入Agora SDK实现视频通话功能

零、前言 简介&#xff1a;声网Agora。一个专注移动端的高清实时通话云服务解决方案。 &#xff08;1&#xff09;声网Agora成立于2013年&#xff0c;是实时音视频云行业开创者和全球领先的专业PaaS服务商。开发者只需简单调用Agora API&#xff0c;30分钟即可在应用内构建多种…

Android之 集成音视频通话

一&#xff0c;背景 1.1 最近接收一个即时通讯二开项目&#xff0c;即时通讯部分用的XMPP协议&#xff0c;音视频则是集成的国外的开源免费库jitsi-meet-sdk-2.4.0-4.aar&#xff0c;是基于WebRTC的开源框架。但客户想要微信那种页面的排版&#xff0c;后来经研究jitsi是不能修…

Unity实战篇 | 接入 声网SDK 实现 视频通话——自己动手做一个 视频通话

目录 🐱‍🏍前言🎂Unity 接入 声网SDK 实现 音视频通话第1️⃣步,创建声网应用第2️⃣步,获取相应的SDK第3️⃣步,将SDK接入Unity中第4️⃣步:搭建一个测试场景,编写测试代码第5️⃣步:视频通话API第6️⃣步:视频通话 效果测试🎂案例下载链接🎨总结🐱‍🏍

Android技术分享| 视频通话开发流程(二)

多人呼叫 多人呼叫与点对点呼叫区别在于多人呼叫是一次呼叫1个以上的人&#xff0c;中途也可以再呼叫邀请别人加入通话。 整个呼叫的流程跟点对点呼叫类似&#xff0c;但也有些区别&#xff0c;需要添加额外的 API 逻辑来实现功能。下面我们分主叫被叫两种角色来分析。 主叫 …

Web音视频通话解决方案 —— Agora Web SDK NG 版接入教程

引言 随着社会的发展&#xff0c;人们对实时音视频的需求越来越多。在线会议&#xff0c;电商直播&#xff0c;在线教育等相关产品不断涌现。但是对于个人开发者或者小团队来说&#xff0c;自己实现一个实时音视频服务并且要保障服务稳定&#xff0c;满足低延时等要求&#xf…

基于声网 SDK 实现 iOS 端的一对一视频通话

在很多产品&#xff0c;加入实时视频通话已经不是新鲜事情了&#xff0c;尤其是近几年的疫情影响&#xff0c;个人公司国家对于实时音视频的需求一直在快速的增长。例如视频会议、社交应用、实时游戏&#xff0c;甚至也可能出现在一些元宇宙的场景中。 本文将教你如何通过声网…

web端视频通话sdk集成和功能实现流程(实时视频系列五)

本文介绍的是在wed端如何集成即构音视频SDK&#xff0c;以实现在wed端一对一&#xff0c;一对多及多人实时视频通话的功能。 一、SDK集成指引 1、安装 请从 jZego-RTC-SDK 下载 SDK。 npm下载包支持typescript语言(推荐)&#xff1a; npm i webrtc-zego 2、集成SDK 可使用s…

《保姆级教程》基于Agora SDK实现音视频通话及屏幕共享

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

保姆级教程!基于声网 Web SDK实现音视频通话及屏幕共享

前言 大家好&#xff0c;我是 小曾同学&#xff0c;小伙伴们也可以叫我小曾&#xff5e; 如果你想实现一对一音视频通话和屏幕共享功能&#xff0c;不妨来看看这篇文章&#xff0c;保姆级教程&#xff0c;不需要从零实现&#xff0c;直接集成声网 SDK 即可轻松上手。 本文也…

Android设备实现语音视频通话

一、背景 有智慧社区相关的项目&#xff0c;需要门禁开发门禁机APP以及用户端APP&#xff0c;要求实现门禁设备呼叫业主APP&#xff0c;业主接通后可以通话、可以开门。这里主要要做的就是语音和视频通话功能&#xff0c;以及远程开门。至于业务逻辑那就是正常的需求处理了。 …

基于 Web SDK 实现视频通话场景 | 声网 SDK 教程

声网视频 SDK 被广泛应用于多种实时互动场景中&#xff0c;例如视频会议、视频通话、音视频社交、在线教育等。为了让刚刚接触声网 SDK 的开发者&#xff0c;可以更顺畅地实现基础的视频通话功能&#xff0c;我们基于声网 Web SDK 4.x 版本梳理了本篇教程。 在本文末&#xff0…

如何基于 Agora Android SDK 在应用中实现视频通话?

在很多产品&#xff0c;实时视频通话已经不是新鲜的功能了&#xff0c;例如视频会议、社交应用、在线教育&#xff0c;甚至也可能出现在一些元宇宙的场景中。 本文将教你如何通过声网Agora 视频 SDK 在 Android 端实现一个视频通话应用。声网 SDK 每个月会提供 10000 分钟的免…

Android uni-app实现音视频通话

前言 上一篇讲解了怎么实现Android uni-app封装原生插件&#xff0c;这篇讲解一下&#xff0c;把anyRTC的RTC&#xff08;音视频通讯&#xff09;封装uni-app 实现音视频通话。 不了解anyRTC的小伙伴&#xff0c;可以点击下面链接&#xff1a; 开发者官网 1.效果图 先上图&a…

使用 Agora SDK 开发 React Native 视频通话 App

在 React Native 的应用中&#xff0c;从头开始添加视频通话功能是很复杂的。要保证低延迟、负载平衡&#xff0c;还要注意管理用户事件状态&#xff0c;非常繁琐。除此之外&#xff0c;还必须保证跨平台的兼容性。 当然有个简单的方法可以做到这一点。在本次的教程中&#xf…

MySQL联合索引底层数据结构是怎样的

目录 1. 联合索引数据结构图 2.联合索引是如何进行排序的 3. 联合索引查询特点 1. 联合索引数据结构图 如下图所示联合索引的数据结构, 通过name&#xff0c;age&#xff0c;position三个字典进行一个联合索引&#xff0c;构建B树索引结构。 2.联合索引是如何进行排序的 B树…

MySQL联合索引在B+树如何存储以及寻址

文章目录 引入Innodb B树联合索引存储以及寻址总结 引入 最近找工作&#xff0c; 去一家三方支付公司面试&#xff0c;前面得过程还挺好&#xff0c;所有的提都回答对了&#xff08;心里暗自窃喜应该能拿到高工资offer&#xff0c;迎娶白富美&#xff0c;然后走向人生巅峰&…

MySQL联合索引生效规则

最近项目中一张表数量测试达到千万级别&#xff0c;考虑加索引&#xff0c;对于单列索引及联合索引&#xff08;复合索引&#xff09;简单学习了下&#xff0c;做一下笔记。 联合索引生效前提&#xff1a;因为联合索引有顺序讲究&#xff0c;联合索引的第一个字段是引导列&…

mysql联合索引的数据结构

一、本文主要讲解的内容有&#xff1a; 联合索引在B树上的存储结构联合索引的查找方式为什么会有最左前缀匹配原则 在分享这篇文章之前&#xff0c;我在网上查了关于MySQL联合索引在B树上的存储结构这个问题&#xff0c;翻阅了很多博客和技术文章&#xff0c;其中有几篇讲述的…

mysql联合索引有效和失效的情况分析

关于mysql的索引&#xff0c;是mysql优化一个非常重要的方面。那么关于索引是否有效就是非常关键了。很多人设计了索引&#xff0c;但是发现依旧很慢。那么这个时候就判断sql的索引执行情况非常重要了。网上有大量的博主也写过不少类似的文章&#xff0c;但是关于联合索引的具体…

MySQL联合索引(abc)命中规则

1.建表 mysql创建一张表&#xff0c;表名&#xff1a;‘test_models’ id列为 主键&#xff0c;int类型 &#xff0c;自增a,b,c,d,e 全部是int&#xff08;11&#xff09;为&#xff08;a,b,c&#xff09;添加一个联合索引 index_abc 执行语句&#xff1a; CREATE TABLE te…