Net.Agora.Video.Android
4.6.3.3
See the version list below for details.
dotnet add package Net.Agora.Video.Android --version 4.6.3.3
NuGet\Install-Package Net.Agora.Video.Android -Version 4.6.3.3
<PackageReference Include="Net.Agora.Video.Android" Version="4.6.3.3" />
<PackageVersion Include="Net.Agora.Video.Android" Version="4.6.3.3" />
<PackageReference Include="Net.Agora.Video.Android" />
paket add Net.Agora.Video.Android --version 4.6.3.3
#r "nuget: Net.Agora.Video.Android, 4.6.3.3"
#:package Net.Agora.Video.Android@4.6.3.3
#addin nuget:?package=Net.Agora.Video.Android&version=4.6.3.3
#tool nuget:?package=Net.Agora.Video.Android&version=4.6.3.3
Net.Agora.Android
.NET for Android and .NET MAUI bindings for Agora's native Android SDKs.
Two products are bound, from net8.0-android through net10.0-android:
| Package | Native artifact | Use it when |
|---|---|---|
Net.Agora.Video.Android |
io.agora.rtc:full-rtc-basic |
The app shows or sends video (also carries the full audio surface). |
Net.Agora.Voice.Android |
io.agora.rtc:voice-rtc-basic |
Audio only — the same engine built without the video pipeline, a ~20 MB smaller .aar. |
Net.Agora.Signaling.Android |
io.agora:agora-rtm |
Realtime messaging (Signaling / RTM 2.x, its own 2.2.x version line) — coexists with either RTC package. |
dotnet add package Net.Agora.Video.Android # or Net.Agora.Voice.Android
Pick one of the RTC pair: both .aars carry the same Java classes (io.agora.rtc2.*), so referencing both
fails the build at dex merge — mirroring Agora's own artifacts, where an app depends on the full
or the voice SDK, never both. For the same reason both bindings expose the same Agora.Rtc
namespace (renamed from io.agora.rtc2 to match Agora's own C# / Unity SDK naming), so an app can
switch packages without touching code.
These are raw platform bindings — the full class-parse-generated surface, Agora.Rtc.RtcEngine
and friends. Most apps want the cross-platform clients instead:
Net.Agora.Video / Net.Agora.Voice, which wrap these
packages and their iOS siblings behind one API. Reach for a binding directly only when you need
something the cross-platform client does not expose.
using Agora.Rtc;
var config = new RtcEngineConfig { MContext = context, MAppId = "<APP_ID>" };
var engine = RtcEngine.Create(config);
engine.EnableVideo();
engine.JoinChannel(token: null, channelId: "my-channel", optionalInfo: null, uid: 0);
How this repository works
This repository is the only thing that binds Agora's Android SDKs:
Net.Agora (the cross-platform façade) and
Net.Agora.iOS (the iOS binding) are separate
repositories, each with their own release cadence. Each package's version is
<native artifact version>.<binding revision> — see Directory.Build.props for why the Android
and iOS lines don't share a version number. The package set lives in build/packages.tsv; adding
a package means adding a row there and a project under src/.
What is bound, and why not full-sdk / voice-sdk
io.agora.rtc:full-sdk (and its voice counterpart voice-sdk) is a POM-only aggregator over
optional plugin .aars — AI noise suppression, face detection, virtual background, screen
sharing, and so on. Binding all of it pulls in features these packages expose no API for, and
Android's Java dependency verification (XA4241) refuses to build unless every one of those
plugins is present too. io.agora.rtc:full-rtc-basic / voice-rtc-basic are Agora's own base
artifacts: RtcEngine and the core surface these packages bind, with exactly one dependency
(io.agora.infra:aosl).
Each project's Transforms/Metadata.xml removes the few internal implementation classes that
class-parse cannot bind cleanly on its own — for Video the default camera/screen capturer, for
both the raw video-frame/EGL/texture pipeline and the spatial-audio impl class — none of which a
consumer of RtcEngine calls directly. (The voice .aar ships the same shared Java API layer,
video types included; only the native pipeline differs.)
Building locally
dotnet build src/Net.Agora.Video.Android/Net.Agora.Video.Android.csproj -f net9.0-android35.0
./build/BuildNugets.sh
dotnet test tests/Net.Agora.Android.PackageTests
Nothing is fetched or committed: AndroidMavenLibrary resolves the .aar straight from Maven
Central for net9.0-android35.0/net10.0-android36.0, cached under
~/.cache/dotnet-android/MavenCacheDirectory. net8.0-android34.0 uses a different path — that
SDK pack has no AndroidMavenLibrary support at all, so src/Agora.Binding.props downloads the
same .aar directly with an MSBuild DownloadFile target instead. See the comments there for why
this matters: the unsupported item is silently ignored rather than erroring, so a build using it
on net8 "succeeds" with an empty few-KB binding assembly and no error anywhere in the log.
No single .NET SDK builds net8, net9 and net10 for Android, so BuildNugets.sh packs twice (the
installed SDK's band, then a net10 pass from a scratch global.json) and merges the results —
see build/merge-packages.py.
Tests
Everything runs against the packed .nupkg in artifacts/, not the build output, because the
failure modes worth catching here are packaging ones — most importantly the net8 "empty shell"
trap above, which builds with 0 errors and 0 warnings.
tests/Net.Agora.Android.PackageTests(plain xUnit, runs anywhere) asserts the package layout — a real binding assembly and the native.aars for every target framework — and, through the metadata reader, the API itself: the coreAgora.Rtctypes exist, theIO.Agora.Rtc2 → Agora.Rtcrename left nothing behind, andRtcEnginestill exposes the channel lifecycle entry points. A binding that failed to generate still packs cleanly; these are what notice.tests/Net.Agora.Android.DeviceTestsis a bare Android app (no MAUI, no test framework) that consumes the packed package and drives the raw binding on an emulator: resolve the Java entry points out of the packaged.aar, read the native SDK version, create the engine, enable/disable video and audio, run the local camera preview, destroy the engine. No Agora credentials are involved — the App ID is syntactically valid but unregistered, which is enough for everything short of joining a channel. It reports a singleAGORA_E2E_DONE PASS/FAILline to logcat, which.github/scripts/run-emulator-tests.shturns into an exit code — the same marker theNet.Agorafaçade's own device tests use.
In CI (.github/workflows/build.yml) the validate job runs the package tests and the e2e job
runs the emulator suite per package (Video and Voice — one leg each, since a single app can hold
only one of them) on net8.0-android34.0 and net10.0-android36.0 — the two extremes: net8's
.aar arrives through the DownloadFile fallback, and net10's assets are grafted in by the merge
step, so those are the two that could each break alone. The Voice legs compile the video checks
out (see the AGORA_VOICE constant in the device tests).
Run the emulator suite locally, with an emulator already booted:
./build/BuildNugets.sh
AGORA_DEVICE_RID=android-arm64 ./.github/scripts/run-emulator-tests.sh 4.6.3.1 net9.0-android35.0
AGORA_DEVICE_RID=android-arm64 ./.github/scripts/run-emulator-tests.sh 4.6.3.1 net9.0-android35.0 Voice
Sample
samples/Net.Agora.Sample.Android is a MAUI app built straight against the packages — no
cross-platform façade — that creates Agora.Rtc.RtcEngine and shows the local camera preview
with a front/back flip: an App ID entry, camera/microphone permission handling, and a
SurfaceView behind a small MAUI handler (see its AgoraVideoView.cs for why a custom handler
rather than a wrapped view). Its Try Signaling button drives Agora.Rtm.RtmClient from the
same app — the coexistence of the two products, proven at dex-merge time just by building.
samples/Net.Agora.Sample.Voice.Android is its audio-only sibling against
Net.Agora.Voice.Android: capture, mute, speakerphone routing and the who-is-speaking volume
reports, with no camera permission anywhere.
The full join/publish/subscribe flows, wrapped behind one cross-platform API, are
Net.Agora's samples.
It consumes the packed Net.Agora.Video.Android package from ./artifacts (see NuGet.config),
so pack first. It targets net10.0-android36.0 and needs the .NET 10 SDK with the
maui-android workload, which this repository's global.json does not select — hence the scratch
directory:
./build/BuildNugets.sh
cd /tmp && dotnet new globaljson --sdk-version 10.0.100 --force
dotnet build <repo>/samples/Net.Agora.Sample.Android/Net.Agora.Sample.Android.csproj
Net.Agora.Android.sln deliberately contains the binding project and the tests but not the
sample, so dotnet build Net.Agora.Android.sln does not require the MAUI workload.
Licence
MIT — see LICENSE. Agora's own SDK is distributed under Agora's SDK licence terms.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0-android34.0 is compatible. net9.0-android was computed. net9.0-android35.0 is compatible. net10.0-android was computed. net10.0-android36.0 is compatible. |
-
net10.0-android36.0
- No dependencies.
-
net8.0-android34.0
- No dependencies.
-
net9.0-android35.0
- No dependencies.
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Net.Agora.Video.Android:
| Package | Downloads |
|---|---|
|
Net.Agora.Video
One API over the Agora Video SDK for Android and iOS: join a channel and publish/subscribe audio and video with awaitable calls and ordinary .NET events, instead of writing a per-platform adapter over a Java event-handler class and an Objective-C delegate. Pulls in the platform binding that matches whichever target framework you build. For .NET MAUI apps, add Net.Agora.Video.Maui for the video view. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 4.6.3.5 | 172 | 7/26/2026 |
| 4.6.3.5-beta.12.24 | 57 | 7/31/2026 |
| 4.6.3.5-beta.11.21 | 68 | 7/30/2026 |
| 4.6.3.5-beta.11.19 | 48 | 7/30/2026 |
| 4.6.3.5-beta.10.18 | 60 | 7/29/2026 |
| 4.6.3.5-beta.9.17 | 64 | 7/28/2026 |
| 4.6.3.5-beta.8.16 | 82 | 7/26/2026 |
| 4.6.3.5-beta.8.15 | 67 | 7/26/2026 |
| 4.6.3.4 | 139 | 7/25/2026 |
| 4.6.3.4-beta.7.14 | 57 | 7/25/2026 |
| 4.6.3.4-beta.6.13 | 63 | 7/25/2026 |
| 4.6.3.3 | 125 | 7/24/2026 |
| 4.6.3.3-beta.5.9 | 76 | 7/24/2026 |
| 4.6.3.3-beta.4.8 | 69 | 7/24/2026 |
| 4.6.3.2 | 122 | 7/24/2026 |
| 4.6.3.2-beta.3.4 | 67 | 7/24/2026 |
| 4.6.3.1 | 109 | 7/23/2026 |
| 4.6.3.1-beta.2.3 | 61 | 7/24/2026 |
| 4.6.3.1-beta.2.2 | 68 | 7/24/2026 |
| 4.6.3.1-beta.1.1 | 71 | 7/23/2026 |