# Make an audio call This guide shows you how to make an audio call in your Android app. We assume you have already set up your Android app with the In‑app Calling SDK. If you haven't already, first [create an app](/docs/in-app-calling/getting-started/android/create-app). Or, if you prefer, continue to [handle incoming calls](/docs/in-app-calling/getting-started/android/receive-call). ## Set up the UI Before you can make a call, you need to set up the app's UI. The UI for placing a call is handled inside a dedicated activity: `PlaceCallActivity` (earlier references to `LoggedInActivity` in some samples serve broader post‑login functionality). Define this activity inside your `AndroidManifest.xml` file. `app/src/main/AndroidManifest.xml` ```xml ``` ## Initiate an audio call 1. Similarly to `LoginActivity`, create a basic layout containing an input field for the callee username and a button that initiates the call. `app/src/main/res/layout/main.xml` ```xml ``` 1. Inside `SinchService`'s binder implementation, add a method that uses the call controller to initiate the call: `app/src/main/java/com/sinch/rtc/sample/push/SinchService.kt` ```kotlin fun callUser(userId: String): Call { val sinchClient = sinchClient ?: throw IllegalStateException("Sinch client is not created") return sinchClient.callController.callUser(userId, MediaConstraints(false)) } ``` 1. Bind the call button to the method and assign a `CallListener` to be notified about changes in the call state: `app/src/main/java/com/sinch/rtc/sample/push/PlaceCallActivity.kt` ```kotlin override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... callButton.apply { isEnabled = false setOnClickListener { callButtonClicked() } } } private fun callButtonClicked() { val userName = calleeNameEditText.text.toString() // Validate input (non-empty) before calling if needed val call = sinchServiceInterface?.callUser(userName) // Launch in-call UI startActivity(callScreen) } ``` ## Manage required permissions If you try to initiate an audio call now, the application will crash with the following error output: ```text Process: com.sinch.rtc.demovvsdk, PID: 876 com.sinch.android.rtc.MissingPermissionException: Requires permission: android.permission.RECORD_AUDIO ``` Although Internet permissions were declared earlier, `RECORD_AUDIO` is a runtime permission and must be requested during the user's interaction with the app. 1. Modify the Android Manifest file by declaring usage of the `RECORD_AUDIO` permission. `app/src/main/AndroidManifest.xml` ```xml ``` 1. Before the user logs in, request the permission explicitly and start the client only if it was granted. `app/src/main/java/com/sinch/rtc/sample/push/BaseActivity.kt` ```kotlin private val messenger = Messenger(object : Handler() { override fun handleMessage(msg: Message) { when (msg.what) { SinchService.MESSAGE_PERMISSIONS_NEEDED -> { val requiredPermission = msg.data.getString(SinchService.REQUIRED_PERMISSION) ActivityCompat.requestPermissions( this@BaseActivity, arrayOf( requiredPermission, Manifest.permission.POST_NOTIFICATIONS ), 0 ) } else -> { /* ignore */ } } } }) override fun onRequestPermissionsResult( requestCode: Int, permissions: Array, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) // ... evaluate grantResults sinchServiceInterface?.retryStartAfterPermissionGranted() } ``` Note An in‑depth overview of runtime permissions, grant results, and handling workflow can be found in the official Android documentation: [Permissions overview](https://developer.android.com/guide/topics/permissions/overview). ## Next steps Now that you've made a call, you can set up your application to handle incoming calls. Handle incoming calls