Kotlin

Requesting permissions

Because our app uses audio and video from the user's device, we’ll need to add some code to request audio and video permissions. We'll use accompanist to make the process simple.

  1. Add permissions to AndroidManifest.xml

Inside your AndroidManifest.xml, add the following inside the <manifest> tag:

ℹ️ Note: The WAKE_LOCK permission is used to keep the device from sleeping during a video call. This ensures uninterrupted media streaming.

  1. Add dependencies and manifest permissions

First, add the Accompanist dependency to your build.gradle file:

dependencies {
   implementation("com.google.accompanist:accompanist-permissions:0.34.0")
}
  1. Implement permission handling in compose

With Accompanist, we use rememberMultiplePermissionsState. This allows the UI to automatically react when permissions are granted or denied. Create a new file VideoChatPermissionWrapper.kt as follows:

@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun VideoChatPermissionWrapper(
    onPermissionsGranted: () -> Unit,
    content: @Composable () -> Unit
) {
    val permissionsState = rememberMultiplePermissionsState(
        permissions = listOf(
            Manifest.permission.CAMERA,
            Manifest.permission.RECORD_AUDIO
        )
    )

    if (permissionsState.allPermissionsGranted) {
        // 1. Notify parent that permissions are ready (run once)
        LaunchedEffect(Unit) {
            onPermissionsGranted()
        }
        // 2. Show the actual video UI
        content()
    } else {
        // 3. Show a Rationale UI if permissions are missing
        Column(
            modifier = Modifier
                .fillMaxSize()
                .padding(16.dp),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(text = "Camera and Audio permissions are required for video chat.")

            Button(
                onClick = { permissionsState.launchMultiplePermissionRequest() },
                modifier = Modifier.padding(top = 16.dp)
            ) {
                Text("Grant Permissions")
            }
        }

        // Auto-launch the popup on the very first composition
        LaunchedEffect(Unit) {
            if (!permissionsState.allPermissionsGranted) {
                permissionsState.launchMultiplePermissionRequest()
            }
        }
    }
}
  1. Update MainActivity.kt & define the initializeSession() method as a placeholder for your video call setup"

Now, integrate this into your MainActivity. Simply call your VideoChatPermissionWrapper inside setContent.

class MainActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        enableEdgeToEdge()

        setContent {
            VideoChatPermissionWrapper(
                onPermissionsGranted = {
                    initializeSession(
                        appId = VonageVideoConfig.APP_ID,
                        sessionId = VonageVideoConfig.SESSION_ID,
                        token = VonageVideoConfig.TOKEN
                    )
                }
            ) {
                VideoChatScreen(
                    publisherView = publisherView,
                    subscriberView = subscriberView
                )
            }
        }
    }


    private fun initializeSession(appId: String, sessionId: String, token: String) {
        // TODO: Connect to Vonage session
    }
}
  1. Next Steps

Once permissions are granted, the initializeSession() function will be triggered. In the next steps of the tutorial, you'll implement the logic to connect to a Vonage Video API session.