Azure Communication Services: Does the ACS UI Library for Android support Android Automotive OS also?


We are building a Microsoft Teams like app for the Android Automotive OS (AAOS) environment. This app would provide its users with a similar calling/meeting experience as the MS Teams client app for Mobile and Desktop.

For this purpose, we tried making use of the Azure Communication Services SDKs for Android environment. Specifically, we tested the ACS Calling SDK and ACS UI Library for Android.

We tried creating a small sample app for launching the UI CallComposite available in ACS UI library that allows us to launch an end-to-end calling experience from our Android app, after a bit of configuration.
However, upon building and running the app on an Android emulator, we find that the app crashes upon launching when run on an Automotive emulator that runs AAOS. The same app builds and runs successfully for a Pixel Tablet emulator running Android OS API 33. So our question is: Does the ACS UI library for Android support Android Automotive environments or is it primarily built to work with Android OS specific devices like Mobile/Tablet?

Here are the exact crash logs we get in an Android automotive emulator:


---------------------------- PROCESS STARTED (4131) for package com.mohit.acsuilibraryapp ----------------------------

2026-08-24 22:58:02.173  4131-4131  acsuilibraryapp         com.mohit.acsuilibraryapp            E  No implementation found for int io.netty.internal.tcnative.Library.aprMajorVersion() (tried Java_io_netty_internal_tcnative_Library_aprMajorVersion and Java_io_netty_internal_tcnative_Library_aprMajorVersion__)

2026-08-24 22:58:02.312  4131-4131  acsuilibraryapp         com.mohit.acsuilibraryapp            E  No implementation found for int io.netty.channel.epoll.Native.offsetofEpollData() (tried Java_io_netty_channel_epoll_Native_offsetofEpollData and Java_io_netty_channel_epoll_Native_offsetofEpollData__)

2026-08-24 22:58:02.375  4131-4131  acsuilibraryapp         com.mohit.acsuilibraryapp            E  No implementation found for int io.netty.channel.kqueue.Native.sizeofKEvent() (tried Java_io_netty_channel_kqueue_Native_sizeofKEvent and Java_io_netty_channel_kqueue_Native_sizeofKEvent__)


2026-08-24 22:58:08.448  4131-4131  AndroidRuntime          com.mohit.acsuilibraryapp            E  FATAL EXCEPTION: main

                                                                                                    Process: com.mohit.acsuilibraryapp, PID: 4131

2026-08-24 22:58:08.605  4131-4142  acsuilibraryapp         com.mohit.acsuilibraryapp            I  Background concurrent copying GC freed 

For your reference, I am also posting the MainActivity code for this small sample app:

class MainActivity : AppCompatActivity() { private var userAccessToken: String = "" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContentView(R.layout.activity_main) ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } val acsIdentityClient = getCommunicationIdentityClient() userAccessToken = createAcsUserAndGetAccessToken(acsIdentityClient) val startButton: Button = findViewById(R.id.startButton) startButton.setOnClickListener { l -> startCallComposite() } } private fun startCallComposite() { val communicationTokenRefreshOptions = CommunicationTokenRefreshOptions(::fetchToken, true) val communicationTokenCredential = CommunicationTokenCredential(communicationTokenRefreshOptions) val locator: CallCompositeJoinLocator = CallCompositeTeamsMeetingLinkLocator("https://teams.live.com/meet/9316675669362?p=2PatJEdgqNhouCyMUG") val callComposite = CallCompositeBuilder() .applicationContext(this.applicationContext) .credential(communicationTokenCredential) .displayName("John Doe").build() callComposite.launch(this, locator) } private fun fetchToken(): String { return userAccessToken } private fun getCommunicationIdentityClient(): CommunicationIdentityClient { return CommunicationIdentityClientBuilder() .connectionString(CONNECTION_STRING) .buildClient() } private fun createAcsUserAndGetAccessToken(acsIdentityClient: CommunicationIdentityClient): String { val user = acsIdentityClient.createUser() Log.d(TAG, "Created a user identity in ACS with id: ${user.id}") val scopes: List<CommunicationTokenScope> = listOf(CommunicationTokenScope.VOIP) val accessToken: AccessToken = acsIdentityClient.getToken(user, scopes) val token = accessToken.token return token } companion object { private const val CONNECTION_STRING = "<MY_ACS_CONNECTION_STRING>" private const val TAG = "MainActivity" } }
0
Aug 24 at 6:20 PM
User AvatarMohit Sharma
#android#azure#azure-communication-services#aaos

Accepted Answer

createAcsUserAndGetAccessToken runs two blocking HTTP calls, createUser() and getToken(), directly inside onCreate. Android throws on network I/O on the main thread, which matches your FATAL EXCEPTION: main and the six second gap between process start and the crash.

Move it off the main thread:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val startButton: Button = findViewById(R.id.startButton)
    startButton.isEnabled = false

    lifecycleScope.launch {
        userAccessToken = withContext(Dispatchers.IO) {
            createAcsUserAndGetAccessToken(getCommunicationIdentityClient())
        }
        startButton.isEnabled = true
    }

    startButton.setOnClickListener { startCallComposite() }
}
User AvatarJubin Soni
Aug 24 at 8:00 PM
0