Kotlin

Demande d'autorisations

Comme notre appli utilise l'audio et la vidéo de l'appareil de l'utilisateur, nous devrons ajouter un peu de code pour demander les autorisations audio et vidéo. Nous utiliserons accompanist pour simplifier le processus.

  1. Ajouter des autorisations à AndroidManifest.xml

À l'intérieur de votre AndroidManifest.xmlajouter ce qui suit à l'intérieur du <manifest> étiquette:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

ℹ️ Remarque : Les WAKE_LOCK est utilisée pour empêcher l'appareil de s'endormir pendant un appel vidéo. Cela permet d'assurer une diffusion ininterrompue de contenus multimédias.

  1. Ajouter des dépendances et des autorisations manifestes

Tout d'abord, ajoutez le Accompanist à la dépendance à l'égard de votre build.gradle fichier :

dependencies {
   implementation("com.google.accompanist:accompanist-permissions:0.34.0")
}
  1. Mise en œuvre de la gestion des autorisations dans compose

Avec Accompanistnous utilisons rememberMultiplePermissionsState. Cela permet à l'interface utilisateur de réagir automatiquement lorsque des autorisations sont accordées ou refusées. Créer un nouveau fichier VideoChatPermissionWrapper.kt comme suit :

@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. Mise à jour MainActivity.kt & définir le initializeSession() en tant que placeholder pour la configuration de votre appel vidéo"

Intégrez maintenant cela dans votre activité principale. Appelez simplement votre VideoChatPermissionWrapper à l'intérieur de 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. Prochaines étapes

Une fois les autorisations accordées, le initializeSession() sera déclenchée. Dans les prochaines étapes du didacticiel, vous mettrez en œuvre la logique de connexion à une session Video API de Vonage.