Build a Flight Tracker with the MyRadar Android SDK
Follow live flights over animated radar in a one-screen Jetpack Compose app built with the Android SDK.
Oct 13, 2026 · Shell · Kotlin
The SDK's demo app is a one-screen flight tracker: enter a flight number, watch
the flight over live radar, and switch weather layers on and off. This walkthrough
covers the few calls that matter; the complete source is in
android-demo in the
MyRadar SDK samples repository on GitHub.

Quickstart (command line)#
With Android Studio installed, these commands clone the sample, start an
emulator, and build and launch the app with your key. Replace
your-myradar-api-key. The paths are Android Studio's defaults on macOS; on
Linux the SDK is usually in ~/Android/Sdk, and any JDK 17 or later works for
JAVA_HOME.
export MYRADAR_API_KEY=your-myradar-api-key
git clone https://github.com/MyRadar/MyRadar-SDK-Samples.git
cd MyRadar-SDK-Samples/android-demo
export ANDROID_HOME="$HOME/Library/Android/sdk"
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
export PATH="$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$PATH"
emulator -list-avds
AVD=$(emulator -list-avds | head -1)
emulator -avd "$AVD" -cores 4 >/dev/null 2>&1 &
adb wait-for-device
until [ "$(adb shell getprop sys.boot_completed | tr -d '\r')" = 1 ]; do sleep 2; done
./gradlew :app:installDebug
adb shell input keyevent KEYCODE_WAKEUP
adb shell wm dismiss-keyguard
adb shell am start -S -n com.acmeaom.myradar.sdkdemo/.MainActivityThe last three commands wake the emulator's screen and restart the app. An emulator that
resumes from Quick Boot can come back with its screen asleep, which looks like a blank
screen. emulator -list-avds lists your emulators and the commands start the first one; if
the list is empty, create one in Android Studio's Device Manager first. If an emulator is
already running, the commands use it instead; give it 4 CPU cores if you can, because on one
core the map loads slowly. The build
reads MYRADAR_API_KEY from the environment and builds it into the app, so after
changing the key, run ./gradlew :app:installDebug again. The
first build downloads Gradle, the Android build tools and the MyRadar SDK, so it
takes a few minutes.
Run the demo in Android Studio#
Prefer Android Studio to the command line? You need a current Android Studio, an emulator or device running Android 8 or later, and a MyRadar API key from the developer portal.
- Clone the repository and add a line to
android-demo/local.properties(git-ignored):myradar.apiKey=your-myradar-api-key. - Give the emulator 4 CPU cores: in Device Manager, edit it, open Show Advanced Settings and set Multi-Core CPU to 4. With one core the map loads slowly.
- Open the
android-demofolder, wait for the Gradle sync, and run the app configuration. - Enter a flight number such as
AA 100orAA 1643.
Radar appears within a few seconds. A "MyRadar SDK is not configured" notice means the app was built without a key; a map with no weather means the key was rejected.
Step 1: Add the library and your key#
Add the MyRadar Maven repository and the dependency, then configure the SDK once at launch:
// settings.gradle.kts
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url = uri("https://myradar.github.io/MyRadar-Android-SDK-Maven") }
}
}
// app/build.gradle.kts
dependencies {
implementation("com.acmeaom.myradar:myradar-sdk:2.0.1")
}class FlightTrackerApp : Application() {
override fun onCreate() {
super.onCreate()
MyRadarSdk.configure(apiKey = BuildConfig.MYRADAR_API_KEY)
}
}The sample reads the key from local.properties into BuildConfig at build time, so it never
enters source control.
Step 2: Show the map#
The map is one composable, configured with parameters. Keep layer choices in your own state:
var overlays by remember { mutableStateOf(setOf(Overlay.Warnings, Overlay.Lightning)) }
MyRadarMap(
initialCamera = MapCamera(LatLng(37.5, -96.0), zoom = 5f),
overlays = overlays,
)Radar is on by default. mapStyle, radarProduct and radarOpacity change the rest; the
sample's layer chips and opacity slider show them in use.
Step 3: Show a flight#
One parameter shows a flight. Keep the flight number in state and pass it as flight; null
shows none. The SDK looks the flight up, draws it, centers the map on the aircraft with the whole trip in view, and updates it every minute
until it lands:
var ident by remember { mutableStateOf<String?>(null) }
var flight by remember { mutableStateOf<FlightInfo?>(null) }
MyRadarMap(
overlays = overlays,
flight = ident,
onFlightUpdate = { flight = it },
onFlightError = { message = it.message },
)Set ident from a search field. It accepts a flight number (AA 100, AA 1643) or a callsign
(UAL1). When a number flies several legs a day, the SDK shows the leg in progress, otherwise
the next to depart, otherwise the most recent, which stays on the map for 30 minutes after it
lands.
To keep the camera where it is when a flight loads, pass
flightOptions = FlightOptions(fitToFlight = false). Updates never move the map, and with views
mapView.fitToFlight() brings the whole flight into view whenever you want.
The map shows the planned route, the track flown, the route ahead, both airports and the
aircraft. Over oceans the aircraft is drawn hollow while its position is an estimate.
flightOptions = FlightOptions(plannedRoute = false) turns parts off or changes the color, and
FlightOptions(aircraftIcon = bitmap) draws your own aircraft image, nose up. With
views, call the suspend function mapView.showFlight("AA10").

Step 4: Fill in the flight card#
Each update is a FlightInfo, so the card needs no calculations of its own:
Text(flight.ident) // "AA 10"
Text("${flight.origin?.code} → ${flight.destination?.code}")
LinearProgressIndicator(progress = { (flight.progress ?: 0.0).toFloat() })
Text(flight.estimatedArrival?.let(timeFormat::format) ?: "—")
Text(flight.position?.altitudeFeet?.let { "${it.toLong()} ft" } ?: "—")Step 5: Show attributions#
Apps that ship the SDK must display its licenses and data attributions, for example on an about screen:
Text(MyRadarMapView.licensesAndAttributions(context).joinToString(", ") { it.name })Next#
The sample app adds layer chips, an opacity slider, base map and radar product menus, and a landscape layout. Its README lists which SDK API each part uses.