转载请注明出处
作者:JYangkai
出处:简书
地址:Android 集成声网Agora 音视频实时通话(三)
正文
上一章我们介绍了声网的具体初始化、加入房间、离开房间等方法,但我还没介绍具体应该用,那么这一章我们就来看看如何使用AgoraManager
新建接口
/**
* 通话时的接口
*/
public interface OnMediaListener {
void onJoinSuccess(String channel, int uid, int elapsed);
void onRejoinSuccess(String channel, int uid, int elapsed);
void onLeaveChannel(IRtcEngineEventHandler.RtcStats stats);
void onUserJoined(int uid, int elapsed);
void onUserOffline(int uid, int reason);
}
此接口里的方法分别是
- onJoinSuccess():加入房间成功的回调
- onRejoinSuccess():重新加入房间的回调
- onLeaveChannel():离开房间的回调
- onUserJoined():有用户加入房间的回调
- onUserOffline():有用户离开的回调
其实还可以写更多的方法,比如静音回调、关闭摄像头回调等,但这里我们只是实现简单的音视频通话,有这些方法就足够了
我们在写了这个接口后应该怎么用呢,首先我们要在AgoraManager类内部定义此接口的实例
private OnMediaListener listener;
然后定义一个方法
/**
* 设置通话时的接口回调
*
* @param listener
*/
public void setOnMedialistener(OnMediaListener listener) {
this.listener = listener;
}
并在RTCEngine的IRtcEngineEventHandler中进行调用
/**
* 回调接口
*/
private IRtcEngineEventHandler mHandler = new IRtcEngineEventHandler() {
@Override
public void onJoinChannelSuccess(String channel, int uid, int elapsed) {
if (null != listener) {
listener.onJoinSuccess(channel, uid, elapsed);
}
}
@Override
public void onRejoinChannelSuccess(String channel, int uid, int elapsed) {
if (null != listener) {
listener.onRejoinSuccess(channel, uid, elapsed);
}
}
@Override
public void onLeaveChannel(RtcStats stats) {
if (null != listener) {
listener.onLeaveChannel(stats);
}
}
@Override
public void onUserJoined(int uid, int elapsed) {
if (null != listener) {
listener.onUserJoined(uid, elapsed);
}
}
@Override
public void onUserOffline(int uid, int reason) {
if (null != listener) {
listener.onUserOffline(uid, reason);
}
}
};
这样我们就完成了AgoraManager的所有工作
下面是AgoraManager的完整代码
AgoraManager.java
package com.yk.jchat.utils;
import android.content.Context;
import android.util.SparseArray;
import android.view.SurfaceView;
import com.yk.jchat.R;
import io.agora.rtc.Constants;
import io.agora.rtc.IRtcEngineEventHandler;
import io.agora.rtc.RtcEngine;
import io.agora.rtc.video.VideoCanvas;
import io.agora.rtc.video.VideoEncoderConfiguration;
public class AgoraManager {
private static AgoraManager instance;
private RtcEngine mRtcEngine;
private SparseArray<SurfaceView> mSurfaceViews;
private int localUid;
private int remoteUid;
private OnMediaListener listener;
private AgoraManager() {
}
public static synchronized AgoraManager getInstance() {
if (null == instance) {
synchronized (AgoraManager.class) {
if (null == instance) {
instance = new AgoraManager();
}
}
}
return instance;
}
/**
* 初始化
*
* @param context
*/
public void init(Context context) {
try {
mRtcEngine = RtcEngine.create(context, context.getResources().getString(R.string.agora_app_id), mHandler);
mRtcEngine.setChannelProfile(Constants.CHANNEL_PROFILE_COMMUNICATION);
mSurfaceViews = new SparseArray<>();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 加入房间
*
* @param channelName
* @param uid
*/
public void joinChannel(String channelName, int uid) {
mRtcEngine.joinChannel(null, channelName, null, uid);
}
/**
* 设置本地视频
*
* @param context
* @param uid
*/
public void setupLocalVideo(Context context, int uid) {
localUid = uid;
SurfaceView surfaceView = RtcEngine.CreateRendererView(context);
surfaceView.setZOrderMediaOverlay(true);
mRtcEngine.setupLocalVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_FIT, uid));
mSurfaceViews.put(uid, surfaceView);
}
/**
* 设置远端视频
*
* @param context
* @param uid
*/
public void setupRemoteVideo(Context context, int uid) {
remoteUid = uid;
SurfaceView surfaceView = RtcEngine.CreateRendererView(context);
mRtcEngine.setupRemoteVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_FIT, uid));
mSurfaceViews.put(uid, surfaceView);
}
/**
* 离开房间
*/
public void leaveChannel() {
mRtcEngine.leaveChannel();
}
/**
* 配置适配
*/
public void setVideoConfig() {
mRtcEngine.enableVideo();
VideoEncoderConfiguration.ORIENTATION_MODE orientationMode =
VideoEncoderConfiguration.ORIENTATION_MODE.ORIENTATION_MODE_FIXED_PORTRAIT;
VideoEncoderConfiguration.VideoDimensions dimensions =
new VideoEncoderConfiguration.VideoDimensions(360, 640);
VideoEncoderConfiguration.FRAME_RATE frameRate =
VideoEncoderConfiguration.FRAME_RATE.FRAME_RATE_FPS_30;
VideoEncoderConfiguration videoEncoderConfiguration =
new VideoEncoderConfiguration(dimensions, frameRate, VideoEncoderConfiguration.STANDARD_BITRATE, orientationMode);
mRtcEngine.setVideoEncoderConfiguration(videoEncoderConfiguration);
}
/**
* 获取本地视频
*
* @return
*/
public SurfaceView getLocalSurfaceView() {
return mSurfaceViews.get(localUid);
}
/**
* 获取远端视频
*
* @return
*/
public SurfaceView getRemoteSurfaceView() {
return mSurfaceViews.get(remoteUid);
}
/**
* 回调接口
*/
private IRtcEngineEventHandler mHandler = new IRtcEngineEventHandler() {
@Override
public void onJoinChannelSuccess(String channel, int uid, int elapsed) {
if (null != listener) {
listener.onJoinSuccess(channel, uid, elapsed);
}
}
@Override
public void onRejoinChannelSuccess(String channel, int uid, int elapsed) {
if (null != listener) {
listener.onRejoinSuccess(channel, uid, elapsed);
}
}
@Override
public void onLeaveChannel(RtcStats stats) {
if (null != listener) {
listener.onLeaveChannel(stats);
}
}
@Override
public void onUserJoined(int uid, int elapsed) {
if (null != listener) {
listener.onUserJoined(uid, elapsed);
}
}
@Override
public void onUserOffline(int uid, int reason) {
if (null != listener) {
listener.onUserOffline(uid, reason);
}
}
};
/**
* 通话时的接口
*/
public interface OnMediaListener {
void onJoinSuccess(String channel, int uid, int elapsed);
void onRejoinSuccess(String channel, int uid, int elapsed);
void onLeaveChannel(IRtcEngineEventHandler.RtcStats stats);
void onUserJoined(int uid, int elapsed);
void onUserOffline(int uid, int reason);
}
/**
* 设置通话时的接口回调
*
* @param listener
*/
public void setOnMedialistener(OnMediaListener listener) {
this.listener = listener;
}
}
接下来我们就去Activity中调用了
一般步骤:
- Application中初始化AgoraManager
- 给自己设置一个Uid,进入音视频通话Activity,注册监听,并调用AgoraManager加入房间
- 在收到加入房间成功的回调后,设置本地图像,并显示
- 在收到有用户加入房间的回调后,为对方设置远端图像,并显示
- 想要退出房间,则调用AgoraManager的退出房间方法
- 在收到有用户退出房间的回调后,将其图像销毁
大概流程就是这样。
今天是我日更的第100天,也算是达到了一个小目标,从今天开始,我就要从日更改为不定期更,数量可能会少,但质量绝对不会差,期待一个更成熟的我吧。