# 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