






dependencies {// RTC Engine Lite Edition SDK, including 2 features, RTC Engine and live streaming, and being compact in sizeimplementation 'com.tencent.liteav:LiteAVSDK_TRTC:latest.release'// RTC Engine LiteAVSDK_Professional SDK, with additional features such as live stream, short video, and video-on-demand, slightly large in size// implementation 'com.tencent.liteav:LiteAVSDK_Professional:latest.release'// Beauty AR SDK, for example: S1-07 package as followsimplementation 'com.tencent.mediacloud:TencentEffect_S1-07:latest.release'}
defaultConfig {ndk {abiFilters "armeabi-v7a", "arm64-v8a"}}
../assets/MotionRes.../assets/lut.<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.CAMERA" /><uses-feature android:name="android.hardware.camera.autofocus" />
android:hardwareAccelerated="false". Disabling hardware acceleration will result in failure to render the other party's video stream.targetSdkVersion is 31 or higher, or if the target device runs Android 12 or a newer version, the official requirement is to dynamically request android.permission.BLUETOOTH_CONNECT permission in the code to use the Bluetooth feature properly. For more information, see Bluetooth Permissions.-keep class com.tencent.** { *; }-keep class org.light.** { *;}-keep class org.libpag.** { *;}-keep class org.extra.** { *;}-keep class com.gyailib.**{ *;}-keep class androidx.exifinterface.** { *;}

import com.tencent.xmagic.telicense.TELicenseCheck;// If the purpose is just to trigger the download or update of the License, and not to care about the authentication result, then null is passed in for the fourth parameter.TELicenseCheck.getInstance().setTELicense(context, URL, KEY, new TELicenseCheck.TELicenseCheckListener() {@Overridepublic void onLicenseCheckFinish(int errorCode, String msg) {// Note: This callback does not necessarily be called on the calling thread.if (errorCode == TELicenseCheck.ERROR_OK) {// Authentication successful.} else {// Authentication failed.}}});
// Create an RTC Engine SDK instance (singleton mode)TRTCCloud mTRTCCloud = TRTCCloud.sharedInstance(context);// Set event listeners.mTRTCCloud.addListener(trtcSdkListener);// Notifications from various SDK events (e.g., error codes, warning codes, audio and video status parameters, etc.).private TRTCCloudListener trtcSdkListener = new TRTCCloudListener() {@Overridepublic void onError(int errCode, String errMsg, Bundle extraInfo) {Log.d(TAG, errCode + errMsg);}@Overridepublic void onWarning(int warningCode, String warningMsg, Bundle extraInfo) {Log.d(TAG, warningCode + warningMsg);}};// Remove event listener.mTRTCCloud.removeListener(trtcSdkListener);// Terminate the RTC Engine SDK instance (singleton mode)TRTCCloud.destroySharedInstance();
import com.tencent.xmagic.XmagicApi;// Initialize the beauty SDK.XmagicApi mXmagicApi = new XmagicApi(context, XmagicResParser.getResPath(), new XmagicApi.OnXmagicPropertyErrorListener());// During development and debugging, you can set the log level to DEBUG. For release packages, set it to WARN to avoid impacting performance.mXmagicApi.setXmagicLogLevel(Log.WARN);// Release the beauty SDK. This method needs to be called on the GL thread.mXmagicApi.onDestroy();
<com.tencent.rtmp.ui.TXCloudVideoViewandroid:id="@+id/live_cloud_view_main"android:layout_width="match_parent"android:layout_height="match_parent" />
TextureView or SurfaceView as the view rendering control, please refer to Advanced Features - View Rendering.// Obtain the video rendering control for displaying the anchor's local video preview.TXCloudVideoView mTxcvvAnchorPreviewView = findViewById(R.id.live_cloud_view_main);// Set video encoding parameters to determine the picture quality seen by remote users.TRTCCloudDef.TRTCVideoEncParam encParam = new TRTCCloudDef.TRTCVideoEncParam();encParam.videoResolution = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_960_540;encParam.videoFps = 15;encParam.videoBitrate = 1300;encParam.videoResolutionMode = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT;mTRTCCloud.setVideoEncoderParam(encParam);// boolean mIsFrontCamera can specify using the front/rear camera for video capture.mTRTCCloud.startLocalPreview(mIsFrontCamera, mTxcvvAnchorPreviewView);// Here you can specify the audio quality, from low to high as SPEECH/DEFAULT/MUSIC.mTRTCCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_DEFAULT);
enterRoom. The SDK will only start the camera preview and audio capture, and wait until you call enterRoom to start streaming.enterRoom. The SDK will start the camera preview and audio capture and automatically start streaming.TRTCCloudDef.TRTCRenderParams params = new TRTCCloudDef.TRTCRenderParams();params.mirrorType = TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_AUTO; // Video mirror modeparams.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FILL; // Video fill modeparams.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_0; // Video rotation angle// Set the rendering parameters for the local video.mTRTCCloud.setLocalRenderParams(params);// Set the video mirror mode for the encoder output.mTRTCCloud.setVideoEncoderMirror(boolean mirror);// Set the rotation of the video encoder output.mTRTCCloud.setVideoEncoderRotation(int rotation);
public void enterRoomByAnchor(String roomId, String userId) {TRTCCloudDef.TRTCParams params = new TRTCCloudDef.TRTCParams();// Take the room ID string as an example.params.strRoomId = roomId;params.userId = userId;// UserSig obtained from the business backend.params.userSig = getUserSig(userId);// Replace with your SDKAppID.params.sdkAppId = SDKAppID;// Specify the anchor role.params.role = TRTCCloudDef.TRTCRoleAnchor;// Enter the room in an interactive live streaming scenario.mTRTCCloud.enterRoom(params, TRTCCloudDef.TRTC_APP_SCENE_LIVE);}// Event callback for the result of entering the room.@Overridepublic void onEnterRoom(long result) {if (result > 0) {// result indicates the time taken (in milliseconds) to join the room.Log.d(TAG, "Enter room succeed");} else {// result indicates the error code when you fail to enter the room.Log.d(TAG, "Enter room failed");}}
roomId and string type strRoomId. Rooms of different types are not interconnected. It is advisable to unify the room ID type.TRTC_APP_SCENE_LIVE as the room entry mode.public void enterRoomByAudience(String roomId, String userId) {TRTCCloudDef.TRTCParams params = new TRTCCloudDef.TRTCParams();// Take the room ID string as an example.params.strRoomId = roomId;params.userId = userId;// UserSig obtained from the business backend.params.userSig = getUserSig(userId);// Replace with your SDKAppID.params.sdkAppId = SDKAppID;// Specify the audience role.params.role = TRTCCloudDef.TRTCRoleAudience;// Enter the room in an interactive live streaming scenario.mTRTCCloud.enterRoom(params, TRTCCloudDef.TRTC_APP_SCENE_LIVE);}// Event callback for the result of entering the room.@Overridepublic void onEnterRoom(long result) {if (result > 0) {// result indicates the time taken (in milliseconds) to join the room.Log.d(TAG, "Enter room succeed");} else {// result indicates the error code when you fail to enter the room.Log.d(TAG, "Enter room failed");}}
@Overridepublic void onUserAudioAvailable(String userId, boolean available) {// The remote user publishes/unpublishes their audio.// Under the automatic subscription mode, you do not need to do anything. The SDK will automatically play the remote user's audio.}@Overridepublic void onUserVideoAvailable(String userId, boolean available) {// The remote user publishes/unpublishes the primary video.if (available) {// Subscribe to the remote user's video stream and bind the video rendering control.mTRTCCloud.startRemoteView(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, TXCloudVideoView view);} else {// Unsubscribe to the remote user's video stream and release the rendering control.mTRTCCloud.stopRemoteView(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG);}}
TRTCCloudDef.TRTCRenderParams params = new TRTCCloudDef.TRTCRenderParams();params.mirrorType = TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_AUTO; // Video mirror modeparams.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FILL; // Video fill modeparams.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_0; // Video rotation angle// Set the rendering mode for the remote video.mTRTCCloud.setRemoteRenderParams(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, params)
// Switched to the anchor role.mTRTCCloud.switchRole(TRTCCloudDef.TRTCRoleAnchor);// Event callback for switching the role.@Overridepublic void onSwitchRole(int errCode, String errMsg) {if (errCode == TXLiteAVCode.ERR_NULL) {// Role switched successfully.}}
// Obtain the video rendering control for displaying the co-broadcasting audience's local video preview.TXCloudVideoView mTxcvvAudiencePreviewView = findViewById(R.id.live_cloud_view_sub);// Set video encoding parameters to determine the picture quality seen by remote users.TRTCCloudDef.TRTCVideoEncParam encParam = new TRTCCloudDef.TRTCVideoEncParam();encParam.videoResolution = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_480_270;encParam.videoFps = 15;encParam.videoBitrate = 550;encParam.videoResolutionMode = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT;mTRTCCloud.setVideoEncoderParam(encParam);// boolean mIsFrontCamera can specify using the front/rear camera for video capture.mTRTCCloud.startLocalPreview(mIsFrontCamera, mTxcvvAudiencePreviewView);// Here you can specify the audio quality, from low to high as SPEECH/DEFAULT/MUSIC.mTRTCCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_DEFAULT);
// Switched to the audience role.mTRTCCloud.switchRole(TRTCCloudDef.TRTCRoleAudience);// Event callback for switching the role.@Overridepublic void onSwitchRole(int errCode, String errMsg) {if (errCode == TXLiteAVCode.ERR_NULL) {// Stop camera capture and streaming.mTRTCCloud.stopLocalPreview();// Stop microphone capture and streaming.mTRTCCloud.stopLocalAudio();}}
public void exitRoom() {mTRTCCloud.stopLocalAudio();mTRTCCloud.stopLocalPreview();mTRTCCloud.exitRoom();}// Event callback for exiting the room.@Overridepublic void onExitRoom(int reason) {if (reason == 0) {Log.d(TAG, "Actively call exitRoom to exit the room.");} else if (reason == 1) {Log.d(TAG, "Removed from the current room by the server.");} else if (reason == 2) {Log.d(TAG, "The current room has been dissolved.");}}
onExitRoom callback notification to inform you.enterRoom again or switch to another audio/video SDK, wait for the onExitRoom callback before proceeding. Otherwise, you may encounter exceptions such as the camera or microphone being forcefully occupied.DismissRoom (distinguish between numeric room ID and string room ID). You can call this API to remove all users from the room and dissolve the room.exitRoom of each client. After room exit, the room will be automatically dissolved according to RTC Engine room lifecycle rules. For details, see Exit the Room.public void connectOtherRoom(String roomId, String userId) {try {JSONObject jsonObj = new JSONObject();? ? // The digit room ID is roomId.jsonObj.put("strRoomId", roomId);jsonObj.put("userId", userId);mTRTCCloud.ConnectOtherRoom(jsonObj.toString());} catch (JSONException e) {e.printStackTrace();}}// Result callback for requesting cross-room mic-connection.@Overridepublic void onConnectOtherRoom(String userId, int errCode, String errMsg) {// The user ID of the anchor in the other room you want to initiate the cross-room link-up.// Error code. ERR_NULL indicates the request is successful.// Error message.}
@Overridepublic void onUserAudioAvailable(String userId, boolean available) {// The remote user publishes/unpublishes their audio.// Under the automatic subscription mode, you do not need to do anything. The SDK will automatically play the remote user's audio.}@Overridepublic void onUserVideoAvailable(String userId, boolean available) {// The remote user publishes/unpublishes the primary video.if (available) {// Subscribe to the remote user's video stream and bind the video rendering control.mTRTCCloud.startRemoteView(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG, TXCloudVideoView view);} else {// Unsubscribe to the remote user's video stream and release the rendering control.mTRTCCloud.stopRemoteView(userId, TRTCCloudDef.TRTC_VIDEO_STREAM_TYPE_BIG);}}
// Exit the cross-room mic-connection.mTRTCCloud.DisconnectOtherRoom();// Result callback for exiting cross-room mic-connection.@Overridepublic void onDisConnectOtherRoom(int errCode, String errMsg) {super.onDisConnectOtherRoom(errCode, errMsg);}
DisconnectOtherRoom(), you may exit the cross-room mic-connection PK with all other room anchors.DisconnectOtherRoom() to exit the cross-room mic-connection PK.XmagicResParser.setResPath(new File(getFilesDir(), "xmagic").getAbsolutePath());//loading// Copy resource files to the private directory. Only need to do it once.XmagicResParser.copyRes(getApplicationContext());
XmagicResParser.setResPath(local path of the downloaded resource file);
mTRTCCloud.setLocalVideoProcessListener(TRTCCloudDef.TRTC_VIDEO_PIXEL_FORMAT_Texture_2D, TRTCCloudDef.TRTC_VIDEO_BUFFER_TYPE_TEXTURE, new TRTCCloudListener.TRTCVideoFrameListener() {@Overridepublic void onGLContextCreated() {// The OpenGL environment has already been set up internally within the SDK. At this point, the initialization of third-party beauty features can be done.if (mXmagicApi == null) {XmagicApi mXmagicApi = new XmagicApi(context, XmagicResParser.getResPath(), new XmagicApi.OnXmagicPropertyErrorListener());} else {mXmagicApi.onResume();}}@Overridepublic int onProcessVideoFrame(TRTCCloudDef.TRTCVideoFrame srcFrame, TRTCCloudDef.TRTCVideoFrame dstFrame) {// Callback for integrating with third-party beauty components for video processing.if (mXmagicApi != null) {dstFrame.texture.textureId = mXmagicApi.process(srcFrame.texture.textureId, srcFrame.width, srcFrame.height);}return 0;}@Overridepublic void onGLContextDestory() {// The internal OpenGL environment within the SDK has been terminated. At this point, proceed to clean up resources for third-party beauty features.mXmagicApi.onDestroy();}});
public void enableDualStreamMode(boolean enable) {// Video encoding parameters for the small-screen stream (customizable).TRTCCloudDef.TRTCVideoEncParam smallVideoEncParam = new TRTCCloudDef.TRTCVideoEncParam();smallVideoEncParam.videoResolution = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_480_270;smallVideoEncParam.videoFps = 15;smallVideoEncParam.videoBitrate = 550;smallVideoEncParam.videoResolutionMode = TRTCCloudDef.TRTC_VIDEO_RESOLUTION_MODE_PORTRAIT;mTRTCCloud.enableEncSmallVideoStream(enable, smallVideoEncParam);}
// Optional video stream types when subscribing to a remote user's video stream.mTRTCCloud.startRemoteView(userId, streamType, videoView);// You can switch the size of the specified remote user's screen at any time.mTRTCCloud.setRemoteVideoStreamType(userId, streamType);
TRTC_VIDEO_STREAM_TYPE_SMALL with streamType to pull a low-quality small video for viewing.TXCloudVideoView is used as the video rendering control, and both SurfaceView and TextureView rendering solutions are supported. Below are the methods for specifying the type of the rendering control and updating the video rendering control.TXCloudVideoView, you can code as follows.// Mandatory use ofTextureView.TextureView textureView = findViewById(R.id.texture_view);TXCloudVideoView cloudVideoView = new TXCloudVideoView(context);cloudVideoView.addVideoView(textureView);// Mandatory use ofSurfaceView.SurfaceView surfaceView = findViewById(R.id.surface_view);TXCloudVideoView cloudVideoView = new TXCloudVideoView(surfaceView);
// Update local preview screen rendering control.mTRTCCloud.updateLocalView(videoView);// Update the remote user's video rendering control.mTRTCCloud.updateRemoteView(userId, streamType, videoView);
videoView as the target video rendering control. streamType only supports TRTC_VIDEO_STREAM_TYPE_BIG and TRTC_VIDEO_STREAM_TYPE_SUB.// Construct the like message body.JSONObject jsonObject = new JSONObject();try {jsonObject.put("cmd", "like_msg");JSONObject msgJsonObject = new JSONObject();msgJsonObject.put("type", 1); // Likes type.msgJsonObject.put("likeCount", 10); // Number of likes.jsonObject.put("msg", msgJsonObject);} catch (JSONException e) {e.printStackTrace();}String data = jsonObject.toString();// Send custom group messages (it is recommended that like messages should be set to low priority).V2TIMManager.getInstance().sendGroupCustomMessage(data.getBytes(), mRoomId,V2TIMMessage.V2TIM_PRIORITY_LOW, new V2TIMValueCallback<V2TIMMessage>() {@Overridepublic void onError(int i, String s) {// Failed to send like messages.}@Overridepublic void onSuccess(V2TIMMessage v2TIMMessage) {// Like messages sent successfully.// Local rendering of likes effect.}});
// Custom group messages received.V2TIMManager.getInstance().addSimpleMsgListener(new V2TIMSimpleMsgListener() {@Overridepublic void onRecvGroupCustomMessage(String msgID, String groupID, V2TIMGroupMemberInfo sender, byte[] customData) {String customStr = new String(customData);if (!customStr.isEmpty()) {try {JSONObject jsonObject = new JSONObject(customStr);String command = jsonObject.getString("cmd");JSONObject messageJsonObject = jsonObject.getJSONObject("msg");if (command.equals("like_msg")) {int type = messageJsonObject.getInt("type"); // Likes type.int likeCount = messageJsonObject.getInt("likeCount"); // Number of likes.// Render likes effect based on likes type and count.}} catch (JSONException e) {e.printStackTrace();}}}});
https://xxxxxx/v4/group_open_http_svc/send_group_msg?sdkappid=88888888&identifier=admin&usersig=xxx&random=99999999&contenttype=json
{"GroupId": "@TGS#12DEVUDHQ","Random": 2784275388,"MsgPriority": "High", // The priority of the message. Gift messages should be set to high priority."MsgBody": [{"MsgType": "TIMCustomElem","MsgContent": {// type: gift type; giftUrl: gift resource URL; giftName: gift name; giftCount: number of gifts."Data": "{\\"cmd\\": \\"gift_msg\\", \\"msg\\": {\\"type\\": 1, \\"giftUrl\\": \\"xxx\\", \\"giftName\\": \\"xxx\\", \\"giftCount\\": 1}}"}}]}
// Custom group messages received.V2TIMManager.getInstance().addSimpleMsgListener(new V2TIMSimpleMsgListener() {@Overridepublic void onRecvGroupCustomMessage(String msgID, String groupID, V2TIMGroupMemberInfo sender, byte[] customData) {String customStr = new String(customData);if (!customStr.isEmpty()) {try {JSONObject jsonObject = new JSONObject(customStr);String command = jsonObject.getString("cmd");JSONObject messageJsonObject = jsonObject.getJSONObject("msg");if (command.equals("gift_msg")) {int type = messageJsonObject.getInt("type"); // Gift type.int giftCount = messageJsonObject.getInt("giftCount"); // Number of gifts.String giftUrl = messageJsonObject.getString("giftUrl"); // Gift resource URL.String giftName = messageJsonObject.getString("giftName"); // Gift name.// Render gift effects based on gift type, count, resource URL, and name.}} catch (JSONException e) {e.printStackTrace();}}}});
// Send public screen bullet screen messages.V2TIMManager.getInstance().sendGroupTextMessage(text, groupID, V2TIMMessage.V2TIM_PRIORITY_NORMAL, new V2TIMValueCallback<V2TIMMessage>() {@Overridepublic void onError(int i, String s) {// Failed to send bullet screen messages.}@Overridepublic void onSuccess(V2TIMMessage v2TIMMessage) {// Successfully sent bullet screen messages.// Local display of the message text.}});// Receive public screen bullet screen messages.V2TIMManager.getInstance().addSimpleMsgListener(new V2TIMSimpleMsgListener() {@Overridepublic void onRecvGroupTextMessage(String msgID, String groupID, V2TIMGroupMemberInfo sender, String text) {// Render bullet screen messages based on sender and message text.}});
onError callback. For details, see Error Code Table.Enumeration | Value | Description |
ERR_TRTC_INVALID_USER_SIG | -3320 | Room entry parameter UserSig is incorrect. Check if TRTCParams.userSig is empty. |
ERR_TRTC_USER_SIG_CHECK_FAILED | -100018 | UserSig verification failed. Check if the parameter TRTCParams.userSig is filled in correctly or has expired. |
Enumeration | Value | Description |
ERR_TRTC_CONNECT_SERVER_TIMEOUT | -3308 | Room entry request timed out. Check if your internet connection is lost or if a VPN is enabled. You may also attempt to switch to 4G for testing. |
ERR_TRTC_INVALID_SDK_APPID | -3317 | Room entry parameter sdkAppId is incorrect. Check if TRTCParams.sdkAppId is empty. |
ERR_TRTC_INVALID_ROOM_ID | -3318 | Room entry parameter roomId is incorrect. Check if TRTCParams.roomId or TRTCParams.strRoomId is empty. Note that roomId and strRoomId cannot be used interchangeably. |
ERR_TRTC_INVALID_USER_ID | -3319 | Room entry parameter userId is incorrect. Check if TRTCParams.userId is empty. |
ERR_TRTC_ENTER_ROOM_REFUSED | -3340 | Room entry request denied. Check if enterRoom is called consecutively to enter a room with the same ID. |
Enumeration | Value | Description |
ERR_CAMERA_START_FAIL | -1301 | Failed to open the camera. For example, if there is an exception for the camera's configuration program (driver) on a Windows or macOS device, you should try disabling then re-enabling the device, restarting the machine, or updating the configuration program. |
ERR_MIC_START_FAIL | -1302 | Failed to open the mic. For example, if there is an exception for the mic's configuration program (driver) on a Windows or macOS device, you should try disabling then re-enabling the device, restarting the machine, or updating the configuration program. |
ERR_CAMERA_NOT_AUTHORIZED | -1314 | The device of camera is unauthorized. This typically occurs on mobile devices and may be due to the user having denied the permission. |
ERR_MIC_NOT_AUTHORIZED | -1317 | The device of mic is unauthorized. This typically occurs on mobile devices and may be due to the user having denied the permission. |
ERR_CAMERA_OCCUPY | -1316 | The camera is occupied. Try a different camera. |
ERR_MIC_OCCUPY | -1319 | The mic is occupied. This occurs when, for example, the user is currently having a call on the mobile device. |
setLocalRenderParams and video encoding mirror setVideoEncoderMirror. These mirrors separately affect the mirror effect of the local preview video and that of the video encoding output video (the mirror mode for remote audiences and on-cloud recordings). If you expect the mirror effect seen in the local preview to also take effect on the remote audiences' end, follow the following encoding procedures.// Set the rendering parameters for the local video.TRTCCloudDef.TRTCRenderParams params = new TRTCCloudDef.TRTCRenderParams();params.mirrorType = TRTCCloudDef.TRTC_VIDEO_MIRROR_TYPE_ENABLE; // Video mirror modeparams.fillMode = TRTCCloudDef.TRTC_VIDEO_RENDER_MODE_FILL; // Video fill modeparams.rotation = TRTCCloudDef.TRTC_VIDEO_ROTATION_0; // Video rotation anglemTRTCCloud.setLocalRenderParams(params);// Set the video mirror mode for the encoder output.mTRTCCloud.setVideoEncoderMirror(true);
// Get the maximum zoom factor for the camera (only for mobile devices).float zoomRatio = mTRTCCloud.getDeviceManager().getCameraZoomMaxRatio();// Set the zoom factor for the camera (only for mobile devices).// Value range is 1 - 5. 1 means the furthest field of view (normal lens), and 5 means the closest field of view (zoom lens). The maximum recommended value is 5, exceeding this may result in blurry video.mTRTCCloud.getDeviceManager().setCameraZoomRatio(zoomRatio);
// Enable or disable the camera's autofocus feature (only for mobile devices).mTRTCCloud.getDeviceManager().enableCameraAutoFocus(false);// Set the focus position of the camera (only for mobile devices).// The precondition for using this API is to first disable the autofocus feature using enableCameraAutoFocus.mTRTCCloud.getDeviceManager().setCameraFocusPosition(int x, int y);
// Determine if the current camera is the front camera (only for mobile devices).boolean isFrontCamera = mTRTCCloud.getDeviceManager().isFrontCamera();// Switch to front or rear cameras (only for mobile devices).// Passing true means switching to front, and passing false means switching to rear.mTRTCCloud.getDeviceManager().switchCamera(!isFrontCamera);
Feedback