# Core features The Video SDK for Android lets you programmatically control user video during a session: check video status, start video, stop video, and render one or many users. For switching, mirroring, rotating, and other per-device camera operations, see [Camera controls](/docs/video-sdk/android/video/camera-controls/). > **Camera permission required.** > > Before using video, your app must request the `CAMERA` runtime permission. For the runtime-permission flow, see the [Android permissions overview](https://developer.android.com/guide/topics/permissions/overview). ## Check whether video is on To check whether a user has their video on, call `isOn` on `videoStatus` to get a boolean response indicating whether the user has their video on or not in the session. ```kotlin val isVideoOn = user.videoCanvas.videoStatus.isOn ``` ```java boolean isVideoOn = user.getVideoCanvas().getVideoStatus().isOn(); ``` ## Start video Start video by calling `startVideo()` on the `VideoHelper`. Be sure your app has been granted `CAMERA` permission before calling or the SDK can't capture from the camera. ```kotlin val videoHelper = ZoomVideoSDK.getInstance().videoHelper videoHelper.startVideo() ``` ```java ZoomVideoSDKVideoHelper videoHelper = ZoomVideoSDK.getInstance().getVideoHelper(); videoHelper.startVideo(); ``` ## Stop video Stop video by calling `stopVideo()` on the `VideoHelper`. ```kotlin ZoomVideoSDK.getInstance().videoHelper.stopVideo() ``` ```java ZoomVideoSDK.getInstance().getVideoHelper().stopVideo(); ``` ## Render a user's video To render a user's video, get the user's `ZoomVideoSDKVideoCanvas` and subscribe a `ZoomVideoSDKVideoView` to it. The view can be created programmatically or declared in XML. ```kotlin val videoView = ZoomVideoSDKVideoView(this) val canvas = user.videoCanvas canvas.subscribe(videoView, ZoomVideoSDKVideoAspect.ZoomVideoSDKVideoAspect_Original) ``` ```java ZoomVideoSDKVideoView videoView = new ZoomVideoSDKVideoView(this); ZoomVideoSDKVideoCanvas canvas = user.getVideoCanvas(); canvas.subscribe(videoView, ZoomVideoSDKVideoAspect.ZoomVideoSDKVideoAspect_Original); ``` ```xml ``` The `aspect` parameter controls how Zoom fits the video into the view. | Type | Description | | ------------------------------------- | ---------------------------------------------------------------------------------------- | | `ZoomVideoSDKVideoAspect_Original` | Display video without any modifications. | | `ZoomVideoSDKVideoAspect_Full_Filled` | Stretch the video to fill the canvas. | | `ZoomVideoSDKVideoAspect_LetterBox` | Add black bars (top/bottom or left/right) so the full frame is visible without cropping. | | `ZoomVideoSDKVideoAspect_PanAndScan` | Crop the frame to fill the canvas without bars. | For more on choosing an aspect mode and on responsive layouts, see [Aspect ration and orientation](/docs/video-sdk/android/video/best-practices/#aspect-ratio-and-orientation). ### Remove a user's video from a canvas When a user leaves the session, or when you want to recycle a `ZoomVideoSDKVideoView` for a different user, unsubscribe from the canvas. ```kotlin videoCanvas.unsubscribe(videoView) ``` ```java videoCanvas.unsubscribe(videoView); ``` ## Render multiple users To render multiple users at once (gallery view), iterate over the users in the session and subscribe a `ZoomVideoSDKVideoView` for each. Respond to `onUserJoin` to add new users as they enter, and `onUserLeave` to unsubscribe. ```kotlin override fun onUserJoin(userHelper: ZoomVideoSDKUserHelper, userList: MutableList) { userList.forEach { user -> val videoView = ZoomVideoSDKVideoView(this@MyActivity) user.videoCanvas.subscribe(videoView, ZoomVideoSDKVideoAspect.ZoomVideoSDKVideoAspect_Original) // add videoView to your gallery container } } override fun onUserLeave(userHelper: ZoomVideoSDKUserHelper, userList: MutableList) { userList.forEach { user -> // unsubscribe and remove the corresponding view from the container } } ``` ```java @Override public void onUserJoin(ZoomVideoSDKUserHelper userHelper, List userList) { for (ZoomVideoSDKUser user : userList) { ZoomVideoSDKVideoView videoView = new ZoomVideoSDKVideoView(this); user.getVideoCanvas().subscribe(videoView, ZoomVideoSDKVideoAspect.ZoomVideoSDKVideoAspect_Original); // add videoView to your gallery container } } @Override public void onUserLeave(ZoomVideoSDKUserHelper userHelper, List userList) { for (ZoomVideoSDKUser user : userList) { // unsubscribe and remove the corresponding view from the container } } ``` For grid layout, density recommendations, and pagination guidance, see [Layout and density](/docs/video-sdk/android/video/best-practices/#layout-and-density).