# 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).