文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【Android App】实战项目之仿微信的视频通话(附源码和演示 超详细必看)

2023-08-31 07:19

关注

需要源码请点赞关注收藏后评论区留言私信~~~

虽然手机出现许多年了,它具备的功能也越来越丰富,但是最基本的通话功能几乎没有变化。从前使用固定电话的时候,通话就是听声音;如今使用最新的智能手机,通话仍旧是听声音。 只闻其声不见其人的状况持续了好多年,既然手机自带的通话功能不支持视频画面,只好通过App自身实现了,比如微信就支持视频通话功能。通话双方一边对话,一边在手机屏幕上看着对方,感觉就像面对面交谈那般亲切。

视频通话的请求方点击视频通话菜单项,接收方会自动打开等待通话界面。

接收方点击接听按钮,表示同意视频通话,之后双方的微信都切到接通了的视频通话界面。

任何一方点击挂断按钮,都将结束视频通话过程。

视频童话不但要实时传输语音,还要实时传输画面,这对即时性要求很高,从用户界面到后台服务,视频通话主要集成了以下技术

(1)模糊位图:等待接听界面的背景可使用对方的模糊头像。

(2)音频管理器:按下音量加减键可以调节通话音量。

(3)Socket通信:与拨号事件有关的信令管理,需要采取Socket通信与后端服务器交互。

(4)移动数据格式JSON:客户端与服务器之间传输信令,需要把信令内容封装为JSON格式。 (5)实时音视频:开源库WebRTC适用于一对一的视频传输。

下面介绍代码模块之间的关系

(1)ContactListActivity.java:这是联系人的列表界面。

可以分解为下列三类操作

分别侦听好友上线和好友下线时间,在好友上线时将他加入联系人列表,在好友下线时将他从联系人列表移除
2:点击某位好友的头像,确认将要与其视频通话后打开视频通话等待界面

未在视频通话时需要侦听好友通话事件  一旦收到某位好友的通话请求就立即跳到等待接听界面 

(2)ContactVideoActivity.java:这是视频通话的预览界面,发起方与接收方通用。 

(3)服务端HttpServer模块中的VideoChatServer.java:处理Socket通信后端的信令消息传输。

视频通话的发起方与接收方的通话处理有所不同 主要区别如下

发起方发起通话请求之后需要侦听对方的接听事件,只有对方接受请求同意接听才能调用createOffer方法为其创建音视频供应

接收方只要按下接听按钮就表示同意通话请求,那么在收到对方的媒体能力时就应该调用createAnswer方法为其创建音视频答复 

联系人列表如下

 

 

部分代码如下 全部代码请点赞关注收藏后评论区留言私信~~~

package com.example.live;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import androidx.appcompat.app.AlertDialog;import androidx.appcompat.app.AppCompatActivity;import com.example.live.adapter.EntityListAdapter;import com.example.live.bean.EntityInfo;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import io.socket.client.Socket;public class ContactListActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {    private final static String TAG = "ContactListActivity";    private EntityListAdapter mAdapter; // 联系人的列表适配器    private Map mContactMap = new HashMap<>(); // 联系人的名称映射    private List mContactList = new ArrayList<>(); // 联系人列表    private Socket mSocket; // 声明一个套接字对象    private String mSelfName; // 我的昵称    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_contact_list);        initView(); // 初始化视图        initSocket(); // 初始化套接字    }    // 初始化视图    private void initView() {        TextView tv_title = findViewById(R.id.tv_title);        tv_title.setText("联系人列表");        findViewById(R.id.iv_back).setOnClickListener(v -> finish());        ListView lv_contact = findViewById(R.id.lv_contact);        mAdapter = new EntityListAdapter(this, mContactList);        lv_contact.setAdapter(mAdapter);        lv_contact.setOnItemClickListener(this);    }    // 初始化套接字    private void initSocket() {        mSelfName = getIntent().getStringExtra("self_name");        Log.d(TAG , "initSocket "+mSelfName);        mSocket = MainApplication.getInstance().getSocket();        mSocket.connect(); // 建立Socket连接        // 开始监听好友上线事件        mSocket.on("friend_online", (args) -> {            String friend_name = (String) args[0];            if (friend_name != null) {                // 把刚上线的好友加入联系人列表                mContactMap.put(friend_name, new EntityInfo(friend_name, "好友"));                mContactList.clear();                mContactList.addAll(mContactMap.values());                runOnUiThread(() -> mAdapter.notifyDataSetChanged());            }        });        // 开始监听好友下线事件        mSocket.on("friend_offline", (args) -> {            String friend_name = (String) args[0];            if (friend_name != null) {                mContactMap.remove(friend_name); // 从联系人列表移除已下线的好友                mContactList.clear();                mContactList.addAll(mContactMap.values());                runOnUiThread(() -> mAdapter.notifyDataSetChanged());            }        });        // 开始监听好友通话事件        mSocket.on("friend_converse", (args) -> {            String friend_name = (String) args[0];            // 接收到好友的通话请求,于是跳到视频通话页面            Intent intent = new Intent(this, ContactVideoActivity.class);            intent.putExtra("self_name", mSelfName); // 我的昵称            intent.putExtra("friend_name", friend_name); // 好友昵称            intent.putExtra("is_offer", false); // 是否为发起方            startActivity(intent);        });        mSocket.emit("self_online", mSelfName); // 通知服务器“我已上线”    }    @Override    protected void onDestroy() {        super.onDestroy();        if (mSocket.connected()) { // 已经连上Socket服务器            mSocket.emit("self_offline", mSelfName); // 通知服务器“我已下线”            mSocket.off("friend_online"); // 取消监听好友上线事件            mSocket.off("friend_offline"); // 取消监听好友下线事件            mSocket.off("friend_converse"); // 取消监听好友通话事件            mSocket.disconnect(); // 断开Socket连接        }    }    @Override    public void onItemClick(AdapterView parent, View view, int position, long id) {        EntityInfo friend = mContactList.get(position);        AlertDialog.Builder builder = new AlertDialog.Builder(this);        builder.setMessage(String.format("你是否要跟%s视频通话?", friend.name));        builder.setPositiveButton("是", (dialog, which) -> {            // 想跟好友通话,就打开视频通话页面            Intent intent = new Intent(this, ContactVideoActivity.class);            intent.putExtra("self_name", mSelfName); // 我的昵称            intent.putExtra("friend_name", friend.name); // 好友昵称            intent.putExtra("is_offer", true); // 是否为发起方            startActivity(intent);        });        builder.setNegativeButton("否", null);        builder.create().show();    }    @Override    protected void onRestart() {        super.onRestart();        Toast.makeText(this, "视频通话已结束", Toast.LENGTH_SHORT).show();    }}

创作不易 觉得有帮助请点赞关注收藏~~~

来源地址:https://blog.csdn.net/jiebaoshayebuhui/article/details/128165972

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯