\hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler}{}\doxysection{io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler Class Reference}
\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler}\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsection*{Classes}
\begin{DoxyCompactItemize}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_agora_face_position_info}{Agora\+Face\+Position\+Info}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_audio_volume_info}{Audio\+Volume\+Info}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_client_role}{Client\+Role}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_downlink_network_info}{Downlink\+Network\+Info}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_error_code}{Error\+Code}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_lastmile_probe_result}{Lastmile\+Probe\+Result}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_local_audio_stats}{Local\+Audio\+Stats}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_local_video_stats}{Local\+Video\+Stats}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_quality}{Quality}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_remote_audio_stats}{Remote\+Audio\+Stats}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_remote_video_stats}{Remote\+Video\+Stats}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_rtc_stats}{Rtc\+Stats}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_uplink_network_info}{Uplink\+Network\+Info}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_user_offline_reason}{User\+Offline\+Reason}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_video_layout}{Video\+Layout}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_video_layout_info}{Video\+Layout\+Info}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_video_profile}{Video\+Profile}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_video_rendering_tracing_info}{Video\+Rendering\+Tracing\+Info}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_warn_code}{Warn\+Code}}
\item 
class \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_wl_acc_stats}{Wl\+Acc\+Stats}}
\end{DoxyCompactItemize}
\doxysubsection*{Public Member Functions}
\begin{DoxyCompactItemize}
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6944f0b187993f39cf1235cf3bbed949}{on\+Error}} (int err)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a25a599788cbb7d9b97b9f67747c17243}{on\+Join\+Channel\+Success}} (String channel, int uid, int elapsed)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ac60a05f915647a63769fce8ce7101b48}{on\+Rejoin\+Channel\+Success}} (String channel, int uid, int elapsed)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ae8d95d70238163de3d89399bee8061a1}{on\+Leave\+Channel}} (\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_rtc_stats}{Rtc\+Stats}} stats)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a52d541757c833d035dcac245100d8217}{on\+Client\+Role\+Changed}} (int old\+Role, int new\+Role, \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_client_role_options}{Client\+Role\+Options}} new\+Role\+Options)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a8e24f084957a12a50aa2690ee4e69904}{on\+Client\+Role\+Change\+Failed}} (int reason, int current\+Role)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a8643b8a54c5aa30e22209a54274fbcf3}{on\+Local\+User\+Registered}} (int uid, String user\+Account)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a0cd49bb3b8733f04ecaacf1df091e07f}{on\+User\+Info\+Updated}} (int uid, \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_user_info}{User\+Info}} user\+Info)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_adcc5cddc796788d6fb300895f604e8a7}{on\+User\+State\+Changed}} (int uid, int state)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a848d29acef97523964bb27dd5b637162}{on\+User\+Joined}} (int uid, int elapsed)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a36dfe32e633612d8e74e1a32c504c817}{on\+User\+Offline}} (int uid, int reason)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_acf3ab9feae0d9a6001da31e95363aa22}{on\+Connection\+State\+Changed}} (int state, int reason)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aa0c0290b16674ef79efc89e2709d7ec5}{on\+Wl\+Acc\+Message}} (int reason, int action, String wl\+Acc\+Msg)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a1ce7e00ae3220df1d78dc4e5d51d6e74}{on\+Wl\+Acc\+Stats}} (\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_wl_acc_stats}{Wl\+Acc\+Stats}} current\+Stats, \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_wl_acc_stats}{Wl\+Acc\+Stats}} average\+Stats)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ae295db0a95c7d6409b19b00dfef9ed20}{on\+Connection\+Interrupted}} ()
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a3c40049545254582b454eea461b166f4}{on\+Connection\+Lost}} ()
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a3699579c7e341ea19e185b967748ddd4}{on\+Connection\+Banned}} ()
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ad230797ab45c4307562e1b19519253b5}{on\+Token\+Privilege\+Will\+Expire}} (String token)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a2585f098b637d03ae3aca03daaca8eef}{on\+Request\+Token}} ()
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a2ba550d177fe9550ac01a5f9349a75a5}{on\+License\+Validation\+Failure}} (int error)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6b9a1f4de49ef268b2be15b269ee7c47}{on\+Audio\+Volume\+Indication}} (\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_audio_volume_info}{Audio\+Volume\+Info}}\mbox{[}$\,$\mbox{]} speakers, int total\+Volume)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a150869ac2672bc1af7ba9f8fc4d10570}{on\+Active\+Speaker}} (int uid)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ac14aad764dc710a05b6cad4c3838c706}{on\+Video\+Stopped}} ()
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a18073dc2bcd1e4a4df8f741014fc3106}{on\+First\+Local\+Video\+Frame}} (Constants.\+Video\+Source\+Type source, int width, int height, int elapsed)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5cb5cf5ecef5eb955c65959620c843e3}{on\+First\+Local\+Video\+Frame\+Published}} (Constants.\+Video\+Source\+Type source, int elapsed)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ab63e6aa894c685a766fc6e81711c68e6}{on\+First\+Remote\+Video\+Decoded}} (int uid, int width, int height, int elapsed)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a753cffdbf678f94a2b07495dd02cc4f2}{on\+First\+Remote\+Video\+Frame}} (int uid, int width, int height, int elapsed)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a2854027a99209da1cc0efa46c54211b4}{on\+User\+Mute\+Audio}} (int uid, boolean muted)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a9b5ec64a801ee3442a0aeab35c5d059b}{on\+User\+Mute\+Video}} (int uid, boolean muted)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aebce7065ea48abbdb6001fec7a00c1ac}{on\+User\+Enable\+Video}} (int uid, boolean enabled)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a9e43e9e2b70a0d4b20a0e0313a734c90}{on\+User\+Enable\+Local\+Video}} (int uid, boolean enabled)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a729049a110c6a1b7e951c8a9a5cc32c9}{on\+Video\+Size\+Changed}} (Constants.\+Video\+Source\+Type source, int uid, int width, int height, int rotation)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a8abb48195f676e5730339ed0ad0f8dc1}{on\+Remote\+Audio\+State\+Changed}} (int uid, int state, int reason, int elapsed)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ad6a5250389c780cb6e37b9534822a27b}{on\+Audio\+Publish\+State\+Changed}} (String channel, int old\+State, int new\+State, int elapse\+Since\+Last\+State)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_afaeef3162faac616eda2f18bfbd5f214}{on\+Video\+Publish\+State\+Changed}} (Constants.\+Video\+Source\+Type source, String channel, int old\+State, int new\+State, int elapse\+Since\+Last\+State)
\item 
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a02d697420a919d7c28f869aec6bc8ec5}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a02d697420a919d7c28f869aec6bc8ec5}} 
void {\bfseries on\+Local\+Publish\+Fallback\+To\+Audio\+Only} (boolean is\+Fallback\+Or\+Recover)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_af99f6ab9132fc82d8198fa325601dd9e}{on\+Audio\+Subscribe\+State\+Changed}} (String channel, int uid, int old\+State, int new\+State, int elapse\+Since\+Last\+State)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a83dc1b71944119fd1f78055a9ca7f8ab}{on\+Video\+Subscribe\+State\+Changed}} (String channel, int uid, int old\+State, int new\+State, int elapse\+Since\+Last\+State)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5daae97f78becbf71dc3dbfd494f8419}{on\+Remote\+Video\+State\+Changed}} (int uid, int state, int reason, int elapsed)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a3d4f978004d0666f26345810dcfe73ac}{on\+Channel\+Media\+Relay\+State\+Changed}} (int state, int code)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ac12497babde9ba725c873ba3b1fe76ab}{on\+First\+Local\+Audio\+Frame\+Published}} (int elapsed)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5203b66a93abb63596c23764c587292a}{on\+First\+Remote\+Audio\+Frame}} (int uid, int elapsed)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a95ad49d36d9934ba78763fcb0ab2a91d}{on\+First\+Remote\+Audio\+Decoded}} (int uid, int elapsed)
\item 
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a738e8d63f1960cc94943c5636eb43c63}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a738e8d63f1960cc94943c5636eb43c63}} 
void {\bfseries on\+Remote\+Subscribe\+Fallback\+To\+Audio\+Only} (int uid, boolean is\+Fallback\+Or\+Recover)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a9685280586a4fce917eac08257fdeaf9}{on\+Audio\+Route\+Changed}} (int routing)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a23f6de603ad02640a06e7144a7fc6fe8}{on\+Camera\+Ready}} ()
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a989f10ab210047ae44b9d21815b84cd5}{on\+Camera\+Focus\+Area\+Changed}} (Rect rect)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_abb9832896d40cee749866375c84e753b}{on\+Camera\+Exposure\+Area\+Changed}} (Rect rect)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a58207f39af3210fb9bcada00b72bfaf6}{on\+Snapshot\+Taken}} (int uid, String file\+Path, int width, int height, int err\+Code)
\begin{DoxyCompactList}\small\item\em snapshot taken callback \end{DoxyCompactList}\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a2fbb5c93c21e84859c348d85884adc26}{on\+Face\+Position\+Changed}} (int image\+Width, int image\+Height, \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_agora_face_position_info}{Agora\+Face\+Position\+Info}}\mbox{[}$\,$\mbox{]} face\+Rect\+Arr)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ab17fcf9e21edcff4a51ac1ff9e51279e}{on\+Audio\+Quality}} (int uid, int quality, short delay, short lost)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6476a17632eab584aa291aa869663d13}{on\+Rtc\+Stats}} (\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_rtc_stats}{Rtc\+Stats}} stats)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a8b68b163b0b6f8bdbf2f52e320a04739}{on\+Lastmile\+Quality}} (int quality)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_adc7bfb05ed741769a1436794926b1cf8}{on\+Lastmile\+Probe\+Result}} (\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_lastmile_probe_result}{Lastmile\+Probe\+Result}} result)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_acdf01fd3da944feb847585c406d3d263}{on\+Network\+Quality}} (int uid, int tx\+Quality, int rx\+Quality)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a736bf4d46d2cbd018ec30c06156a2c5d}{on\+Local\+Audio\+Stats}} (\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_local_audio_stats}{Local\+Audio\+Stats}} stats)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ab5180ba91a1c81c5470e2ec1a7e18a01}{on\+Local\+Video\+Stats}} (Constants.\+Video\+Source\+Type source, \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_local_video_stats}{Local\+Video\+Stats}} stats)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aced11e711bdda1ea24415da27c5bc5fa}{on\+Remote\+Audio\+Stats}} (\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_remote_audio_stats}{Remote\+Audio\+Stats}} stats)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a7f00d7a396872dc02008ea5f7487917e}{on\+Remote\+Video\+Stats}} (\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_remote_video_stats}{Remote\+Video\+Stats}} stats)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a9af3b09098b1034319184103157b90db}{on\+Local\+Video\+Stat}} (int sent\+Bitrate, int sent\+Frame\+Rate)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a8a84e26cf72185b3c944b3a10983f600}{on\+Remote\+Video\+Stat}} (int uid, int delay, int received\+Bitrate, int received\+Frame\+Rate)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a112817ed260a30174329739382e75e66}{on\+Remote\+Audio\+Transport\+Stats}} (int uid, int delay, int lost, int rx\+K\+Bit\+Rate)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a93e87d28a93737a7ff6c5287ff3c2a56}{on\+Remote\+Video\+Transport\+Stats}} (int uid, int delay, int lost, int rx\+K\+Bit\+Rate)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ab432d1b5f1d8efb96a838f8f9388ff07}{on\+Audio\+Mixing\+State\+Changed}} (int state, int reason)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a74c7ede84d5fb4464687aaacc0cbf142}{on\+Audio\+Mixing\+Position\+Changed}} (long position)
\begin{DoxyCompactList}\small\item\em Reports current Audio\+Mixing progress. \end{DoxyCompactList}\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ae51e2624b1c39496f387bcc288ae3f5b}{on\+Audio\+Mixing\+Finished}} ()
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aacf755d5776a6899d0f9f61e48378897}{on\+Audio\+Effect\+Finished}} (int sound\+Id)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aece9d87ad596720ba887e6e889f3d81c}{on\+Rhythm\+Player\+State\+Changed}} (int state, int reason)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aef21689500cbc435f0ff98fc65670657}{on\+Local\+Audio\+State\+Changed}} (int state, int reason)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ac5f1cba62b72b39211cffad4cc30fb32}{on\+Local\+Video\+State\+Changed}} (Constants.\+Video\+Source\+Type source, int state, int reason)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a14851bc4c9119e73911c409ac693eea5}{on\+Rtmp\+Streaming\+State\+Changed}} (String url, int state, int reason)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a60f5746ac4fb39f7239ce236b64e55b6}{on\+Rtmp\+Streaming\+Event}} (String url, int event)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a3261b6e73ef26cbba4b6ff68e754b091}{on\+Transcoding\+Updated}} ()
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6f827b82ff6ed61e855bf6315aa4395c}{on\+Stream\+Message}} (int uid, int stream\+Id, byte\mbox{[}$\,$\mbox{]} data)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a7ec93fba444f408cd5148f8778bb6955}{on\+Stream\+Message\+Error}} (int uid, int stream\+Id, int error, int missed, int cached)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_acfaedf8c3c744f08f065f68b91017ff2}{on\+Media\+Engine\+Load\+Success}} ()
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a069220e819fca1b8157ffd05342b4e35}{on\+Media\+Engine\+Start\+Call\+Success}} ()
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a123fdecc812f7931578afd2f40d48d13}{on\+Network\+Type\+Changed}} (int type)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a4b89dcb8d0bea0fe1917a8936f2a44ce}{on\+Intra\+Request\+Received}} ()
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6476220c1c741f765f83a71e4eeaa3ef}{on\+Uplink\+Network\+Info\+Updated}} (\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_uplink_network_info}{Uplink\+Network\+Info}} info)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a0fb30b2af6d3e4f70f02d35cac2505df}{on\+Downlink\+Network\+Info\+Updated}} (\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_downlink_network_info}{Downlink\+Network\+Info}} info)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5d2b5d3a5d1bbbd40e0d71594cd06d51}{on\+Encryption\+Error}} (int error\+Type)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a982fad5ffc32f1414c4a6df57a88a293}{on\+Permission\+Error}} (int permission)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ad802bd7311b1fd7b3f6cb853a567fd34}{on\+Upload\+Log\+Result}} (String request\+Id, boolean success, int reason)
\item 
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_afe10d489526d3a6a6fce9c4776b53d9e}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_afe10d489526d3a6a6fce9c4776b53d9e}} 
void {\bfseries on\+Content\+Inspect\+Result} (int result)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a92c65f217aa90841fb4bd71bd8e998b7}{on\+Proxy\+Connected}} (String channel, int uid, int proxy\+Type, String local\+Proxy\+Ip, int elapsed)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a33c557a7ed4542fc4561a9d570831073}{on\+Video\+Rendering\+Tracing\+Result}} (int uid, Constants.\+M\+E\+D\+I\+A\+\_\+\+T\+R\+A\+C\+E\+\_\+\+E\+V\+E\+NT current\+Event, \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_video_rendering_tracing_info}{Video\+Rendering\+Tracing\+Info}} tracing\+Info)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a1c8858d82c94cccbbd1ba6eb592e604e}{on\+Local\+Video\+Transcoder\+Error}} (Local\+Transcoder\+Configuration.\+Transcoding\+Video\+Stream stream, int error)
\item 
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ae2370da7ffa833dab6550e5ef5ac4f8f}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ae2370da7ffa833dab6550e5ef5ac4f8f}} 
void {\bfseries on\+Transcoded\+Stream\+Layout\+Info} (int uid, \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_video_layout_info}{Video\+Layout\+Info}} info)
\item 
void \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5642c37198789f09a0e82560cea482c8}{on\+Audio\+Metadata\+Received}} (int uid, byte\mbox{[}$\,$\mbox{]} data)
\begin{DoxyCompactList}\small\item\em Occurs when the S\+DK receives audio metadata. \end{DoxyCompactList}\end{DoxyCompactItemize}


\doxysubsection{Detailed Description}
Callback methods.

The S\+DK uses the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler}{I\+Rtc\+Engine\+Event\+Handler}} interface class to send callback event notifications to the application, and the application inherits the methods of this interface class to retrieve these event notifications. All methods in this interface class have their (empty) default implementations, and the application can inherit only some of the required events instead of all of them. In the callback methods, the application should avoid time-\/consuming tasks or call blocking A\+P\+Is (such as Send\+Message), otherwise, the S\+DK may not work properly.

\doxysubsection{Member Function Documentation}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6944f0b187993f39cf1235cf3bbed949}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6944f0b187993f39cf1235cf3bbed949}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onError@{onError}}
\index{onError@{onError}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onError()}{onError()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Error (\begin{DoxyParamCaption}\item[{int}]{err }\end{DoxyParamCaption})}

An error occurred during S\+DK runtime. 

In most cases, reporting an error means that the S\+DK cannot fix the issue and resume running, and therefore requires actions from the application or simply informs the user about the issue. In this case, the application informs the user that the call initialization has failed, and calls the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_af3fe5d61a9ca8db36b56432273d02307}{leave\+Channel}} method to exit the channel.


\begin{DoxyParams}{Parameters}
{\em err} & \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_error_code}{Error code}} \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a25a599788cbb7d9b97b9f67747c17243}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a25a599788cbb7d9b97b9f67747c17243}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onJoinChannelSuccess@{onJoinChannelSuccess}}
\index{onJoinChannelSuccess@{onJoinChannelSuccess}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onJoinChannelSuccess()}{onJoinChannelSuccess()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Join\+Channel\+Success (\begin{DoxyParamCaption}\item[{String}]{channel,  }\item[{int}]{uid,  }\item[{int}]{elapsed }\end{DoxyParamCaption})}

Occurs when the local user successfully joins the specified channel.


\begin{DoxyParams}{Parameters}
{\em channel} & The channel name. \\
\hline
{\em uid} & The user ID.
\begin{DoxyItemize}
\item If you specified a {\ttfamily uid} in the {\ttfamily join\+Channel} method, the S\+DK returns the specified ID;
\item If not, this callback returns an ID that is automatically assigned by the Agora server. 
\end{DoxyItemize}\\
\hline
{\em elapsed} & The time elapsed (ms) from the local user calling \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_acd30d6bf3055ccd45d08b34c2e8ac467}{join\+Channel}} until this event occurs. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ac60a05f915647a63769fce8ce7101b48}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ac60a05f915647a63769fce8ce7101b48}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onRejoinChannelSuccess@{onRejoinChannelSuccess}}
\index{onRejoinChannelSuccess@{onRejoinChannelSuccess}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onRejoinChannelSuccess()}{onRejoinChannelSuccess()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Rejoin\+Channel\+Success (\begin{DoxyParamCaption}\item[{String}]{channel,  }\item[{int}]{uid,  }\item[{int}]{elapsed }\end{DoxyParamCaption})}

Occurs when the local user rejoins the channel after being disconnected due to network problems.

When the app loses connection with the server because of network problems, the S\+DK automatically tries to reconnect to the server, and triggers this callback method upon reconnection.


\begin{DoxyParams}{Parameters}
{\em channel} & The channel name. \\
\hline
{\em uid} & The user ID. \\
\hline
{\em elapsed} & Time elapsed (ms) from starting to reconnect until this callback is triggered \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ae8d95d70238163de3d89399bee8061a1}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ae8d95d70238163de3d89399bee8061a1}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onLeaveChannel@{onLeaveChannel}}
\index{onLeaveChannel@{onLeaveChannel}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onLeaveChannel()}{onLeaveChannel()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Leave\+Channel (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_rtc_stats}{Rtc\+Stats}}}]{stats }\end{DoxyParamCaption})}

Occurs when the local user successfully leaves the channel.

When the user successfully leaves the channel after calling \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_af3fe5d61a9ca8db36b56432273d02307}{leave\+Channel}}, the S\+DK uses this callback to notify the app that the user has left the channel.

This callback also reports information such as the call duration and the statistics of data received or transmitted by the S\+DK.


\begin{DoxyParams}{Parameters}
{\em stats} & The statistics on the call\+: \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_rtc_stats}{Rtc\+Stats}}. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a52d541757c833d035dcac245100d8217}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a52d541757c833d035dcac245100d8217}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onClientRoleChanged@{onClientRoleChanged}}
\index{onClientRoleChanged@{onClientRoleChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onClientRoleChanged()}{onClientRoleChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Client\+Role\+Changed (\begin{DoxyParamCaption}\item[{int}]{old\+Role,  }\item[{int}]{new\+Role,  }\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_client_role_options}{Client\+Role\+Options}}}]{new\+Role\+Options }\end{DoxyParamCaption})}

Occurs when the user role in a Live-\/\+Broadcast channel has switched, for example, from a broadcaster to an audience or vice versa.


\begin{DoxyParams}{Parameters}
{\em old\+Role} & The old role of the user. \\
\hline
{\em new\+Role} & The new role of the user. \\
\hline
{\em new\+Role\+Options} & The client role options of the new role. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a8e24f084957a12a50aa2690ee4e69904}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a8e24f084957a12a50aa2690ee4e69904}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onClientRoleChangeFailed@{onClientRoleChangeFailed}}
\index{onClientRoleChangeFailed@{onClientRoleChangeFailed}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onClientRoleChangeFailed()}{onClientRoleChangeFailed()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Client\+Role\+Change\+Failed (\begin{DoxyParamCaption}\item[{int}]{reason,  }\item[{int}]{current\+Role }\end{DoxyParamCaption})}

Occurs when the user role in a Live-\/\+Broadcast channel has switched, for example, from a broadcaster to an audience or vice versa.


\begin{DoxyParams}{Parameters}
{\em reason} & The reason of the failure of the local user role switches. \\
\hline
{\em current\+Role} & The current role of the user \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a8643b8a54c5aa30e22209a54274fbcf3}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a8643b8a54c5aa30e22209a54274fbcf3}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onLocalUserRegistered@{onLocalUserRegistered}}
\index{onLocalUserRegistered@{onLocalUserRegistered}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onLocalUserRegistered()}{onLocalUserRegistered()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Local\+User\+Registered (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{String}]{user\+Account }\end{DoxyParamCaption})}

Occurs when the local user registers a user account. \begin{DoxySince}{Since}
v2.\+8.\+0.
\end{DoxySince}
This callback is triggered when the local user successfully registers a user account by calling the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a9d596bab97c3b7b164e9f7a61732da4b}{register\+Local\+User\+Account}} method, or joins a channel by calling the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_aef5f666b23319116e7d7ee85e58fc5e8}{join\+Channel\+With\+User\+Account}} method. This callback reports the user ID and user account of the local user. 
\begin{DoxyParams}{Parameters}
{\em uid} & The ID of the local user. \\
\hline
{\em user\+Account} & The user account of the local user. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a0cd49bb3b8733f04ecaacf1df091e07f}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a0cd49bb3b8733f04ecaacf1df091e07f}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onUserInfoUpdated@{onUserInfoUpdated}}
\index{onUserInfoUpdated@{onUserInfoUpdated}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onUserInfoUpdated()}{onUserInfoUpdated()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+User\+Info\+Updated (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_user_info}{User\+Info}}}]{user\+Info }\end{DoxyParamCaption})}

Occurs when the S\+DK gets the user ID and user account of the remote user. \begin{DoxySince}{Since}
v2.\+8.\+0.
\end{DoxySince}
After a remote user joins the channel, the S\+DK gets the U\+ID and user account of the remote user, caches them in a mapping table object (\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_user_info}{User\+Info}}), and triggers this callback on the local client. 
\begin{DoxyParams}{Parameters}
{\em uid} & The ID of the remote user. \\
\hline
{\em user\+Info} & The \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_user_info}{User\+Info}} object that contains the user ID and user account of the remote user. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_adcc5cddc796788d6fb300895f604e8a7}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_adcc5cddc796788d6fb300895f604e8a7}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onUserStateChanged@{onUserStateChanged}}
\index{onUserStateChanged@{onUserStateChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onUserStateChanged()}{onUserStateChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+User\+State\+Changed (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{state }\end{DoxyParamCaption})}

Occurs when the remote user state is updated. 
\begin{DoxyParams}{Parameters}
{\em uid} & The ID of the remote user. \\
\hline
{\em state} & State of the remote user\+: Just \& \#\+R\+E\+M\+O\+T\+E\+\_\+\+U\+S\+E\+R\+\_\+\+S\+T\+A\+TE
\begin{DoxyItemize}
\item {\ttfamily U\+S\+E\+R\+\_\+\+S\+T\+A\+T\+E\+\_\+\+M\+U\+T\+E\+\_\+\+A\+U\+D\+IO(1 $<$$<$ 0)}\+: The remote user has muted the audio.
\item {\ttfamily U\+S\+E\+R\+\_\+\+S\+T\+A\+T\+E\+\_\+\+M\+U\+T\+E\+\_\+\+V\+I\+D\+EO(1 $<$$<$ 1)}\+: The remote user has muted the video.
\item {\ttfamily U\+S\+E\+R\+\_\+\+S\+T\+A\+T\+E\+\_\+\+E\+N\+A\+B\+L\+E\+\_\+\+V\+I\+D\+EO(1 $<$$<$ 4)}\+: The remote user has enabled the video, which includes video capturing and encoding.
\item {\ttfamily U\+S\+E\+R\+\_\+\+S\+T\+A\+T\+E\+\_\+\+E\+N\+A\+B\+L\+E\+\_\+\+L\+O\+C\+A\+L\+\_\+\+V\+I\+D\+EO(1 $<$$<$ 8)}\+: The remote user has enabled the local video capturing. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a848d29acef97523964bb27dd5b637162}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a848d29acef97523964bb27dd5b637162}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onUserJoined@{onUserJoined}}
\index{onUserJoined@{onUserJoined}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onUserJoined()}{onUserJoined()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+User\+Joined (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{elapsed }\end{DoxyParamCaption})}

Occurs when a remote user or broadcaster joins the channel.

If other users are already in the channel, the S\+DK also reports to the app on the existing users.

The S\+DK triggers this callback under one of the following circumstances\+:
\begin{DoxyItemize}
\item A broadcaster joins the channel by calling \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_acd30d6bf3055ccd45d08b34c2e8ac467}{join\+Channel}}.
\item A remote user switches the user role to broadcaster by calling \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a079013f8c575a75834e2787ee869413e}{set\+Client\+Role}}. after joining the channel.
\item A remote user or broadcaster rejoins the channel after a network interruption.
\end{DoxyItemize}

\begin{DoxyNote}{Note}
When a Web app joins the channel, this callback is triggered as long as the app publishes a stream.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid} & ID of the remote user or broadcaster joining the channel. \\
\hline
{\em elapsed} & The time elapsed (ms) from the local user calling {\ttfamily join\+Channel} or {\ttfamily set\+Client\+Role} until this callback is triggered. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a36dfe32e633612d8e74e1a32c504c817}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a36dfe32e633612d8e74e1a32c504c817}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onUserOffline@{onUserOffline}}
\index{onUserOffline@{onUserOffline}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onUserOffline()}{onUserOffline()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+User\+Offline (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{reason }\end{DoxyParamCaption})}

Occurs when a remote user or broadcaster goes offline.


\begin{DoxyParams}{Parameters}
{\em uid} & ID of the remote user or broadcaster who leaves the channel or drops offline. \\
\hline
{\em reason} & The reason why the remote user goes offline\+:
\begin{DoxyItemize}
\item {\ttfamily U\+S\+E\+R\+\_\+\+O\+F\+F\+L\+I\+N\+E\+\_\+\+Q\+U\+IT}(0)\+: When the user leaves the channel, the user sends a goodbye message. When this message is received, the S\+DK determines that the user leaves the channel.
\item {\ttfamily U\+S\+E\+R\+\_\+\+O\+F\+F\+L\+I\+N\+E\+\_\+\+D\+R\+O\+P\+P\+ED}(1)\+: When no data packet of the user is received for a certain period of time, the S\+DK assumes that the user drops offline. A poor network connection may lead to false detection, so we recommend using the R\+TM S\+DK for reliable offline detection.
\item {\ttfamily U\+S\+E\+R\+\_\+\+O\+F\+F\+L\+I\+N\+E\+\_\+\+B\+E\+C\+O\+M\+E\+\_\+\+A\+U\+D\+I\+E\+N\+CE}(2)\+: The user switches the user role from a broadcaster to an audience. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_acf3ab9feae0d9a6001da31e95363aa22}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_acf3ab9feae0d9a6001da31e95363aa22}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onConnectionStateChanged@{onConnectionStateChanged}}
\index{onConnectionStateChanged@{onConnectionStateChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onConnectionStateChanged()}{onConnectionStateChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Connection\+State\+Changed (\begin{DoxyParamCaption}\item[{int}]{state,  }\item[{int}]{reason }\end{DoxyParamCaption})}

Occurs when the network connection state changes. \begin{DoxySince}{Since}
v2.\+3.\+2.
\end{DoxySince}
The Agora S\+DK returns this callback to report on the current network connection state when it changes, and the reason to such change.


\begin{DoxyParams}{Parameters}
{\em state} & The current network connection state\+: 
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ad6e477befaf3fc97c2f4bff96e6ea072}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+D\+I\+S\+C\+O\+N\+N\+E\+C\+T\+E\+D(1)}}\+: The S\+DK is disconnected from Agora\textquotesingle{}s edge server. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_af01f606596669168030decf672aaa154}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+N\+G(2)}}\+: The S\+DK is connecting to Agora\textquotesingle{}s edge server. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a8738a89b8c423ecba13592e53f6d5503}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+C\+O\+N\+N\+E\+C\+T\+E\+D(3)}}\+: The S\+DK joined a channel and is connected to Agora\textquotesingle{}s edge server. You can now publish or subscribe to a media stream in the channel. 
\item \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a405f64ad7916414a06af2642b7e73dbb}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+C\+O\+N\+N\+E\+C\+T\+I\+N\+G(4)\}\+: The S\+DK keeps rejoining the channel after being disconnected from a joined channel because of network issues. }}\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a4c9d66474e974fa5b22ecf64f7126fa5}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+F\+A\+I\+L\+E\+D(5)}}\+: The S\+DK fails to join the channel. 
\end{DoxyItemize}\\
\hline
{\em reason} & The reason causing the change of the connection state\+: 
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_abb606ad5c57343a839ea09b8b34546c1}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+N\+G(0)}}\+: Connecting. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a4e69b81b172b6d51de8759a8deca777e}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+J\+O\+I\+N\+\_\+\+S\+U\+C\+C\+E\+S\+S(1)}}\+: The S\+DK has joined the channel successfully. 
\item \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a3d04a215f5300fb3564056892d787924}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+I\+N\+T\+E\+R\+R\+U\+P\+T\+E\+D(2)\}\+: The connection is interrupted. }}\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a26b2a1cc11bb74313ce22ded2925d917}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+B\+A\+N\+N\+E\+D\+\_\+\+B\+Y\+\_\+\+S\+E\+R\+V\+E\+R(3)}}\+: The connection is banned by Agora\textquotesingle{}s edge server. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_aa576fd5d37c6ee48b3b589f6d08cd4f5}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+J\+O\+I\+N\+\_\+\+F\+A\+I\+L\+E\+D(4)}}\+: The S\+DK fails to join the channel for more than 20 minutes and stops reconnecting to the channel. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a85a04c602381894ce268325ce41cd58f}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+L\+E\+A\+V\+E\+\_\+\+C\+H\+A\+N\+N\+E\+L(5)}}\+: The S\+DK has left the channel. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a27b1c09275adaf537eed714063911174}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+I\+N\+V\+A\+L\+I\+D\+\_\+\+A\+P\+P\+\_\+\+I\+D(6)}}\+: The specified App ID is invalid. Try to rejoin the channel with a valid App ID. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ad6611a9969eee67ec6e367b3ad70cb45}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+I\+N\+V\+A\+L\+I\+D\+\_\+\+C\+H\+A\+N\+N\+E\+L\+\_\+\+N\+A\+M\+E(7)}}\+: The specified channel name is invalid. Try to rejoin the channel with a valid channel name. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a51e625c9ecf3960c4a1db875ad8ca673}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+I\+N\+V\+A\+L\+I\+D\+\_\+\+T\+O\+K\+E\+N(8)}}\+: The generated token is invalid probably due to the following reasons\+: 
\begin{DoxyItemize}
\item The App Certificate for the project is enabled in Console, but you do not use the token. 
\item The uid that you specify in the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_acd30d6bf3055ccd45d08b34c2e8ac467}{join\+Channel}} method is different from the uid that you pass for generating the token. 
\end{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ae37e468f010df85752b5c54eb0db2802}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+T\+O\+K\+E\+N\+\_\+\+E\+X\+P\+I\+R\+E\+D(9)}}\+: The token has expired. Generate a new token from your server. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_aba6b076c053138ea5558b286aa69bbdd}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+R\+E\+J\+E\+C\+T\+E\+D\+\_\+\+B\+Y\+\_\+\+S\+E\+R\+V\+E\+R(10)}}\+: The user is banned by the server. 
\item \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a2919a3374a9bcf95aac0a1446fac7ce8}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+S\+E\+T\+T\+I\+N\+G\+\_\+\+P\+R\+O\+X\+Y\+\_\+\+S\+E\+R\+V\+E\+R(11)\}\+: The S\+DK tries to reconnect after setting a proxy server. }}\{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a99edeb79c7ef005a723507bdc77f5742}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+R\+E\+N\+E\+W\+\_\+\+T\+O\+K\+E\+N(12)\}\+: The token renews. }}\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_acf4100ddffbe9cff19eafdb78da91820}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+C\+L\+I\+E\+N\+T\+\_\+\+I\+P\+\_\+\+A\+D\+D\+R\+E\+S\+S\+\_\+\+C\+H\+A\+N\+G\+E\+D(13)}}\+: The client IP address has changed, probably due to a change of the network type, IP address, or network port. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a3f07b3882c069d534d8732f5bae6b7a5}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+K\+E\+E\+P\+\_\+\+A\+L\+I\+V\+E\+\_\+\+T\+I\+M\+E\+O\+U\+T(14)}}\+: Timeout for the keep-\/alive of the connection between the S\+DK and Agora\textquotesingle{}s edge server. The connection state changes to \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a405f64ad7916414a06af2642b7e73dbb}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+C\+O\+N\+N\+E\+C\+T\+I\+N\+G(4)\}. }}\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a8b2d37ca605ddb5552ff14fc70a15aa7}{C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+C\+H\+A\+N\+G\+E\+D\+\_\+\+L\+I\+C\+E\+N\+S\+E\+\_\+\+V\+A\+L\+I\+D\+A\+T\+I\+O\+N\+\_\+\+F\+A\+I\+L\+U\+R\+E(21)}}\+: The The connection is failed due to license validation failure. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aa0c0290b16674ef79efc89e2709d7ec5}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aa0c0290b16674ef79efc89e2709d7ec5}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onWlAccMessage@{onWlAccMessage}}
\index{onWlAccMessage@{onWlAccMessage}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onWlAccMessage()}{onWlAccMessage()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Wl\+Acc\+Message (\begin{DoxyParamCaption}\item[{int}]{reason,  }\item[{int}]{action,  }\item[{String}]{wl\+Acc\+Msg }\end{DoxyParamCaption})}

Occurs when the W\+I\+FI message need be sent to the user.


\begin{DoxyParams}{Parameters}
{\em reason} & The reason of notifying the user of a message. \\
\hline
{\em action} & Suggest an action for the user. \\
\hline
{\em wl\+Acc\+Msg} & Notification message to the user. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a1ce7e00ae3220df1d78dc4e5d51d6e74}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a1ce7e00ae3220df1d78dc4e5d51d6e74}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onWlAccStats@{onWlAccStats}}
\index{onWlAccStats@{onWlAccStats}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onWlAccStats()}{onWlAccStats()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Wl\+Acc\+Stats (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_wl_acc_stats}{Wl\+Acc\+Stats}}}]{current\+Stats,  }\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_wl_acc_stats}{Wl\+Acc\+Stats}}}]{average\+Stats }\end{DoxyParamCaption})}

Occurs when S\+DK statistics W\+I\+FI acceleration optimization effect.


\begin{DoxyParams}{Parameters}
{\em current\+Stats} & Instantaneous value of optimization effect. \\
\hline
{\em average\+Stats} & Average value of cumulative optimization effect. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ae295db0a95c7d6409b19b00dfef9ed20}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ae295db0a95c7d6409b19b00dfef9ed20}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onConnectionInterrupted@{onConnectionInterrupted}}
\index{onConnectionInterrupted@{onConnectionInterrupted}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onConnectionInterrupted()}{onConnectionInterrupted()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Connection\+Interrupted (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}

The S\+DK has lost connection to the server. This method is triggered upon connection is lost, while the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a3c40049545254582b454eea461b166f4}{on\+Connection\+Lost}} method is triggered when the S\+DK attempts to reconnect after losing connection. Once the connection is lost, and if the application does not call \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_af3fe5d61a9ca8db36b56432273d02307}{leave\+Channel}}, the S\+DK automatically tries to reconnect repeatedly. \mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a3c40049545254582b454eea461b166f4}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a3c40049545254582b454eea461b166f4}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onConnectionLost@{onConnectionLost}}
\index{onConnectionLost@{onConnectionLost}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onConnectionLost()}{onConnectionLost()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Connection\+Lost (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}

Occurs when the S\+DK cannot reconnect to the server 10 seconds after its connection to the server is interrupted.

The S\+DK triggers this callback when it cannot connect to the server 10 seconds after calling \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_acd30d6bf3055ccd45d08b34c2e8ac467}{join\+Channel}}, regardless of whether it is in the channel or not. \mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a3699579c7e341ea19e185b967748ddd4}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a3699579c7e341ea19e185b967748ddd4}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onConnectionBanned@{onConnectionBanned}}
\index{onConnectionBanned@{onConnectionBanned}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onConnectionBanned()}{onConnectionBanned()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Connection\+Banned (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}

Your connection is banned by the Agora Server.

Note\+: The S\+DK does not try to reconnect. \mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ad230797ab45c4307562e1b19519253b5}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ad230797ab45c4307562e1b19519253b5}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onTokenPrivilegeWillExpire@{onTokenPrivilegeWillExpire}}
\index{onTokenPrivilegeWillExpire@{onTokenPrivilegeWillExpire}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onTokenPrivilegeWillExpire()}{onTokenPrivilegeWillExpire()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Token\+Privilege\+Will\+Expire (\begin{DoxyParamCaption}\item[{String}]{token }\end{DoxyParamCaption})}

Occurs when the token will expire in 30 seconds.

If the token you specified when calling \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_acd30d6bf3055ccd45d08b34c2e8ac467}{join\+Channel}} expires, the user will drop offline. This callback is triggered 30 seconds before the token expires, to remind you to renew the token.

Upon receiving this callback, generate a new token at your app server and call \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a9c8f9a9cabfb7ac7e71990525910793e}{renew\+Token}} to pass the new Token to the S\+DK.

\begin{DoxySeeAlso}{See also}
\href{https://docs.agora.io/en/Interactive\%20Broadcast/token_server_cpp?platform=CPP}{\texttt{ How to generate a token}}.
\end{DoxySeeAlso}

\begin{DoxyParams}{Parameters}
{\em token} & The token that will expire in 30 seconds. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a2585f098b637d03ae3aca03daaca8eef}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a2585f098b637d03ae3aca03daaca8eef}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onRequestToken@{onRequestToken}}
\index{onRequestToken@{onRequestToken}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onRequestToken()}{onRequestToken()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Request\+Token (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}

Occurs when the token has expired.

If a token is specified when calling the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_acd30d6bf3055ccd45d08b34c2e8ac467}{join\+Channel}} method, the token expires after a certain period of time and you need a new token to reconnect to the server.

Upon receiving this callback, generate a new token at your app server and call \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a9c8f9a9cabfb7ac7e71990525910793e}{renew\+Token}} to pass the new token to the S\+DK.

\begin{DoxySeeAlso}{See also}
\href{https://docs.agora.io/en/Interactive\%20Broadcast/token_server_cpp?platform=CPP}{\texttt{ How to generate a token}}. 
\end{DoxySeeAlso}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a2ba550d177fe9550ac01a5f9349a75a5}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a2ba550d177fe9550ac01a5f9349a75a5}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onLicenseValidationFailure@{onLicenseValidationFailure}}
\index{onLicenseValidationFailure@{onLicenseValidationFailure}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onLicenseValidationFailure()}{onLicenseValidationFailure()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+License\+Validation\+Failure (\begin{DoxyParamCaption}\item[{int}]{error }\end{DoxyParamCaption})}

Occurs when connection license verification fails You can know the reason accordding to error code


\begin{DoxyParams}{Parameters}
{\em error} & license verify fail reason\+:
\begin{DoxyItemize}
\item {\ttfamily L\+I\+C\+E\+N\+S\+E\+\_\+\+E\+R\+R\+\_\+\+I\+N\+V\+A\+L\+I\+D(1)}\+: Invalid license.
\item {\ttfamily L\+I\+C\+E\+N\+S\+E\+\_\+\+E\+R\+R\+\_\+\+E\+X\+P\+I\+R\+E(2)}\+: License expired.
\item {\ttfamily L\+I\+C\+E\+N\+S\+E\+\_\+\+E\+R\+R\+\_\+\+M\+I\+N\+U\+T\+E\+S\+\_\+\+E\+X\+C\+E\+E\+D(3)}\+: Exceed license minutes limit.
\item {\ttfamily L\+I\+C\+E\+N\+S\+E\+\_\+\+E\+R\+R\+\_\+\+L\+I\+M\+I\+T\+E\+D\+\_\+\+P\+E\+R\+I\+O\+D(4)}\+: License use in limited period.
\item {\ttfamily L\+I\+C\+E\+N\+S\+E\+\_\+\+E\+R\+R\+\_\+\+D\+I\+F\+F\+\_\+\+D\+E\+V\+I\+C\+E\+S(5)}\+: Same license used in different devices at the same time.
\item {\ttfamily L\+I\+C\+E\+N\+S\+E\+\_\+\+E\+R\+R\+\_\+\+I\+N\+T\+E\+R\+N\+A\+L(99)}\+: S\+DK internal error. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6b9a1f4de49ef268b2be15b269ee7c47}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6b9a1f4de49ef268b2be15b269ee7c47}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onAudioVolumeIndication@{onAudioVolumeIndication}}
\index{onAudioVolumeIndication@{onAudioVolumeIndication}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onAudioVolumeIndication()}{onAudioVolumeIndication()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Audio\+Volume\+Indication (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_audio_volume_info}{Audio\+Volume\+Info}}\mbox{[}$\,$\mbox{]}}]{speakers,  }\item[{int}]{total\+Volume }\end{DoxyParamCaption})}

Reports which users are speaking and the speaker‘s volume.

This callback reports the I\+Ds and volumes of the loudest speakers (at most 3) at the moment in the channel, and whether the local user is speaking. Once enabled, this callback is triggered at the set interval, regardless of whether a user speaks or not.

The S\+DK triggers two independent {\ttfamily on\+Audio\+Volume\+Indication} callbacks at one time, which separately report the volume information of the local user and all the remote speakers. For more information, see the detailed parameter descriptions.

Calling the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a2214ae694000345bbeaa9610411e52b7}{mute\+Local\+Audio\+Stream}} method affects the S\+DK\textquotesingle{}s behavior.
\begin{DoxyItemize}
\item If the local user calls the {\ttfamily mute\+Local\+Audio\+Stream} method, the S\+DK stops triggering the local user\textquotesingle{}s callback.
\item 20 seconds after a remote speaker calls the {\ttfamily mute\+Local\+Audio\+Stream} method, the remote speakers\textquotesingle{} callback does not include information of this remote user; 20 seconds after all remote users call the {\ttfamily mute\+Local\+Audio\+Stream} method, the S\+DK stops triggering the remote speakers\textquotesingle{} callback.
\end{DoxyItemize}


\begin{DoxyParams}{Parameters}
{\em speakers} & An array containing the user ID and volume information for each speaker\+: \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_audio_volume_info}{Audio\+Volume\+Info}}.
\begin{DoxyItemize}
\item In the local user\textquotesingle{}s callback, this array contains the following members\+:
\begin{DoxyItemize}
\item {\ttfamily uid} = 0,
\item {\ttfamily volume} = {\ttfamily total\+Volume}, which reports the sum of the voice volume and audio-\/mixing volume of the local user.
\end{DoxyItemize}
\item In the remote users\textquotesingle{} callback, this array contains the following members\+:
\begin{DoxyItemize}
\item {\ttfamily uid} of each remote speaker.
\item {\ttfamily volume}, which reports the sum of the voice volume and audio-\/mixing volume of each remote speaker.
\end{DoxyItemize}

An empty {\ttfamily speakers} array in the callback indicates that no remote user is speaking at the moment. 
\end{DoxyItemize}\\
\hline
{\em total\+Volume} & The total volume after audio mixing. The value ranges between 0 (the lowest volume) and 255 (the highest volume).
\begin{DoxyItemize}
\item In the local user\textquotesingle{}s callback, {\ttfamily total\+Volume} is the sum of the voice volume and audio-\/mixing volume of the local user.
\item In the remote users\textquotesingle{} callback, {\ttfamily total\+Volume} is the sum of the voice volume and audio-\/mixing volume of all the remote speakers. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a150869ac2672bc1af7ba9f8fc4d10570}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a150869ac2672bc1af7ba9f8fc4d10570}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onActiveSpeaker@{onActiveSpeaker}}
\index{onActiveSpeaker@{onActiveSpeaker}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onActiveSpeaker()}{onActiveSpeaker()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Active\+Speaker (\begin{DoxyParamCaption}\item[{int}]{uid }\end{DoxyParamCaption})}

Occurs when an active speaker is detected.

If you have called the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_acb7da23e2f44e57e6fbae8c84f233624}{enable\+Audio\+Volume\+Indication}} method, this callback is triggered when the volume detecting unit has detected an active speaker in the channel. This callback also returns the {\ttfamily uid} of the active speaker.

You can add relative functions on your app, for example, the active speaker, once detected, will have the portrait zoomed in.

\begin{DoxyNote}{Note}

\begin{DoxyItemize}
\item You need to call {\ttfamily enable\+Audio\+Volume\+Indication} to receive this callback.
\item The active speaker means the user ID of the speaker who speaks at the highest volume during a certain period of time.
\end{DoxyItemize}
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid} & The ID of the active speaker. A {\ttfamily uid} of 0 means the local user. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ac14aad764dc710a05b6cad4c3838c706}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ac14aad764dc710a05b6cad4c3838c706}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onVideoStopped@{onVideoStopped}}
\index{onVideoStopped@{onVideoStopped}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onVideoStopped()}{onVideoStopped()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Video\+Stopped (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}

The video has stopped playing. \begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000007}{Deprecated}}]Use \mbox{\hyperlink{}{on\+Local\+Video\+State\+Changed}} instead.\end{DoxyRefDesc}


The application can use this callback to change the configuration of the view (for example, display other pictures in the view) after the video stops. \mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a18073dc2bcd1e4a4df8f741014fc3106}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a18073dc2bcd1e4a4df8f741014fc3106}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onFirstLocalVideoFrame@{onFirstLocalVideoFrame}}
\index{onFirstLocalVideoFrame@{onFirstLocalVideoFrame}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onFirstLocalVideoFrame()}{onFirstLocalVideoFrame()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+First\+Local\+Video\+Frame (\begin{DoxyParamCaption}\item[{Constants.\+Video\+Source\+Type}]{source,  }\item[{int}]{width,  }\item[{int}]{height,  }\item[{int}]{elapsed }\end{DoxyParamCaption})}

The first local video frame is displayed on the screen.


\begin{DoxyParams}{Parameters}
{\em source} & source type of the originated video source. \\
\hline
{\em width} & Width (pixels) of the video stream. \\
\hline
{\em height} & Height (pixels) of the video stream. \\
\hline
{\em elapsed} & Time elapsed (ms) from calling \mbox{\hyperlink{}{token, java.\+lang.\+String channel\+Name, java.\+lang.\+String optional\+Info, int optional\+Uid) join\+Channel}} until this callback is triggered. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5cb5cf5ecef5eb955c65959620c843e3}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5cb5cf5ecef5eb955c65959620c843e3}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onFirstLocalVideoFramePublished@{onFirstLocalVideoFramePublished}}
\index{onFirstLocalVideoFramePublished@{onFirstLocalVideoFramePublished}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onFirstLocalVideoFramePublished()}{onFirstLocalVideoFramePublished()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+First\+Local\+Video\+Frame\+Published (\begin{DoxyParamCaption}\item[{Constants.\+Video\+Source\+Type}]{source,  }\item[{int}]{elapsed }\end{DoxyParamCaption})}

Occurs when the first video frame is published.


\begin{DoxyParams}{Parameters}
{\em source} & source type of the originated video source. \\
\hline
{\em elapsed} & The time elapsed (ms) from the local user calling join\+Channel to the S\+DK triggers this callback. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ab63e6aa894c685a766fc6e81711c68e6}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ab63e6aa894c685a766fc6e81711c68e6}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onFirstRemoteVideoDecoded@{onFirstRemoteVideoDecoded}}
\index{onFirstRemoteVideoDecoded@{onFirstRemoteVideoDecoded}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onFirstRemoteVideoDecoded()}{onFirstRemoteVideoDecoded()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+First\+Remote\+Video\+Decoded (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{width,  }\item[{int}]{height,  }\item[{int}]{elapsed }\end{DoxyParamCaption})}

Occurs when the first remote video frame is received and decoded.

\begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000008}{Deprecated}}]This callback is deprecated. Use {\ttfamily R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+T\+A\+R\+T\+I\+N\+G(1)} or {\ttfamily R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+D\+E\+C\+O\+D\+I\+N\+G(2)} in the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5daae97f78becbf71dc3dbfd494f8419}{on\+Remote\+Video\+State\+Changed}} callback instead.\end{DoxyRefDesc}


This callback is triggered in either of the following scenarios\+: 
\begin{DoxyItemize}
\item The remote user joins the channel and sends the video stream. 
\item The remote user stops sending the video stream and re-\/sends it after 15 seconds. Possible reasons include\+: 
\begin{DoxyItemize}
\item The remote user leaves channel. 
\item The remote user drops offline. 
\item The remote user calls the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a20fd1bfb77864b47bc264fc370b0fae3}{mute\+Local\+Video\+Stream}} method. 
\item The remote user calls the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a7dbba3464a6c44818282ad920e4097bc}{disable\+Video}} method. 
\end{DoxyItemize}
\end{DoxyItemize}


\begin{DoxyParams}{Parameters}
{\em uid} & User ID of the remote user sending the video streams. \\
\hline
{\em width} & Width (pixels) of the video stream. \\
\hline
{\em height} & Height (pixels) of the video stream. \\
\hline
{\em elapsed} & Time elapsed (ms) from the local user calling the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_acd30d6bf3055ccd45d08b34c2e8ac467}{join\+Channel}} method until this callback is triggered. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a753cffdbf678f94a2b07495dd02cc4f2}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a753cffdbf678f94a2b07495dd02cc4f2}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onFirstRemoteVideoFrame@{onFirstRemoteVideoFrame}}
\index{onFirstRemoteVideoFrame@{onFirstRemoteVideoFrame}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onFirstRemoteVideoFrame()}{onFirstRemoteVideoFrame()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+First\+Remote\+Video\+Frame (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{width,  }\item[{int}]{height,  }\item[{int}]{elapsed }\end{DoxyParamCaption})}

The first frame of the remote video appears in the user’s video window.

The application can retrieve the data of time elapsed from user joining the channel until the first video frame is displayed.


\begin{DoxyParams}{Parameters}
{\em uid} & User ID of the user whose video streams are received. \\
\hline
{\em width} & Width (pixels) of the video stream. \\
\hline
{\em height} & Height (pixels) of the video stream. \\
\hline
{\em elapsed} & Time elapsed (ms) from calling \mbox{\hyperlink{}{token, java.\+lang.\+String channel\+Name, java.\+lang.\+String optional\+Info, int optional\+Uid) join\+Channel}} until this callback is triggered. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a2854027a99209da1cc0efa46c54211b4}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a2854027a99209da1cc0efa46c54211b4}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onUserMuteAudio@{onUserMuteAudio}}
\index{onUserMuteAudio@{onUserMuteAudio}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onUserMuteAudio()}{onUserMuteAudio()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+User\+Mute\+Audio (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{boolean}]{muted }\end{DoxyParamCaption})}

Occurs when a remote user stops/resumes sending the audio stream.

The S\+DK triggers this callback when the remote user stops or resumes sending the audio stream by calling the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a2214ae694000345bbeaa9610411e52b7}{mute\+Local\+Audio\+Stream}} method.

\begin{DoxyNote}{Note}
This callback does not work properly when the number of users (in the {\ttfamily C\+O\+M\+M\+U\+N\+I\+C\+A\+T\+I\+ON} profile) or hosts (in the {\ttfamily L\+I\+V\+E\+\_\+\+B\+R\+O\+A\+D\+C\+A\+S\+T\+I\+NG} profile) in the channel exceeds 17.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid} & ID of the remote user. \\
\hline
{\em muted} & Whether the remote user\textquotesingle{}s audio stream playback pauses/resumes\+: 
\begin{DoxyItemize}
\item True\+: User\textquotesingle{}s audio is paused. 
\item False\+: User\textquotesingle{}s audio is resumed. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a9b5ec64a801ee3442a0aeab35c5d059b}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a9b5ec64a801ee3442a0aeab35c5d059b}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onUserMuteVideo@{onUserMuteVideo}}
\index{onUserMuteVideo@{onUserMuteVideo}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onUserMuteVideo()}{onUserMuteVideo()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+User\+Mute\+Video (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{boolean}]{muted }\end{DoxyParamCaption})}

Occurs when a remote user stops/resumes sending the video stream.

The S\+DK triggers this callback when the remote user stops or resumes sending the video stream by calling the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a20fd1bfb77864b47bc264fc370b0fae3}{mute\+Local\+Video\+Stream}} method.

\begin{DoxyNote}{Note}
This callback does not work properly when the number of users (in the {\ttfamily C\+O\+M\+M\+U\+N\+I\+C\+A\+T\+I\+ON} profile) or hosts (in the {\ttfamily L\+I\+V\+E\+\_\+\+B\+R\+O\+A\+D\+C\+A\+S\+T\+I\+NG} profile) in the channel exceeds 17.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid} & ID of the remote user. \\
\hline
{\em muted} & Whether the remote user\textquotesingle{}s video stream playback pauses/resumes\+: 
\begin{DoxyItemize}
\item True\+: User\textquotesingle{}s video is paused. 
\item False\+: User\textquotesingle{}s video is resumed. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aebce7065ea48abbdb6001fec7a00c1ac}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aebce7065ea48abbdb6001fec7a00c1ac}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onUserEnableVideo@{onUserEnableVideo}}
\index{onUserEnableVideo@{onUserEnableVideo}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onUserEnableVideo()}{onUserEnableVideo()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+User\+Enable\+Video (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{boolean}]{enabled }\end{DoxyParamCaption})}

Occurs when a remote user enables/disables the video module.

Once the video module is disabled, the remote user can only use a voice call. The remote user cannot send or receive any video from other users.

The S\+DK triggers this callback when the remote user enables or disables the video module by calling the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a7146c53b6fe50980242bdd8dcddf177f}{enable\+Video}} or \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a7dbba3464a6c44818282ad920e4097bc}{disable\+Video}} method.

\begin{DoxyNote}{Note}
This callback is invalid when the number of users or hosts in the channel exceeds 20. 
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid} & User ID of the remote user. \\
\hline
{\em enabled} & Whether the specific remote user enables/disables the video module\+: 
\begin{DoxyItemize}
\item true\+: Enabled. The remote user can enter a video session. 
\item false\+: Disabled. The remote user can only enter a voice session, and cannot send or receive any video stream. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a9e43e9e2b70a0d4b20a0e0313a734c90}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a9e43e9e2b70a0d4b20a0e0313a734c90}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onUserEnableLocalVideo@{onUserEnableLocalVideo}}
\index{onUserEnableLocalVideo@{onUserEnableLocalVideo}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onUserEnableLocalVideo()}{onUserEnableLocalVideo()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+User\+Enable\+Local\+Video (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{boolean}]{enabled }\end{DoxyParamCaption})}

Occurs when a remote user enables/disables the local video capture function. \begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000009}{Deprecated}}]This callback is deprecated and replaced by the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5daae97f78becbf71dc3dbfd494f8419}{on\+Remote\+Video\+State\+Changed}} callback with the following parameters\+:
\begin{DoxyItemize}
\item {\ttfamily R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+T\+O\+P\+P\+E\+D(0)} and {\ttfamily R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+E\+M\+O\+T\+E\+\_\+\+M\+U\+T\+E\+D(5)}.
\item {\ttfamily R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+D\+E\+C\+O\+D\+I\+N\+G(2)} and {\ttfamily R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+E\+M\+O\+T\+E\+\_\+\+U\+N\+M\+U\+T\+E\+D(6)}.
\end{DoxyItemize}\end{DoxyRefDesc}


The S\+DK triggers this callback when the remote user resumes or stops capturing the video stream by calling the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a80351723711a6f3a66abcc287154eb10}{enable\+Local\+Video}} method.

This callback is only applicable to the scenario when the remote user only wants to watch the remote video without sending any video stream to the other user.


\begin{DoxyParams}{Parameters}
{\em uid} & User ID of the remote user. \\
\hline
{\em enabled} & Whether the specific remote user enables/disables the local video capturing function\+: 
\begin{DoxyItemize}
\item true\+: Enabled. Other users in the channel can see the video of this remote user. 
\item false\+: Disabled. Other users in the channel can no longer receive the video stream from this remote user, while this remote user can still receive the video streams from other users. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a729049a110c6a1b7e951c8a9a5cc32c9}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a729049a110c6a1b7e951c8a9a5cc32c9}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onVideoSizeChanged@{onVideoSizeChanged}}
\index{onVideoSizeChanged@{onVideoSizeChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onVideoSizeChanged()}{onVideoSizeChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Video\+Size\+Changed (\begin{DoxyParamCaption}\item[{Constants.\+Video\+Source\+Type}]{source,  }\item[{int}]{uid,  }\item[{int}]{width,  }\item[{int}]{height,  }\item[{int}]{rotation }\end{DoxyParamCaption})}

Occurs when the local or remote video size or rotation has changed.


\begin{DoxyParams}{Parameters}
{\em source} & The video source type. \\
\hline
{\em uid} & The user ID. 0 indicates the local user. \\
\hline
{\em width} & The new width (pixels) of the video. \\
\hline
{\em height} & The new height (pixels) of the video. \\
\hline
{\em rotation} & The rotation information of the video. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a8abb48195f676e5730339ed0ad0f8dc1}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a8abb48195f676e5730339ed0ad0f8dc1}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onRemoteAudioStateChanged@{onRemoteAudioStateChanged}}
\index{onRemoteAudioStateChanged@{onRemoteAudioStateChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onRemoteAudioStateChanged()}{onRemoteAudioStateChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Remote\+Audio\+State\+Changed (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{state,  }\item[{int}]{reason,  }\item[{int}]{elapsed }\end{DoxyParamCaption})}

Occurs when the remote audio state changes.

This callback indicates the state change of the remote audio stream.


\begin{DoxyParams}{Parameters}
{\em uid} & ID of the user whose audio state changes. \\
\hline
{\em state} & The state of the remote audio\+: 
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a143f66343a78465f6ec60f727a91e920}{R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+T\+O\+P\+P\+E\+D(0)}}\+: The remote audio is in the default state, probably due to {\ttfamily R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+L\+O\+C\+A\+L\+\_\+\+M\+U\+T\+E\+D(3)}, {\ttfamily R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+E\+M\+O\+T\+E\+\_\+\+M\+U\+T\+E\+D(5)}, or {\ttfamily R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+E\+M\+O\+T\+E\+\_\+\+O\+F\+F\+L\+I\+N\+E(7)}. 
\item \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a3b47f50dc787f9c834118a5a13886bd5}{R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+T\+A\+R\+T\+I\+N\+G(1)\}\+: The first remote audio packet is received. }}\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ada23c1aada5b5a1b6784894dcdaf3e35}{R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+D\+E\+C\+O\+D\+I\+N\+G(2)}}\+: The remote audio stream is decoded and plays normally, probably due to {\ttfamily R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+N\+E\+T\+W\+O\+R\+K\+\_\+\+R\+E\+C\+O\+V\+E\+R\+Y(2)}, {\ttfamily R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+L\+O\+C\+A\+L\+\_\+\+U\+N\+M\+U\+T\+E\+D(4)} or {\ttfamily R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+E\+M\+O\+T\+E\+\_\+\+U\+N\+M\+U\+T\+E\+D(6)}. 
\item \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a0814e20443da4da907d8cf371f57f9a7}{R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+F\+R\+O\+Z\+E\+N(3)\}\+: The remote audio is frozen, probably due to {\ttfamily R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+N\+E\+T\+W\+O\+R\+K\+\_\+\+C\+O\+N\+G\+E\+S\+T\+I\+O\+N(1)}. }}\{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ad05a9381968692140c23c80db3d55f94}{R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+F\+A\+I\+L\+E\+D(4)\}\+: The remote audio fails to start, probably due to {\ttfamily R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+I\+N\+T\+E\+R\+N\+A\+L(0)}. }} 
\end{DoxyItemize}\\
\hline
{\em reason} & The reason of the remote audio state change. 
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a883fb97c68025120665d6e1059db4ec3}{R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+I\+N\+T\+E\+R\+N\+A\+L(0)}}\+: Internal reasons. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a624e31119d2a11553caab0c7b9a62d69}{R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+N\+E\+T\+W\+O\+R\+K\+\_\+\+C\+O\+N\+G\+E\+S\+T\+I\+O\+N(1)}}\+: Network congestion. 
\item \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a7b29425fe66a0015d4f796823e4420d5}{R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+N\+E\+T\+W\+O\+R\+K\+\_\+\+R\+E\+C\+O\+V\+E\+R\+Y(2)\}\+: Network recovery. }}\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ae6f6a41b3b3f86c36d3cf2e79914f01b}{R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+L\+O\+C\+A\+L\+\_\+\+M\+U\+T\+E\+D(3)}}\+: The local user stops receiving the remote audio stream or disables the audio module. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a685bdb640034afbf235094fdf420e823}{R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+L\+O\+C\+A\+L\+\_\+\+U\+N\+M\+U\+T\+E\+D(4)}}\+: The local user resumes receiving the remote audio stream or enables the audio module. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a2cd67ae0ffa4a9fc5e4b5297caf4646c}{R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+E\+M\+O\+T\+E\+\_\+\+M\+U\+T\+E\+D(5)}}\+: The remote user stops sending the audio stream or disables the audio module. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ad016ccea6a8ab4b1410e8496d6e406f5}{R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+E\+M\+O\+T\+E\+\_\+\+U\+N\+M\+U\+T\+E\+D(6)}}\+: The remote user resumes sending the audio stream or enables the audio module. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_abe0e3460ff426e6a3b14452d09ad9e98}{R\+E\+M\+O\+T\+E\+\_\+\+A\+U\+D\+I\+O\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+E\+M\+O\+T\+E\+\_\+\+O\+F\+F\+L\+I\+N\+E(7)}}\+: The remote user leaves the channel. 
\end{DoxyItemize}\\
\hline
{\em elapsed} & Time elapsed (ms) from the local user calling the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_acd30d6bf3055ccd45d08b34c2e8ac467}{join\+Channel}} method until the S\+DK triggers this callback. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ad6a5250389c780cb6e37b9534822a27b}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ad6a5250389c780cb6e37b9534822a27b}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onAudioPublishStateChanged@{onAudioPublishStateChanged}}
\index{onAudioPublishStateChanged@{onAudioPublishStateChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onAudioPublishStateChanged()}{onAudioPublishStateChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Audio\+Publish\+State\+Changed (\begin{DoxyParamCaption}\item[{String}]{channel,  }\item[{int}]{old\+State,  }\item[{int}]{new\+State,  }\item[{int}]{elapse\+Since\+Last\+State }\end{DoxyParamCaption})}

Occurs when the audio publish state changed.

The publishing states include\+:
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_afea6dae63ada214c45cdf1a288169fb1}{P\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+I\+D\+L\+E(0)}}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ae989844d83f339039c1547c42a645599}{P\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+N\+O\+\_\+\+P\+U\+B\+L\+I\+S\+H\+E\+D(1)}}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a17ce1a601cf881a3b0e861dee0090cc8}{P\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+U\+B\+L\+I\+S\+H\+I\+N\+G(2)}}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ade0a051a67825850d04a8306b7343501}{P\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+U\+B\+L\+I\+S\+H\+E\+D(3)}}
\end{DoxyItemize}


\begin{DoxyParams}{Parameters}
{\em channel} & The channel name of user joined. \\
\hline
{\em old\+State} & The old state of the audio stream publish. \\
\hline
{\em new\+State} & The new state of the audio stream publish. \\
\hline
{\em elapse\+Since\+Last\+State} & The time elapsed (ms) from the old state to the new state. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_afaeef3162faac616eda2f18bfbd5f214}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_afaeef3162faac616eda2f18bfbd5f214}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onVideoPublishStateChanged@{onVideoPublishStateChanged}}
\index{onVideoPublishStateChanged@{onVideoPublishStateChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onVideoPublishStateChanged()}{onVideoPublishStateChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Video\+Publish\+State\+Changed (\begin{DoxyParamCaption}\item[{Constants.\+Video\+Source\+Type}]{source,  }\item[{String}]{channel,  }\item[{int}]{old\+State,  }\item[{int}]{new\+State,  }\item[{int}]{elapse\+Since\+Last\+State }\end{DoxyParamCaption})}

Occurs when the audio publish state changed.

The publishing states include\+:
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_afea6dae63ada214c45cdf1a288169fb1}{P\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+I\+D\+L\+E(0)}}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ae989844d83f339039c1547c42a645599}{P\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+N\+O\+\_\+\+P\+U\+B\+L\+I\+S\+H\+E\+D(1)}}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a17ce1a601cf881a3b0e861dee0090cc8}{P\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+U\+B\+L\+I\+S\+H\+I\+N\+G(2)}}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ade0a051a67825850d04a8306b7343501}{P\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+U\+B\+L\+I\+S\+H\+E\+D(3)}}
\end{DoxyItemize}


\begin{DoxyParams}{Parameters}
{\em source} & source type of the originated video source. \\
\hline
{\em channel} & The channel name of user joined. \\
\hline
{\em old\+State} & The old state of the video stream subscribe state. \\
\hline
{\em new\+State} & The new state of the video stream subscribe state. \\
\hline
{\em elapse\+Since\+Last\+State} & The time elapsed (ms) from the old state to the new state. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_af99f6ab9132fc82d8198fa325601dd9e}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_af99f6ab9132fc82d8198fa325601dd9e}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onAudioSubscribeStateChanged@{onAudioSubscribeStateChanged}}
\index{onAudioSubscribeStateChanged@{onAudioSubscribeStateChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onAudioSubscribeStateChanged()}{onAudioSubscribeStateChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Audio\+Subscribe\+State\+Changed (\begin{DoxyParamCaption}\item[{String}]{channel,  }\item[{int}]{uid,  }\item[{int}]{old\+State,  }\item[{int}]{new\+State,  }\item[{int}]{elapse\+Since\+Last\+State }\end{DoxyParamCaption})}

Occurs when the audio subscribe state changed. The subscribing states include\+:
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a8892f933799d1aab29c84719ad2ae4df}{S\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+I\+D\+L\+E(0)}}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a088d565f887789ebc879de0ef6fd4f2b}{S\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+N\+O\+\_\+\+S\+U\+B\+S\+C\+R\+I\+B\+E\+D(1)}}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_aa29567db1fc654930952cab0465c6d2a}{S\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+U\+B\+S\+C\+R\+I\+B\+I\+N\+G(2)}}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ad947862dc13200f744e1ed4090c94225}{S\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+U\+B\+S\+C\+R\+I\+B\+E\+D(3)}}
\end{DoxyItemize}


\begin{DoxyParams}{Parameters}
{\em channel} & The channel name of user joined. \\
\hline
{\em uid} & The remote user ID that is subscribed to. \\
\hline
{\em old\+State} & The old state of the audio stream subscribe. \\
\hline
{\em new\+State} & The new state of the audio stream subscribe . \\
\hline
{\em elapse\+Since\+Last\+State} & The time elapsed (ms) from the old state to the new state. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a83dc1b71944119fd1f78055a9ca7f8ab}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a83dc1b71944119fd1f78055a9ca7f8ab}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onVideoSubscribeStateChanged@{onVideoSubscribeStateChanged}}
\index{onVideoSubscribeStateChanged@{onVideoSubscribeStateChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onVideoSubscribeStateChanged()}{onVideoSubscribeStateChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Video\+Subscribe\+State\+Changed (\begin{DoxyParamCaption}\item[{String}]{channel,  }\item[{int}]{uid,  }\item[{int}]{old\+State,  }\item[{int}]{new\+State,  }\item[{int}]{elapse\+Since\+Last\+State }\end{DoxyParamCaption})}

Occurs when the video subscribe state changed.

The subscribing states include\+:
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a8892f933799d1aab29c84719ad2ae4df}{S\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+I\+D\+L\+E(0)}}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a088d565f887789ebc879de0ef6fd4f2b}{S\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+N\+O\+\_\+\+S\+U\+B\+S\+C\+R\+I\+B\+E\+D(1)}}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_aa29567db1fc654930952cab0465c6d2a}{S\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+U\+B\+S\+C\+R\+I\+B\+I\+N\+G(2)}}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ad947862dc13200f744e1ed4090c94225}{S\+U\+B\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+U\+B\+S\+C\+R\+I\+B\+E\+D(3)}}
\end{DoxyItemize}


\begin{DoxyParams}{Parameters}
{\em channel} & The channel name of user joined. \\
\hline
{\em uid} & The remote user ID that is subscribed to. \\
\hline
{\em old\+State} & The old state of the video stream subscribe state. \\
\hline
{\em new\+State} & The new state of the video stream subscribe state. \\
\hline
{\em elapse\+Since\+Last\+State} & The time elapsed (ms) from the old state to the new state. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5daae97f78becbf71dc3dbfd494f8419}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5daae97f78becbf71dc3dbfd494f8419}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onRemoteVideoStateChanged@{onRemoteVideoStateChanged}}
\index{onRemoteVideoStateChanged@{onRemoteVideoStateChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onRemoteVideoStateChanged()}{onRemoteVideoStateChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Remote\+Video\+State\+Changed (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{state,  }\item[{int}]{reason,  }\item[{int}]{elapsed }\end{DoxyParamCaption})}

Occurs when the remote video state has changed.

\begin{DoxyNote}{Note}
This callback does not work properly when the number of users (in the {\ttfamily C\+O\+M\+M\+U\+N\+I\+C\+A\+T\+I\+ON} profile) or hosts (in the {\ttfamily L\+I\+V\+E\+\_\+\+B\+R\+O\+A\+D\+C\+A\+S\+T\+I\+NG} profile) in the channel exceeds 17.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em uid} & ID of the user whose video state has changed. \\
\hline
{\em state} & State of the remote video\+:
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a5493d0c3666833bd55d3f4cd873492cd}{R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+T\+O\+P\+P\+E\+D(0)}}\+: The remote video is in the default state, probably due to R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+L\+O\+C\+A\+L\+\_\+\+M\+U\+T\+E\+D(3), R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+E\+M\+O\+T\+E\+\_\+\+M\+U\+T\+E\+D(5), or R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+E\+M\+O\+T\+E\+\_\+\+O\+F\+F\+L\+I\+N\+E(7).
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a64a1160eb0234ec7b61cb777ed14806f}{R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+T\+A\+R\+T\+I\+N\+G(1)}}\+: The first remote video packet is received.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_afbf374247351202d67349694eb0d0cdd}{R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+D\+E\+C\+O\+D\+I\+N\+G(2)}}\+: The remote video stream is decoded and plays normally, probably due to R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+N\+E\+T\+W\+O\+R\+K\+\_\+\+R\+E\+C\+O\+V\+E\+RY (2), R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+L\+O\+C\+A\+L\+\_\+\+U\+N\+M\+U\+T\+E\+D(4), R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+E\+M\+O\+T\+E\+\_\+\+U\+N\+M\+U\+T\+E\+D(6), or R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+A\+U\+D\+I\+O\+\_\+\+F\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+O\+V\+E\+R\+Y(9).
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a766f73bd2ec07ce1d1618745838620fc}{R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+F\+R\+O\+Z\+E\+N(3)}}\+: The remote video is frozen, probably due to R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+N\+E\+T\+W\+O\+R\+K\+\_\+\+C\+O\+N\+G\+E\+S\+T\+I\+O\+N(1) or R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+A\+U\+D\+I\+O\+\_\+\+F\+A\+L\+L\+B\+A\+C\+K(8).
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a9d1a151d40db83c6f7bd600f5f6b1611}{R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+F\+A\+I\+L\+E\+D(4)}}\+: The remote video fails to start, probably due to R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+I\+N\+T\+E\+R\+N\+A\+L(0). 
\end{DoxyItemize}\\
\hline
{\em reason} & The reason of the remote video state change\+:
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a254bbe611dac2b61af5fa69abf893968}{R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+I\+N\+T\+E\+R\+N\+A\+L(0)}}\+: Internal reasons.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a9f140cb2053938790aed7328f46b3566}{R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+N\+E\+T\+W\+O\+R\+K\+\_\+\+C\+O\+N\+G\+E\+S\+T\+I\+O\+N(1)}}\+: Network congestion.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a6b3f0caee25f285d13126c3c4adf4aaa}{R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+N\+E\+T\+W\+O\+R\+K\+\_\+\+R\+E\+C\+O\+V\+E\+R\+Y(2)}}\+: Network recovery.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_af199f7bc47e923fd8b41f7914de19cc5}{R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+L\+O\+C\+A\+L\+\_\+\+M\+U\+T\+E\+D(3)}}\+: The local user stops receiving the remote video stream or disables the video module.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_aec77f0f9a95b99dc701736a188cfdcb3}{R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+L\+O\+C\+A\+L\+\_\+\+U\+N\+M\+U\+T\+E\+D(4)}}\+: The local user resumes receiving the remote video stream or enables the video module.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_aaa5df4bc7f707f902c833e16663cbca6}{R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+E\+M\+O\+T\+E\+\_\+\+M\+U\+T\+E\+D(5)}}\+: The remote user stops sending the video stream or disables the video module.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a1edff2c9617a1dd4dd8f07dc2da461f0}{R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+E\+M\+O\+T\+E\+\_\+\+U\+N\+M\+U\+T\+E\+D(6)}}\+: The remote user resumes sending the video stream or enables the video module.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a1c6d42d59c0f16854e1de15fdfb437b8}{R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+E\+M\+O\+T\+E\+\_\+\+O\+F\+F\+L\+I\+N\+E(7)}}\+: The remote user leaves the channel.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ae1de978cd22b7fc2b18a80d4b734d349}{R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+A\+U\+D\+I\+O\+\_\+\+F\+A\+L\+L\+B\+A\+C\+K(8)}}\+: The remote media stream falls back to the audio-\/only stream due to poor network conditions.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_af05e5a5a19947143076b8cfb30ee31c0}{R\+E\+M\+O\+T\+E\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+A\+U\+D\+I\+O\+\_\+\+F\+A\+L\+L\+B\+A\+C\+K\+\_\+\+R\+E\+C\+O\+V\+E\+R\+Y(9)}}\+: The remote media stream switches back to the video stream after the network conditions improve. 
\end{DoxyItemize}\\
\hline
{\em elapsed} & The time elapsed (ms) from the local user calling {\ttfamily join\+Channel} until this callback is triggered. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a3d4f978004d0666f26345810dcfe73ac}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a3d4f978004d0666f26345810dcfe73ac}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onChannelMediaRelayStateChanged@{onChannelMediaRelayStateChanged}}
\index{onChannelMediaRelayStateChanged@{onChannelMediaRelayStateChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onChannelMediaRelayStateChanged()}{onChannelMediaRelayStateChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Channel\+Media\+Relay\+State\+Changed (\begin{DoxyParamCaption}\item[{int}]{state,  }\item[{int}]{code }\end{DoxyParamCaption})}

Occurs when the state of the media stream relay changes.

The S\+DK reports the state of the current media relay and possible error messages in this callback.


\begin{DoxyParams}{Parameters}
{\em state} & The state code\+:
\begin{DoxyItemize}
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+S\+T\+A\+T\+E\+\_\+\+I\+D\+L\+E(0)}\+: The S\+DK is initializing.
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+S\+T\+A\+T\+E\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+N\+G(1)}\+: The S\+DK tries to relay the media stream to the destination channel.
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+U\+N\+N\+I\+N\+G(2)}\+: The S\+DK successfully relays the media stream to the destination channel.
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+S\+T\+A\+T\+E\+\_\+\+F\+A\+I\+L\+U\+R\+E(3)}\+: A failure occurs. See the details in {\ttfamily code}. 
\end{DoxyItemize}\\
\hline
{\em code} & The error code\+:
\begin{DoxyItemize}
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+O\+K(0)}\+: The state is normal.
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+E\+R\+R\+O\+R\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+E\+R\+R\+O\+R\+\_\+\+R\+E\+S\+P\+O\+N\+S\+E(1)}\+: An error occurs in the server response.
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+E\+R\+R\+O\+R\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+N\+O\+\_\+\+R\+E\+S\+P\+O\+N\+S\+E(2)}\+: No server response. You can call the leave\+Channel method to leave the channel.
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+E\+R\+R\+O\+R\+\_\+\+N\+O\+\_\+\+R\+E\+S\+O\+U\+R\+C\+E\+\_\+\+A\+V\+A\+I\+L\+A\+B\+L\+E(3)}\+: The S\+DK fails to access the service, probably due to limited resources of the server.
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+E\+R\+R\+O\+R\+\_\+\+F\+A\+I\+L\+E\+D\+\_\+\+J\+O\+I\+N\+\_\+\+S\+R\+C(4)}\+: Fails to send the relay request.
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+E\+R\+R\+O\+R\+\_\+\+F\+A\+I\+L\+E\+D\+\_\+\+J\+O\+I\+N\+\_\+\+D\+E\+S\+T(5)}\+: Fails to accept the relay request.
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+E\+R\+R\+O\+R\+\_\+\+F\+A\+I\+L\+E\+D\+\_\+\+P\+A\+C\+K\+E\+T\+\_\+\+R\+E\+C\+E\+I\+V\+E\+D\+\_\+\+F\+R\+O\+M\+\_\+\+S\+R\+C(6)}\+: The server fails to receive the media stream.
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+E\+R\+R\+O\+R\+\_\+\+F\+A\+I\+L\+E\+D\+\_\+\+P\+A\+C\+K\+E\+T\+\_\+\+S\+E\+N\+T\+\_\+\+T\+O\+\_\+\+D\+E\+S\+T(7)}\+: The server fails to send the media stream.
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+E\+R\+R\+O\+R\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+L\+O\+S\+T(8)}\+: The S\+DK disconnects from the server due to poor network connections. You can call the leave\+Channel method to leave the channel.
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+E\+R\+R\+O\+R\+\_\+\+I\+N\+T\+E\+R\+N\+A\+L\+\_\+\+E\+R\+R\+O\+R(9)}\+: An internal error occurs in the server.
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+E\+R\+R\+O\+R\+\_\+\+S\+R\+C\+\_\+\+T\+O\+K\+E\+N\+\_\+\+E\+X\+P\+I\+R\+E\+D(10)}\+: The token of the source channel has expired.
\item {\ttfamily R\+E\+L\+A\+Y\+\_\+\+E\+R\+R\+O\+R\+\_\+\+D\+E\+S\+T\+\_\+\+T\+O\+K\+E\+N\+\_\+\+E\+X\+P\+I\+R\+E\+D(11)}\+: The token of the destination channel has expired. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ac12497babde9ba725c873ba3b1fe76ab}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ac12497babde9ba725c873ba3b1fe76ab}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onFirstLocalAudioFramePublished@{onFirstLocalAudioFramePublished}}
\index{onFirstLocalAudioFramePublished@{onFirstLocalAudioFramePublished}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onFirstLocalAudioFramePublished()}{onFirstLocalAudioFramePublished()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+First\+Local\+Audio\+Frame\+Published (\begin{DoxyParamCaption}\item[{int}]{elapsed }\end{DoxyParamCaption})}

Occurs when the first audio frame is published. 
\begin{DoxyParams}{Parameters}
{\em elapsed} & The time elapsed (ms) from the local user calling join\+Channel to the S\+DK triggers this callback. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5203b66a93abb63596c23764c587292a}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5203b66a93abb63596c23764c587292a}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onFirstRemoteAudioFrame@{onFirstRemoteAudioFrame}}
\index{onFirstRemoteAudioFrame@{onFirstRemoteAudioFrame}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onFirstRemoteAudioFrame()}{onFirstRemoteAudioFrame()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+First\+Remote\+Audio\+Frame (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{elapsed }\end{DoxyParamCaption})}

Occurs when the first remote audio frame is received.


\begin{DoxyParams}{Parameters}
{\em uid} & ID of the remote user. \\
\hline
{\em elapsed} & The time elapsed (ms) from the local user calling \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_acd30d6bf3055ccd45d08b34c2e8ac467}{Rtc\+Engine\#join\+Channel}} until this callback is triggered. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a95ad49d36d9934ba78763fcb0ab2a91d}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a95ad49d36d9934ba78763fcb0ab2a91d}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onFirstRemoteAudioDecoded@{onFirstRemoteAudioDecoded}}
\index{onFirstRemoteAudioDecoded@{onFirstRemoteAudioDecoded}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onFirstRemoteAudioDecoded()}{onFirstRemoteAudioDecoded()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+First\+Remote\+Audio\+Decoded (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{elapsed }\end{DoxyParamCaption})}

Occurs when the S\+DK decodes the first remote audio frame for playback.


\begin{DoxyParams}{Parameters}
{\em uid} & User ID of the remote user sending the audio stream. \\
\hline
{\em elapsed} & The time elapsed (ms) from the loca user calling join\+Channel() until this callback is triggered. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a9685280586a4fce917eac08257fdeaf9}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a9685280586a4fce917eac08257fdeaf9}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onAudioRouteChanged@{onAudioRouteChanged}}
\index{onAudioRouteChanged@{onAudioRouteChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onAudioRouteChanged()}{onAudioRouteChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Audio\+Route\+Changed (\begin{DoxyParamCaption}\item[{int}]{routing }\end{DoxyParamCaption})}

Occurs when the local audio playback route changes.

This callback returns that the audio route switched to an earpiece, speakerphone, headset, or Bluetooth device.

The definition of the routing is listed as follows\+:
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ac86634edf41ab82b0c64c00c9fd2e92b}{A\+U\+D\+I\+O\+\_\+\+R\+O\+U\+T\+E\+\_\+\+D\+E\+F\+A\+U\+LT(-\/1)}}\+: The default audio route.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a04d08589b1af5007c994f2725bca90d7}{A\+U\+D\+I\+O\+\_\+\+R\+O\+U\+T\+E\+\_\+\+H\+E\+A\+D\+S\+E\+T(0)}}\+: Headset.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a159806b218ad5ddecf33863279d7611f}{A\+U\+D\+I\+O\+\_\+\+R\+O\+U\+T\+E\+\_\+\+E\+A\+R\+P\+I\+E\+C\+E(1)}}\+: Earpiece.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ab6408aecce9754420268a1adaeaafb1e}{A\+U\+D\+I\+O\+\_\+\+R\+O\+U\+T\+E\+\_\+\+H\+E\+A\+D\+S\+E\+T\+N\+O\+M\+I\+C(2)}}\+: Headset with no microphone.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_abd3b543fd891771eb08550dfee0e7fa2}{A\+U\+D\+I\+O\+\_\+\+R\+O\+U\+T\+E\+\_\+\+S\+P\+E\+A\+K\+E\+R\+P\+H\+O\+N\+E(3)}}\+: Speakerphone.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a060bba50451fdf50fdfd34b2444c12d4}{A\+U\+D\+I\+O\+\_\+\+R\+O\+U\+T\+E\+\_\+\+L\+O\+U\+D\+S\+P\+E\+A\+K\+E\+R(4)}}\+: Loudspeaker.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a434fe6c51c17f162b3c3ad23787fcda8}{A\+U\+D\+I\+O\+\_\+\+R\+O\+U\+T\+E\+\_\+\+B\+L\+U\+E\+T\+O\+O\+T\+H\+\_\+\+D\+E\+V\+I\+C\+E\+\_\+\+H\+F\+P(5)}}\+: Bluetooth headset. 
\end{DoxyItemize}\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a23f6de603ad02640a06e7144a7fc6fe8}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a23f6de603ad02640a06e7144a7fc6fe8}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onCameraReady@{onCameraReady}}
\index{onCameraReady@{onCameraReady}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onCameraReady()}{onCameraReady()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Camera\+Ready (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}

The camera is turned on and ready to capture video. \begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000010}{Deprecated}}]Use \mbox{\hyperlink{}{on\+Local\+Video\+State\+Changed}} instead.\end{DoxyRefDesc}


If the camera fails to turn on, an error is passed in the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6944f0b187993f39cf1235cf3bbed949}{on\+Error}} method. \mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a989f10ab210047ae44b9d21815b84cd5}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a989f10ab210047ae44b9d21815b84cd5}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onCameraFocusAreaChanged@{onCameraFocusAreaChanged}}
\index{onCameraFocusAreaChanged@{onCameraFocusAreaChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onCameraFocusAreaChanged()}{onCameraFocusAreaChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Camera\+Focus\+Area\+Changed (\begin{DoxyParamCaption}\item[{Rect}]{rect }\end{DoxyParamCaption})}

Occurs when the camera focus area has changed.


\begin{DoxyParams}{Parameters}
{\em rect} & Rectangular area in the camera zoom that specifies the focus area. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_abb9832896d40cee749866375c84e753b}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_abb9832896d40cee749866375c84e753b}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onCameraExposureAreaChanged@{onCameraExposureAreaChanged}}
\index{onCameraExposureAreaChanged@{onCameraExposureAreaChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onCameraExposureAreaChanged()}{onCameraExposureAreaChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Camera\+Exposure\+Area\+Changed (\begin{DoxyParamCaption}\item[{Rect}]{rect }\end{DoxyParamCaption})}

Occurs when the camera exposure area has changed.


\begin{DoxyParams}{Parameters}
{\em rect} & Rectangular area in the camera zoom that specifies the focus area. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a58207f39af3210fb9bcada00b72bfaf6}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a58207f39af3210fb9bcada00b72bfaf6}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onSnapshotTaken@{onSnapshotTaken}}
\index{onSnapshotTaken@{onSnapshotTaken}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onSnapshotTaken()}{onSnapshotTaken()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Snapshot\+Taken (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{String}]{file\+Path,  }\item[{int}]{width,  }\item[{int}]{height,  }\item[{int}]{err\+Code }\end{DoxyParamCaption})}



snapshot taken callback 

Occurs when take\+Snapshot A\+PI result is obtained


\begin{DoxyParams}{Parameters}
{\em uid} & user id \\
\hline
{\em file\+Path} & image is saveed file path \\
\hline
{\em width} & image width \\
\hline
{\em height} & image height \\
\hline
{\em err\+Code} & 0 is ok negative is error \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a2fbb5c93c21e84859c348d85884adc26}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a2fbb5c93c21e84859c348d85884adc26}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onFacePositionChanged@{onFacePositionChanged}}
\index{onFacePositionChanged@{onFacePositionChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onFacePositionChanged()}{onFacePositionChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Face\+Position\+Changed (\begin{DoxyParamCaption}\item[{int}]{image\+Width,  }\item[{int}]{image\+Height,  }\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_agora_face_position_info}{Agora\+Face\+Position\+Info}}\mbox{[}$\,$\mbox{]}}]{face\+Rect\+Arr }\end{DoxyParamCaption})}

Occurs when the camera exposure area has changed.


\begin{DoxyParams}{Parameters}
{\em image\+Width} & width of output image. \\
\hline
{\em image\+Height} & height of output image. \\
\hline
{\em face\+Rect\+Arr} & Rectangular area in the camera zoom that specifies the focus area. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ab17fcf9e21edcff4a51ac1ff9e51279e}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ab17fcf9e21edcff4a51ac1ff9e51279e}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onAudioQuality@{onAudioQuality}}
\index{onAudioQuality@{onAudioQuality}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onAudioQuality()}{onAudioQuality()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Audio\+Quality (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{quality,  }\item[{short}]{delay,  }\item[{short}]{lost }\end{DoxyParamCaption})}

The audio quality of the specified user every two seconds.

By default, this callback is enabled.


\begin{DoxyParams}{Parameters}
{\em uid} & User ID of the speaker. \\
\hline
{\em quality} & Rating of the audio quality\+:
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ab9506db9683b987ae844537605b4605e}{Q\+U\+A\+L\+I\+T\+Y\+\_\+\+U\+N\+K\+N\+O\+W\+N(0)}}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a106ff80f36f472ba145e228340738bf1}{Q\+U\+A\+L\+I\+T\+Y\+\_\+\+E\+X\+C\+E\+L\+L\+E\+N\+T(1)}}
\item \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a82750283c93ece05fc0af9c50670983d}{Q\+U\+A\+L\+I\+T\+Y\+\_\+\+G\+O\+O\+D(2)\}}}\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ab68cf712b92de15d76bdadfd3fef62d9}{Q\+U\+A\+L\+I\+T\+Y\+\_\+\+P\+O\+O\+R(3)}}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a799fbc30018a35723eca98f819f41855}{Q\+U\+A\+L\+I\+T\+Y\+\_\+\+B\+A\+D(4)}}
\item \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ab587e8e3227633b93e77251f765725c0}{Q\+U\+A\+L\+I\+T\+Y\+\_\+\+V\+B\+A\+D(5)\}}} 
\end{DoxyItemize}\\
\hline
{\em delay} & Time delay (ms). \\
\hline
{\em lost} & Packet loss rate (\%). \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6476a17632eab584aa291aa869663d13}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6476a17632eab584aa291aa869663d13}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onRtcStats@{onRtcStats}}
\index{onRtcStats@{onRtcStats}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onRtcStats()}{onRtcStats()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Rtc\+Stats (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_rtc_stats}{Rtc\+Stats}}}]{stats }\end{DoxyParamCaption})}

Reports the statistics of the current call.

This callback is triggered once every two seconds after the user joins the channel.


\begin{DoxyParams}{Parameters}
{\em stats} & The statistics on the current call\+: \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_rtc_stats}{Rtc\+Stats}}. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a8b68b163b0b6f8bdbf2f52e320a04739}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a8b68b163b0b6f8bdbf2f52e320a04739}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onLastmileQuality@{onLastmileQuality}}
\index{onLastmileQuality@{onLastmileQuality}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onLastmileQuality()}{onLastmileQuality()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Lastmile\+Quality (\begin{DoxyParamCaption}\item[{int}]{quality }\end{DoxyParamCaption})}

Reports the last-\/mile network quality of the local user.

This callback is triggered once after {\ttfamily start\+Lastmile\+Probe\+Test} is called.

When the user is not in a channel and the last-\/mile network probe test is enabled (by calling {\ttfamily start\+Lastmile\+Probe\+Test}), this callback function is triggered to update the app on the network connection quality of the local user.


\begin{DoxyParams}{Parameters}
{\em quality} & The network quality\+:
\begin{DoxyItemize}
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+U\+N\+K\+N\+O\+W\+N(0)}\+: The quality is unknown.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+E\+X\+C\+E\+L\+L\+E\+N\+T(1)}\+: The quality is excellent.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+G\+O\+OD Q\+U\+A\+L\+I\+T\+Y\+\_\+\+G\+O\+O\+D(2)}\+: The quality is quite good, but the bitrate may be slightly lower than excellent.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+P\+O\+O\+R(3)}\+: Users can feel the communication slightly impaired.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+B\+A\+D(4)}\+: Users can communicate not very smoothly.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+V\+B\+A\+D(5)}\+: The quality is so bad that users can barely communicate.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+D\+O\+W\+N(6)}\+: The network is disconnected and users cannot communicate at all. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_adc7bfb05ed741769a1436794926b1cf8}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_adc7bfb05ed741769a1436794926b1cf8}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onLastmileProbeResult@{onLastmileProbeResult}}
\index{onLastmileProbeResult@{onLastmileProbeResult}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onLastmileProbeResult()}{onLastmileProbeResult()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Lastmile\+Probe\+Result (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_lastmile_probe_result}{Lastmile\+Probe\+Result}}}]{result }\end{DoxyParamCaption})}

Reports the last-\/mile network probe result.

The S\+DK triggers this callback within 30 seconds after the app calls the \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_ad00ae90f0aa7008e0008fe6fcc547f22}{start\+Lastmile\+Probe\+Test\} method.  result The uplink and downlink lastmile network probe test result. For details, see  Lastmile\+Probe\+Result Lastmile\+Probe\+Result\}. }}\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_acdf01fd3da944feb847585c406d3d263}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_acdf01fd3da944feb847585c406d3d263}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onNetworkQuality@{onNetworkQuality}}
\index{onNetworkQuality@{onNetworkQuality}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onNetworkQuality()}{onNetworkQuality()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Network\+Quality (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{tx\+Quality,  }\item[{int}]{rx\+Quality }\end{DoxyParamCaption})}

Reports the network quality of each user.

This callback is triggered once every two seconds after the user joins the channel.


\begin{DoxyParams}{Parameters}
{\em uid} & User ID. If {\ttfamily uid} is 0, the S\+DK reports the local network quality. \\
\hline
{\em tx\+Quality} & The transmission quality of the user\+:
\begin{DoxyItemize}
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+U\+N\+K\+N\+O\+W\+N(0)}\+: The quality is unknown.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+E\+X\+C\+E\+L\+L\+E\+N\+T(1)}\+: The quality is excellent.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+G\+O\+OD Q\+U\+A\+L\+I\+T\+Y\+\_\+\+G\+O\+O\+D(2)}\+: The quality is quite good, but the bitrate may be slightly lower than excellent.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+P\+O\+O\+R(3)}\+: Users can feel the communication slightly impaired.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+B\+A\+D(4)}\+: Users can communicate not very smoothly.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+V\+B\+A\+D(5)}\+: The quality is so bad that users can barely communicate.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+D\+O\+W\+N(6)}\+: The network is disconnected and users cannot communicate at all. 
\end{DoxyItemize}\\
\hline
{\em rx\+Quality} & The receiving quality of the user\+:
\begin{DoxyItemize}
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+U\+N\+K\+N\+O\+W\+N(0)}\+: The quality is unknown.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+E\+X\+C\+E\+L\+L\+E\+N\+T(1)}\+: The quality is excellent.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+G\+O\+OD Q\+U\+A\+L\+I\+T\+Y\+\_\+\+G\+O\+O\+D(2)}\+: The quality is quite good, but the bitrate may be slightly lower than excellent.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+P\+O\+O\+R(3)}\+: Users can feel the communication slightly impaired.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+B\+A\+D(4)}\+: Users can communicate not very smoothly.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+V\+B\+A\+D(5)}\+: The quality is so bad that users can barely communicate.
\item {\ttfamily Q\+U\+A\+L\+I\+T\+Y\+\_\+\+D\+O\+W\+N(6)}\+: The network is disconnected and users cannot communicate at all. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a736bf4d46d2cbd018ec30c06156a2c5d}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a736bf4d46d2cbd018ec30c06156a2c5d}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onLocalAudioStats@{onLocalAudioStats}}
\index{onLocalAudioStats@{onLocalAudioStats}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onLocalAudioStats()}{onLocalAudioStats()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Local\+Audio\+Stats (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_local_audio_stats}{Local\+Audio\+Stats}}}]{stats }\end{DoxyParamCaption})}

Reports the statistics of the local audio stream.

The S\+DK triggers this callback once every two seconds.


\begin{DoxyParams}{Parameters}
{\em stats} & The statistics of the local audio stream. See \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_local_audio_stats}{Local\+Audio\+Stats}}. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ab5180ba91a1c81c5470e2ec1a7e18a01}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ab5180ba91a1c81c5470e2ec1a7e18a01}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onLocalVideoStats@{onLocalVideoStats}}
\index{onLocalVideoStats@{onLocalVideoStats}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onLocalVideoStats()}{onLocalVideoStats()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Local\+Video\+Stats (\begin{DoxyParamCaption}\item[{Constants.\+Video\+Source\+Type}]{source,  }\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_local_video_stats}{Local\+Video\+Stats}}}]{stats }\end{DoxyParamCaption})}

Reports the statistics of the local video streams.

The S\+DK triggers this callback once every two seconds for each user/host. If there are multiple users/hosts in the channel, the S\+DK triggers this callback as many times.


\begin{DoxyParams}{Parameters}
{\em source} & source type of the originated video source \\
\hline
{\em stats} & The statistics of the local video stream. See \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_local_video_stats}{Local\+Video\+Stats}}. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aced11e711bdda1ea24415da27c5bc5fa}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aced11e711bdda1ea24415da27c5bc5fa}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onRemoteAudioStats@{onRemoteAudioStats}}
\index{onRemoteAudioStats@{onRemoteAudioStats}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onRemoteAudioStats()}{onRemoteAudioStats()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Remote\+Audio\+Stats (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_remote_audio_stats}{Remote\+Audio\+Stats}}}]{stats }\end{DoxyParamCaption})}

Reports the statistics of the audio from each remote user or broadcaster.

The S\+DK triggers this callback once every two seconds for each remote user or broadcaster. If a channel has multiple remote users, the S\+DK triggers this callback as many times. 
\begin{DoxyParams}{Parameters}
{\em stats} & The statistics of the received audio\+: \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_remote_audio_stats}{Remote\+Audio\+Stats}}. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a7f00d7a396872dc02008ea5f7487917e}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a7f00d7a396872dc02008ea5f7487917e}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onRemoteVideoStats@{onRemoteVideoStats}}
\index{onRemoteVideoStats@{onRemoteVideoStats}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onRemoteVideoStats()}{onRemoteVideoStats()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Remote\+Video\+Stats (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_remote_video_stats}{Remote\+Video\+Stats}}}]{stats }\end{DoxyParamCaption})}

Reports the statistics of the video stream from each remote user/host.

The S\+DK triggers this callback once every two seconds for each remote user/host. If a channel includes multiple remote users, the S\+DK triggers this callback as many times.


\begin{DoxyParams}{Parameters}
{\em stats} & The statistics of the remote video streams. See \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_remote_video_stats}{Remote\+Video\+Stats}}. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a9af3b09098b1034319184103157b90db}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a9af3b09098b1034319184103157b90db}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onLocalVideoStat@{onLocalVideoStat}}
\index{onLocalVideoStat@{onLocalVideoStat}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onLocalVideoStat()}{onLocalVideoStat()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Local\+Video\+Stat (\begin{DoxyParamCaption}\item[{int}]{sent\+Bitrate,  }\item[{int}]{sent\+Frame\+Rate }\end{DoxyParamCaption})}

\begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000011}{Deprecated}}]The statistics of the uploading local video streams once every two seconds. \end{DoxyRefDesc}

\begin{DoxyParams}{Parameters}
{\em sent\+Bitrate} & Data sending bitrate (kbit/s) since last count. \\
\hline
{\em sent\+Frame\+Rate} & Data sending frame rate (fps) since last count. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a8a84e26cf72185b3c944b3a10983f600}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a8a84e26cf72185b3c944b3a10983f600}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onRemoteVideoStat@{onRemoteVideoStat}}
\index{onRemoteVideoStat@{onRemoteVideoStat}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onRemoteVideoStat()}{onRemoteVideoStat()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Remote\+Video\+Stat (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{delay,  }\item[{int}]{received\+Bitrate,  }\item[{int}]{received\+Frame\+Rate }\end{DoxyParamCaption})}

\begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000012}{Deprecated}}]The statistics of receiving remote video streams once every two seconds.\end{DoxyRefDesc}



\begin{DoxyParams}{Parameters}
{\em uid} & User ID of the user whose video streams are received. \\
\hline
{\em delay} & Time delay (ms). \\
\hline
{\em received\+Bitrate} & Data receiving bitrate (kbit/s). \\
\hline
{\em received\+Frame\+Rate} & Data receiving frame rate (fps). \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a112817ed260a30174329739382e75e66}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a112817ed260a30174329739382e75e66}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onRemoteAudioTransportStats@{onRemoteAudioTransportStats}}
\index{onRemoteAudioTransportStats@{onRemoteAudioTransportStats}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onRemoteAudioTransportStats()}{onRemoteAudioTransportStats()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Remote\+Audio\+Transport\+Stats (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{delay,  }\item[{int}]{lost,  }\item[{int}]{rx\+K\+Bit\+Rate }\end{DoxyParamCaption})}

\begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000013}{Deprecated}}]Use \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aced11e711bdda1ea24415da27c5bc5fa}{on\+Remote\+Audio\+Stats}} instead. \end{DoxyRefDesc}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a93e87d28a93737a7ff6c5287ff3c2a56}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a93e87d28a93737a7ff6c5287ff3c2a56}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onRemoteVideoTransportStats@{onRemoteVideoTransportStats}}
\index{onRemoteVideoTransportStats@{onRemoteVideoTransportStats}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onRemoteVideoTransportStats()}{onRemoteVideoTransportStats()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Remote\+Video\+Transport\+Stats (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{delay,  }\item[{int}]{lost,  }\item[{int}]{rx\+K\+Bit\+Rate }\end{DoxyParamCaption})}

\begin{DoxyRefDesc}{Deprecated}
\item[\mbox{\hyperlink{deprecated__deprecated000014}{Deprecated}}]Use \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a7f00d7a396872dc02008ea5f7487917e}{on\+Remote\+Video\+Stats}} instead. \end{DoxyRefDesc}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ab432d1b5f1d8efb96a838f8f9388ff07}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ab432d1b5f1d8efb96a838f8f9388ff07}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onAudioMixingStateChanged@{onAudioMixingStateChanged}}
\index{onAudioMixingStateChanged@{onAudioMixingStateChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onAudioMixingStateChanged()}{onAudioMixingStateChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Audio\+Mixing\+State\+Changed (\begin{DoxyParamCaption}\item[{int}]{state,  }\item[{int}]{reason }\end{DoxyParamCaption})}

Occurs when the state of the local user\textquotesingle{}s audio mixing file changes.

When you call the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a18c4fcacfc39625ae8a47e66564bd8f4}{start\+Audio\+Mixing}} method and the state of audio mixing file changes, the Agora S\+DK triggers this callback.
\begin{DoxyItemize}
\item When the audio mixing file plays, pauses playing, or stops playing, this callback returns 710, 711, or 713 in state, and 0 in error\+Code.
\item When exceptions occur during playback, this callback returns 714 in state and an error in error\+Code.
\item If the local audio mixing file does not exist, or if the S\+DK does not support the file format or cannot access the music file U\+RL, the S\+DK returns \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a3238fa550acf86541ba70496ebf7f364}{W\+A\+R\+N\+\_\+\+A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+O\+P\+E\+N\+\_\+\+E\+R\+R\+OR = 701\}.  state The state code\+: Constants\#\+A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+NG A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+L\+A\+Y\+I\+N\+G(710)\}\+: The audio mixing file is playing. Constants\#\+A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+A\+U\+S\+ED A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+P\+A\+U\+S\+E\+D(711)\}\+: The audio mixing file pauses playing. Constants\#\+A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+T\+O\+P\+P\+ED A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+T\+O\+P\+P\+E\+D(713)\}\+: The audio mixing file stops playing. Constants\#\+A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+F\+A\+I\+L\+ED A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+S\+T\+A\+T\+E\+\_\+\+F\+A\+I\+L\+E\+D(714)\}\+: An exception occurs when playing the audio mixing file. See the error\+Code for details.  reason The error code\+: Constants\#\+A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+OK A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+E\+R\+R\+O\+R\+\_\+\+O\+K(701)\}\+: No error. Constants\#\+A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+C\+A\+N\+\_\+\+N\+O\+T\+\_\+\+O\+P\+EN A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+E\+R\+R\+O\+R\+\_\+\+C\+A\+N\+\_\+\+N\+O\+T\+\_\+\+O\+P\+E\+N(701)\}\+: The S\+DK cannot open the audio mixing file. Constants\#\+A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+T\+O\+O\+\_\+\+F\+R\+E\+Q\+U\+E\+N\+T\+\_\+\+C\+A\+LL A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+T\+O\+O\+\_\+\+F\+R\+E\+Q\+U\+E\+N\+T\+\_\+\+C\+A\+L\+L(702)\}\+: The S\+DK opens the audio mixing file too frequently. Constants\#\+A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+I\+N\+T\+E\+R\+R\+U\+P\+T\+E\+D\+\_\+\+E\+OF A\+U\+D\+I\+O\+\_\+\+M\+I\+X\+I\+N\+G\+\_\+\+E\+R\+R\+O\+R\+\_\+\+I\+N\+T\+E\+R\+R\+U\+P\+T\+E\+D\+\_\+\+E\+O\+F(703)\}\+: The audio mixing file playback is interrupted. }}
\end{DoxyItemize}\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a74c7ede84d5fb4464687aaacc0cbf142}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a74c7ede84d5fb4464687aaacc0cbf142}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onAudioMixingPositionChanged@{onAudioMixingPositionChanged}}
\index{onAudioMixingPositionChanged@{onAudioMixingPositionChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onAudioMixingPositionChanged()}{onAudioMixingPositionChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Audio\+Mixing\+Position\+Changed (\begin{DoxyParamCaption}\item[{long}]{position }\end{DoxyParamCaption})}



Reports current Audio\+Mixing progress. 

The callback occurs once every one second during the playback and reports the current playback progress. 
\begin{DoxyParams}{Parameters}
{\em position} & Current Audio\+Mixing progress (millisecond). \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ae51e2624b1c39496f387bcc288ae3f5b}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ae51e2624b1c39496f387bcc288ae3f5b}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onAudioMixingFinished@{onAudioMixingFinished}}
\index{onAudioMixingFinished@{onAudioMixingFinished}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onAudioMixingFinished()}{onAudioMixingFinished()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Audio\+Mixing\+Finished (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}

The audio mixing file playback is finished after calling \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a18c4fcacfc39625ae8a47e66564bd8f4}{start\+Audio\+Mixing\}.  deprecated 15. }}If you failed to execute the \mbox{\hyperlink{}{file\+Path, boolean loopback, int cycle) start\+Audio\+Mixing}} method, it returns the error code in the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6944f0b187993f39cf1235cf3bbed949}{on\+Error}} callback. \mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aacf755d5776a6899d0f9f61e48378897}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aacf755d5776a6899d0f9f61e48378897}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onAudioEffectFinished@{onAudioEffectFinished}}
\index{onAudioEffectFinished@{onAudioEffectFinished}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onAudioEffectFinished()}{onAudioEffectFinished()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Audio\+Effect\+Finished (\begin{DoxyParamCaption}\item[{int}]{sound\+Id }\end{DoxyParamCaption})}

The local audio effect playback has finished.


\begin{DoxyParams}{Parameters}
{\em sound\+Id} & ID of the audio effect. Each audio effect has a unique ID. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aece9d87ad596720ba887e6e889f3d81c}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aece9d87ad596720ba887e6e889f3d81c}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onRhythmPlayerStateChanged@{onRhythmPlayerStateChanged}}
\index{onRhythmPlayerStateChanged@{onRhythmPlayerStateChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onRhythmPlayerStateChanged()}{onRhythmPlayerStateChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Rhythm\+Player\+State\+Changed (\begin{DoxyParamCaption}\item[{int}]{state,  }\item[{int}]{reason }\end{DoxyParamCaption})}

Occurs when the state of the local user\textquotesingle{}s rhythm player changes. When you call the start\+Rhythm\+Player method and the state of rhythm player changes, the S\+DK triggers this callback.


\begin{DoxyParams}{Parameters}
{\em state} & The state code. See \#\+R\+H\+Y\+T\+H\+M\+\_\+\+P\+L\+A\+Y\+E\+R\+\_\+\+S\+T\+A\+T\+E\+\_\+\+T\+Y\+PE. \\
\hline
{\em reason} & The error code. See \#\+R\+H\+Y\+T\+H\+M\+\_\+\+P\+L\+A\+Y\+E\+R\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+T\+Y\+PE. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aef21689500cbc435f0ff98fc65670657}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_aef21689500cbc435f0ff98fc65670657}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onLocalAudioStateChanged@{onLocalAudioStateChanged}}
\index{onLocalAudioStateChanged@{onLocalAudioStateChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onLocalAudioStateChanged()}{onLocalAudioStateChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Local\+Audio\+State\+Changed (\begin{DoxyParamCaption}\item[{int}]{state,  }\item[{int}]{reason }\end{DoxyParamCaption})}

Occurs when the local audio stream state changes.

This callback indicates the state change of the local audio stream, including the state of the audio recording and encoding, and allows you to troubleshoot issues when exceptions occur.

\begin{DoxyNote}{Note}
When the state is {\ttfamily L\+O\+C\+A\+L\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+S\+T\+A\+T\+E\+\_\+\+F\+A\+I\+L\+E\+D(3)}, see the {\ttfamily error} parameter for details.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em state} & State of the local audio\+: 
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a2a97b89e0e0b2d26ce59f4770124bd76}{L\+O\+C\+A\+L\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+T\+O\+P\+P\+E\+D(0)}}\+: The local audio is in the initial state. 
\item \{\mbox{\hyperlink{}{L\+O\+C\+A\+L\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+S\+T\+A\+T\+E\+\_\+\+C\+A\+P\+T\+U\+R\+I\+N\+G(1)\}\+: The recording device starts successfully. }}\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ab918bbaf4b2474f8dfcd9de49602913f}{L\+O\+C\+A\+L\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+S\+T\+A\+T\+E\+\_\+\+E\+N\+C\+O\+D\+I\+N\+G(2)}}\+: The first audio frame encodes successfully. 
\item \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_afffbfde1fab343d164a03c259e6a56b5}{L\+O\+C\+A\+L\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+S\+T\+A\+T\+E\+\_\+\+F\+A\+I\+L\+E\+D(3)\}\+: The local audio fails to start. }} 
\end{DoxyItemize}\\
\hline
{\em reason} & The reason information of the local audio\+: 
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a3ee4640e791ee8689aec3be964beb9da}{L\+O\+C\+A\+L\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+O\+K(0)}}\+: The local audio is normal. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a7d69bf706584a5fc126ac906fcb62e35}{L\+O\+C\+A\+L\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+F\+A\+I\+L\+U\+R\+E(1)}}\+: No specified reason for the local audio failure. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ab7292616c5ccf6941942ecb98f12cae8}{L\+O\+C\+A\+L\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+D\+E\+V\+I\+C\+E\+\_\+\+N\+O\+\_\+\+P\+E\+R\+M\+I\+S\+S\+I\+O\+N(2)}}\+: No permission to use the local audio device. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a53f3e06a041deb6d4e0805e4f90d9b7d}{L\+O\+C\+A\+L\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+D\+E\+V\+I\+C\+E\+\_\+\+B\+U\+S\+Y(3)}}\+: The microphone is in use. 
\item \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_af31acbb9f43dabee9fb446d39ecaf38a}{L\+O\+C\+A\+L\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+C\+A\+P\+T\+U\+R\+E\+\_\+\+F\+A\+I\+L\+U\+R\+E(4)\}\+: The local audio recording fails. Check whether the recording device is working properly. }}\{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ac6d249417d67b4ee231f54333b2f3628}{L\+O\+C\+A\+L\+\_\+\+A\+U\+D\+I\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+E\+N\+C\+O\+D\+E\+\_\+\+F\+A\+I\+L\+U\+R\+E(5)\}\+: The local audio encoding fails. }} 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ac5f1cba62b72b39211cffad4cc30fb32}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ac5f1cba62b72b39211cffad4cc30fb32}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onLocalVideoStateChanged@{onLocalVideoStateChanged}}
\index{onLocalVideoStateChanged@{onLocalVideoStateChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onLocalVideoStateChanged()}{onLocalVideoStateChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Local\+Video\+State\+Changed (\begin{DoxyParamCaption}\item[{Constants.\+Video\+Source\+Type}]{source,  }\item[{int}]{state,  }\item[{int}]{reason }\end{DoxyParamCaption})}

Occurs when the local video stream state changes.

This callback indicates the state of the local video stream, including camera capturing and video encoding, and allows you to troubleshoot issues when exceptions occur.

\begin{DoxyNote}{Note}
For some device models, the S\+DK will not trigger this callback when the state of the local video changes while the local video capturing device is in use, so you have to make your own timeout judgment.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em source} & source type of the originated video source. \\
\hline
{\em state} & The local video state\+:
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_aef8e161d024f51d5bf40ee7a6a174a8b}{L\+O\+C\+A\+L\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+S\+T\+A\+T\+E\+\_\+\+S\+T\+O\+P\+P\+E\+D(0)}}\+: The local video is in the initial state.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ae807fdfb4b469099ff3ca7e7bb73fb0e}{L\+O\+C\+A\+L\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+S\+T\+A\+T\+E\+\_\+\+C\+A\+P\+T\+U\+R\+I\+N\+G(1)}}\+: The local video capturer starts successfully.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ae397a67b811a9a7ced5ae741cfab1a7b}{L\+O\+C\+A\+L\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+S\+T\+A\+T\+E\+\_\+\+E\+N\+C\+O\+D\+I\+N\+G(2)}}\+: The first local video frame encodes successfully.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_acd37b4d303a3af0c7c3090aa10cfaef4}{L\+O\+C\+A\+L\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+S\+T\+A\+T\+E\+\_\+\+F\+A\+I\+L\+E\+D(3)}}\+: The local video fails to start. 
\end{DoxyItemize}\\
\hline
{\em reason} & The detailed reason information of the local video\+:
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a90ee248e8975010f8bef210154c5c126}{L\+O\+C\+A\+L\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+O\+K(0)}}\+: The local video is normal.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a36290c7b0705049dab09627ab102dc17}{L\+O\+C\+A\+L\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+F\+A\+I\+L\+U\+R\+E(1)}}\+: No specified reason for the local video failure.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_aeb2ea79508a99cae1d33e2d21cdd7923}{L\+O\+C\+A\+L\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+D\+E\+V\+I\+C\+E\+\_\+\+N\+O\+\_\+\+P\+E\+R\+M\+I\+S\+S\+I\+O\+N(2)}}\+: No permission to use the local video device.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a7a726ee6d5034793efe58c596b6230c5}{L\+O\+C\+A\+L\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+D\+E\+V\+I\+C\+E\+\_\+\+B\+U\+S\+Y(3)}}\+: The local video capturer is in use.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a6b6e9c18c7f16fb64deed3028521229a}{L\+O\+C\+A\+L\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+C\+A\+P\+T\+U\+R\+E\+\_\+\+F\+A\+I\+L\+U\+R\+E(4)}}\+: The local video capture fails. Check whether the capturer is working properly.
\begin{DoxyItemize}
\item If your app runs in the background on a device running Android 9 or later, you cannot access the camera.
\item If your app runs on a device running Android 6 or later, this error is reported if the camera is occupied by a third-\/part app and not property released. Once the camera is released, the S\+DK triggers this callback again, reporting state {\ttfamily C\+A\+P\+T\+U\+R\+I\+N\+G(1)}, and error {\ttfamily E\+R\+R\+O\+R\+\_\+\+O\+K(0)}.
\end{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ac69b8ba76466a952b0f6ea7cfc677e5c}{L\+O\+C\+A\+L\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+C\+O\+D\+E\+C\+\_\+\+N\+O\+T\+\_\+\+S\+U\+P\+P\+O\+R\+T(5)}}\+: The local video encoding fails. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a14851bc4c9119e73911c409ac693eea5}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a14851bc4c9119e73911c409ac693eea5}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onRtmpStreamingStateChanged@{onRtmpStreamingStateChanged}}
\index{onRtmpStreamingStateChanged@{onRtmpStreamingStateChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onRtmpStreamingStateChanged()}{onRtmpStreamingStateChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Rtmp\+Streaming\+State\+Changed (\begin{DoxyParamCaption}\item[{String}]{url,  }\item[{int}]{state,  }\item[{int}]{reason }\end{DoxyParamCaption})}

Occurs when the state of the R\+T\+MP streaming changes.


\begin{DoxyParams}{Parameters}
{\em url} & The R\+T\+MP U\+RL address. \\
\hline
{\em state} & The R\+T\+MP streaming state\+: 
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a77915da632c3a5c2327d74aec54efd24}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+S\+T\+A\+T\+E\+\_\+\+I\+D\+L\+E(0)}}\+: The R\+T\+MP or R\+T\+M\+PS streaming has not started or has ended. This state is also triggered after you remove an R\+T\+MP or R\+T\+M\+PS stream from the C\+DN by calling remove\+Publish\+Stream\+Url. 
\item \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a086418160d11405c4523e761b5bde5af}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+S\+T\+A\+T\+E\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+N\+G(1)\}\+: The S\+DK is connecting to Agora streaming server and the C\+DN server. This state is triggered after you call the  Rtc\+Engine\#add\+Publish\+Stream\+Url add\+Publish\+Stream\+Url\} method. }}\{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_aa4a261c2184aa66f35c4a2b832585612}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+U\+N\+N\+I\+N\+G(2)\}\+: The R\+T\+MP or R\+T\+M\+PS streaming publishes. The S\+DK successfully publishes the R\+T\+MP or R\+T\+M\+PS streaming and returns this state. }}\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a18723693c0fe5e57a360a5fd9b5d161c}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+E\+C\+O\+V\+E\+R\+I\+N\+G(3)}}\+: The R\+T\+MP or R\+T\+M\+PS streaming is recovering. When exceptions occur to the C\+DN, or the streaming is interrupted, the S\+DK attempts to resume R\+T\+MP or R\+T\+M\+PS streaming and returns this state. 
\begin{DoxyItemize}
\item If the S\+DK successfully resumes the streaming, \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_aa4a261c2184aa66f35c4a2b832585612}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+S\+T\+A\+T\+E\+\_\+\+R\+U\+N\+N\+I\+N\+G(2)}} returns. 
\item If the streaming does not resume within 60 seconds or server errors occur, \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ac9189b30b58dda24d36ea9d01c7c0380}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+S\+T\+A\+T\+E\+\_\+\+F\+A\+I\+L\+U\+R\+E(4)}} returns. You can also reconnect to the server by calling the \mbox{\hyperlink{}{remove\+Publish\+Stream\+Url}} and \{\mbox{\hyperlink{}{add\+Publish\+Stream\+Url\} methods. }} 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ac9189b30b58dda24d36ea9d01c7c0380}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+S\+T\+A\+T\+E\+\_\+\+F\+A\+I\+L\+U\+R\+E(4)}}\+: The R\+T\+MP or R\+T\+M\+PS streaming fails. See the err\+Code parameter for the detailed error information. You can also call the \{\mbox{\hyperlink{}{add\+Publish\+Stream\+Url\} method to publish the R\+T\+MP or R\+T\+M\+PS streaming again. }}\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a583fab98f23997f1ada74de1721a8c64}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+S\+T\+A\+T\+E\+\_\+\+D\+I\+S\+C\+O\+N\+N\+E\+C\+T\+I\+N\+G(5)}}\+: The S\+DK is disconnecting from the Agora streaming server and C\+DN. When you call {\ttfamily remove} or {\ttfamily stop} to stop the streaming normally, the S\+DK reports the streaming state as {\ttfamily D\+I\+S\+C\+O\+N\+N\+E\+C\+T\+I\+NG}, {\ttfamily I\+D\+LE} in sequence. 
\end{DoxyItemize}
\end{DoxyItemize}\\
\hline
{\em reason} & The detailed reason information for streaming\+: 
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_adc4adcead4d46d97111694d8b1214b4b}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+O\+K(0)}}\+: The R\+T\+MP or R\+T\+M\+PS streaming publishes successfully. 
\item \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a2b61215ba1bf90f60a5805f954d7169b}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+I\+N\+V\+A\+L\+I\+D\+\_\+\+A\+R\+G\+U\+M\+E\+N(1)\}\+: Invalid argument used. If, for example, you do not call the  Rtc\+Engine\#set\+Live\+Transcoding set\+Live\+Transcoding\} method to configure the Live\+Transcoding parameters before calling the  Rtc\+Engine\#add\+Publish\+Stream\+Url add\+Publish\+Stream\+Url\} method, the S\+DK returns this error. Check whether you set the parameters in the  Rtc\+Engine\#set\+Live\+Transcoding set\+Live\+Transcoding\} method properly. }}\{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a6d43cae41766c2bcc36b9953d56b4406}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+E\+N\+C\+R\+Y\+P\+T\+E\+D\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+N\+O\+T\+\_\+\+A\+L\+L\+O\+W\+E\+D(2)\}\+: The R\+T\+MP or R\+T\+M\+PS streaming is encrypted and cannot be published. }}\{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a308051f5248be2c09dd8172266dbd380}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+C\+O\+N\+N\+E\+C\+T\+I\+O\+N\+\_\+\+T\+I\+M\+E\+O\+U\+T(3)\}\+: Timeout for the R\+T\+MP or R\+T\+M\+PS streaming. Call the  Rtc\+Engine\#add\+Publish\+Stream\+Url add\+Publish\+Stream\+Url\} method to publish the streaming again. }}\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a92b7b5ceb6c250a3f45b6c911acad9c5}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+I\+N\+T\+E\+R\+N\+A\+L\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+E\+R\+R\+O\+R(4)}}\+: An error occurs in Agora streaming server. Call the \mbox{\hyperlink{}{add\+Publish\+Stream\+Url}} method to publish the streaming again. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_adb918213dd4f56f36d32fbea34d30eb2}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+T\+M\+P\+\_\+\+S\+E\+R\+V\+E\+R\+\_\+\+E\+R\+R\+O\+R(5)}}\+: An error occurs in the C\+DN server. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_aec508f25f6656e68b087f423d5bd9fbe}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+T\+O\+O\+\_\+\+O\+F\+T\+E\+N(6)}}\+: Reserved. 
\item \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_aeca0b2233858f2a61956be743401e04f}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+R\+E\+A\+C\+H\+\_\+\+L\+I\+M\+I\+T(7)\}\+: The host publishes more than 10 U\+R\+Ls. Delete the unnecessary U\+R\+Ls before adding new ones. }}\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a89688c20974a7183fd5d5174d4657509}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+N\+O\+T\+\_\+\+A\+U\+T\+H\+O\+R\+I\+Z\+E\+D(8)}}\+: The host manipulates other hosts\textquotesingle{} U\+R\+Ls. Check your app logic. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a7a42ccc4f7043d0579d21867675bd8ba}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+N\+O\+T\+\_\+\+F\+O\+U\+N\+D(9)}}\+: Agora server fails to find the R\+T\+MP or R\+T\+M\+PS streaming. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_aecfbf43d1f6889f0f2e44fba0b841937}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+F\+O\+R\+M\+A\+T\+\_\+\+N\+O\+T\+\_\+\+S\+U\+P\+P\+O\+R\+T\+E\+D(10)}}\+: The format of the C\+DN streaming U\+RL is not supported. Check whether the U\+RL format is correct. 
\item \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_abedabc39ebaa85af2b27ed835a50b943}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+N\+O\+T\+\_\+\+B\+R\+O\+A\+D\+C\+A\+S\+T\+E\+R(11)\}\+: The user role is not host, so the user cannot use the C\+DN live streaming function. Check your application code logic. }}\{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a86aa5f8ec4ee1c20722b20d10cc88435}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+T\+R\+A\+N\+S\+C\+O\+D\+I\+N\+G\+\_\+\+N\+O\+\_\+\+M\+I\+X\+\_\+\+S\+T\+R\+E\+A\+M(13)\}\+: The {\ttfamily update\+Rtmp\+Transcoding} or {\ttfamily set\+Live\+Transcoding} method is called to update the transcoding configuration in a scenario where there is streaming without transcoding. Check your application code logic. }}\{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a58ed006001ee52e7adff39fea1fd4fc3}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+N\+E\+T\+\_\+\+D\+O\+W\+N(14)\}\+: Errors occurred in the host\textquotesingle{}s network. }}\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ab733df975c08f39b6643a8e73355c6c0}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+I\+N\+V\+A\+L\+I\+D\+\_\+\+A\+P\+P\+I\+D(15)}}\+: Your App ID does not have permission to use the C\+DN live streaming function. Refer to \href{https://docs.agora.io/en/Interactive\%20Broadcast/cdn_streaming_windows?platform=Windows\#prerequisites}{\texttt{ Prerequisites}} to enable the C\+DN live streaming permission. 
\item \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a4aad31b8b4b9d1f2e27c1c178df01a06}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+\_\+\+U\+N\+P\+U\+B\+L\+I\+S\+H\+\_\+\+R\+E\+A\+S\+O\+N\+\_\+\+O\+K(100)\}\+: The streaming has been stopped normally. }} 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a60f5746ac4fb39f7239ce236b64e55b6}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a60f5746ac4fb39f7239ce236b64e55b6}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onRtmpStreamingEvent@{onRtmpStreamingEvent}}
\index{onRtmpStreamingEvent@{onRtmpStreamingEvent}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onRtmpStreamingEvent()}{onRtmpStreamingEvent()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Rtmp\+Streaming\+Event (\begin{DoxyParamCaption}\item[{String}]{url,  }\item[{int}]{event }\end{DoxyParamCaption})}

Reports events during the R\+T\+MP or R\+T\+M\+PS streaming.

\begin{DoxySince}{Since}
v3.\+1.\+0.
\end{DoxySince}

\begin{DoxyParams}{Parameters}
{\em url} & The C\+DN streaming U\+RL. \\
\hline
{\em error} & The event code.
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a5080b2c05e00d816277b3aa218ea1ff4}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+I\+N\+G\+\_\+\+E\+V\+E\+N\+T\+\_\+\+F\+A\+I\+L\+E\+D\+\_\+\+L\+O\+A\+D\+\_\+\+I\+M\+A\+G\+E(1)}}\+: An error occurs when you add a background image or a watermark image to the R\+T\+MP or R\+T\+M\+PS stream.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a807b6665ae17bc9866c705c7e0776a44}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+I\+N\+G\+\_\+\+E\+V\+E\+N\+T\+\_\+\+U\+R\+L\+\_\+\+A\+L\+R\+E\+A\+D\+Y\+\_\+\+I\+N\+\_\+\+U\+S\+E(2)}}\+: The chosen U\+RL address is already in use for C\+DN live streaming.
\item \mbox{\hyperlink{}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+I\+N\+G\+\_\+\+E\+V\+E\+N\+T\+\_\+\+A\+D\+V\+A\+N\+C\+E\+D\+\_\+\+F\+E\+A\+T\+U\+R\+E\+\_\+\+N\+O\+T\+\_\+\+S\+U\+P\+P\+O\+R\+T(3)}}\+:advanced feature not support.
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a80e927065172c068dbeac5d7e1b06305}{R\+T\+M\+P\+\_\+\+S\+T\+R\+E\+A\+M\+I\+N\+G\+\_\+\+E\+V\+E\+N\+T\+\_\+\+R\+E\+Q\+U\+E\+S\+T\+\_\+\+T\+O\+O\+\_\+\+O\+F\+T\+E\+N(4)}}\+: Client request too frequently. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a3261b6e73ef26cbba4b6ff68e754b091}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a3261b6e73ef26cbba4b6ff68e754b091}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onTranscodingUpdated@{onTranscodingUpdated}}
\index{onTranscodingUpdated@{onTranscodingUpdated}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onTranscodingUpdated()}{onTranscodingUpdated()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Transcoding\+Updated (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}

Transcoding was successfully updated. \mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6f827b82ff6ed61e855bf6315aa4395c}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6f827b82ff6ed61e855bf6315aa4395c}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onStreamMessage@{onStreamMessage}}
\index{onStreamMessage@{onStreamMessage}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onStreamMessage()}{onStreamMessage()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Stream\+Message (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{stream\+Id,  }\item[{byte\mbox{[}$\,$\mbox{]}}]{data }\end{DoxyParamCaption})}

Receives the data stream. on\+Rtmp\+Streaming\+Event The S\+DK triggers this callback when the user receives the data stream that another user sends by calling the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a08e5c46d5b2eaf8fa96f43f7bb4002c8}{send\+Stream\+Message}} method within 5 seconds.


\begin{DoxyParams}{Parameters}
{\em uid} & User ID. \\
\hline
{\em stream\+Id} & Stream ID. \\
\hline
{\em data} & Data received by the recipients. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a7ec93fba444f408cd5148f8778bb6955}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a7ec93fba444f408cd5148f8778bb6955}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onStreamMessageError@{onStreamMessageError}}
\index{onStreamMessageError@{onStreamMessageError}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onStreamMessageError()}{onStreamMessageError()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Stream\+Message\+Error (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{int}]{stream\+Id,  }\item[{int}]{error,  }\item[{int}]{missed,  }\item[{int}]{cached }\end{DoxyParamCaption})}

Fails to receive the data stream.

The S\+DK triggers this callback when the user does not receive the data stream that another user sends by calling the \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a08e5c46d5b2eaf8fa96f43f7bb4002c8}{send\+Stream\+Message}} method within 5 seconds.


\begin{DoxyParams}{Parameters}
{\em uid} & ID of the user who sends the data stream. \\
\hline
{\em stream\+Id} & The ID of the stream data. \\
\hline
{\em error} & The error code. See \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_error_code}{Error code}}. \\
\hline
{\em missed} & The number of lost messages. \\
\hline
{\em cached} & The number of incoming cached messages when the data stream is interrupted. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_acfaedf8c3c744f08f065f68b91017ff2}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_acfaedf8c3c744f08f065f68b91017ff2}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onMediaEngineLoadSuccess@{onMediaEngineLoadSuccess}}
\index{onMediaEngineLoadSuccess@{onMediaEngineLoadSuccess}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onMediaEngineLoadSuccess()}{onMediaEngineLoadSuccess()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Media\+Engine\+Load\+Success (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}

Occurs when the media engine is loaded. \mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a069220e819fca1b8157ffd05342b4e35}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a069220e819fca1b8157ffd05342b4e35}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onMediaEngineStartCallSuccess@{onMediaEngineStartCallSuccess}}
\index{onMediaEngineStartCallSuccess@{onMediaEngineStartCallSuccess}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onMediaEngineStartCallSuccess()}{onMediaEngineStartCallSuccess()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Media\+Engine\+Start\+Call\+Success (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}

Occurs when the media engine starts. \mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a123fdecc812f7931578afd2f40d48d13}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a123fdecc812f7931578afd2f40d48d13}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onNetworkTypeChanged@{onNetworkTypeChanged}}
\index{onNetworkTypeChanged@{onNetworkTypeChanged}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onNetworkTypeChanged()}{onNetworkTypeChanged()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Network\+Type\+Changed (\begin{DoxyParamCaption}\item[{int}]{type }\end{DoxyParamCaption})}

Occurs when the network type is changed.


\begin{DoxyParams}{Parameters}
{\em type} & The network type. 
\begin{DoxyItemize}
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a0c80c0069492c22781d764e570d07b5c}{N\+E\+T\+W\+O\+R\+K\+\_\+\+T\+Y\+P\+E\+\_\+\+U\+N\+K\+N\+O\+WN(-\/1)}}\+: unknown. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a847bf96d2f999e4fea5df2a0d2c5d870}{N\+E\+T\+W\+O\+R\+K\+\_\+\+T\+Y\+P\+E\+\_\+\+D\+I\+S\+C\+O\+N\+N\+E\+C\+T\+E\+D(0)}}\+: disconnected. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a432036e78b77f7f7a9a4397fd0b5f899}{N\+E\+T\+W\+O\+R\+K\+\_\+\+T\+Y\+P\+E\+\_\+\+L\+A\+N(1)}}\+: L\+AN. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_acb94122ceae3f16b8422b0a84f368e31}{N\+E\+T\+W\+O\+R\+K\+\_\+\+T\+Y\+P\+E\+\_\+\+W\+I\+F\+I(2)}}\+: W\+I\+FI. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_ac90aa7be515d38e550ba8622d94fbb3b}{N\+E\+T\+W\+O\+R\+K\+\_\+\+T\+Y\+P\+E\+\_\+\+M\+O\+B\+I\+L\+E\+\_\+2\+G(3)}}\+: 2G. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a8d6920611ccbeb812c72b6b36e9d3c77}{N\+E\+T\+W\+O\+R\+K\+\_\+\+T\+Y\+P\+E\+\_\+\+M\+O\+B\+I\+L\+E\+\_\+3\+G(4)}}\+: 3G. 
\item \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a23b207341f75a8d3dd2b350d52087a58}{N\+E\+T\+W\+O\+R\+K\+\_\+\+T\+Y\+P\+E\+\_\+\+M\+O\+B\+I\+L\+E\+\_\+4\+G(5)}}\+: 4G. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a4b89dcb8d0bea0fe1917a8936f2a44ce}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a4b89dcb8d0bea0fe1917a8936f2a44ce}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onIntraRequestReceived@{onIntraRequestReceived}}
\index{onIntraRequestReceived@{onIntraRequestReceived}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onIntraRequestReceived()}{onIntraRequestReceived()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Intra\+Request\+Received (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}

Occurs when intra request from remote user is received.

This callback is triggered once remote user needs one Key frame. \mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6476220c1c741f765f83a71e4eeaa3ef}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a6476220c1c741f765f83a71e4eeaa3ef}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onUplinkNetworkInfoUpdated@{onUplinkNetworkInfoUpdated}}
\index{onUplinkNetworkInfoUpdated@{onUplinkNetworkInfoUpdated}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onUplinkNetworkInfoUpdated()}{onUplinkNetworkInfoUpdated()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Uplink\+Network\+Info\+Updated (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_uplink_network_info}{Uplink\+Network\+Info}}}]{info }\end{DoxyParamCaption})}

Occurs when uplink network info is updated.

This callback is used for notifying user to adjust the send pace based on the target bitrate.


\begin{DoxyParams}{Parameters}
{\em info} & The uplink network info. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a0fb30b2af6d3e4f70f02d35cac2505df}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a0fb30b2af6d3e4f70f02d35cac2505df}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onDownlinkNetworkInfoUpdated@{onDownlinkNetworkInfoUpdated}}
\index{onDownlinkNetworkInfoUpdated@{onDownlinkNetworkInfoUpdated}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onDownlinkNetworkInfoUpdated()}{onDownlinkNetworkInfoUpdated()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Downlink\+Network\+Info\+Updated (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_downlink_network_info}{Downlink\+Network\+Info}}}]{info }\end{DoxyParamCaption})}

Occurs when downlink network info is updated.

This callback is used for notifying user to switch major/minor stream if needed.


\begin{DoxyParams}{Parameters}
{\em info} & The network info. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5d2b5d3a5d1bbbd40e0d71594cd06d51}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5d2b5d3a5d1bbbd40e0d71594cd06d51}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onEncryptionError@{onEncryptionError}}
\index{onEncryptionError@{onEncryptionError}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onEncryptionError()}{onEncryptionError()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Encryption\+Error (\begin{DoxyParamCaption}\item[{int}]{error\+Type }\end{DoxyParamCaption})}

Reports the error type of encryption.


\begin{DoxyParams}{Parameters}
{\em type} & See \#\+E\+N\+C\+R\+Y\+P\+T\+I\+O\+N\+\_\+\+E\+R\+R\+O\+R\+\_\+\+T\+Y\+PE. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a982fad5ffc32f1414c4a6df57a88a293}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a982fad5ffc32f1414c4a6df57a88a293}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onPermissionError@{onPermissionError}}
\index{onPermissionError@{onPermissionError}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onPermissionError()}{onPermissionError()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Permission\+Error (\begin{DoxyParamCaption}\item[{int}]{permission }\end{DoxyParamCaption})}

Reports the permission error. 
\begin{DoxyParams}{Parameters}
{\em permission} & of \mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_constants_a5b2615c93a91e3206aea62ca7be38cc8}{Constants.\+R\+E\+C\+O\+R\+D\+\_\+\+A\+U\+D\+IO}}, \mbox{\hyperlink{}{Constants.\+C\+A\+M\+E\+RA}} and \{\mbox{\hyperlink{}{\} }}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ad802bd7311b1fd7b3f6cb853a567fd34}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_ad802bd7311b1fd7b3f6cb853a567fd34}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onUploadLogResult@{onUploadLogResult}}
\index{onUploadLogResult@{onUploadLogResult}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onUploadLogResult()}{onUploadLogResult()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Upload\+Log\+Result (\begin{DoxyParamCaption}\item[{String}]{request\+Id,  }\item[{boolean}]{success,  }\item[{int}]{reason }\end{DoxyParamCaption})}

Reports the user log upload result 
\begin{DoxyParams}{Parameters}
{\em request\+Id} & Request\+Id of the upload \\
\hline
{\em success} & Is upload success \\
\hline
{\em reason} & Reason of the upload, 0\+: OK, 1 Network Error, 2 Server Error. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a92c65f217aa90841fb4bd71bd8e998b7}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a92c65f217aa90841fb4bd71bd8e998b7}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onProxyConnected@{onProxyConnected}}
\index{onProxyConnected@{onProxyConnected}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onProxyConnected()}{onProxyConnected()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Proxy\+Connected (\begin{DoxyParamCaption}\item[{String}]{channel,  }\item[{int}]{uid,  }\item[{int}]{proxy\+Type,  }\item[{String}]{local\+Proxy\+Ip,  }\item[{int}]{elapsed }\end{DoxyParamCaption})}

Occurs when the local user joins a specified channel after calling \{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_rtc_engine_a39207f6b1f7136fe8faf6ef15915b97d}{set\+Local\+Access\+Point\} or \{ Rtc\+Engine\#set\+Cloud\+Proxy(int) set\+Cloud\+Proxy\}. The channel name assignment is based on channel\+Name specified in the \{ Rtc\+Engine\#join\+Channel(\+String, String, String, int) join\+Channel\} method If the {\ttfamily uid} is not specified when  Rtc\+Engine\#join\+Channel(\+String, String, String, int) join\+Channel\} is called, the server automatically assigns a uid.  channel The channel name.  uid User ID.  proxy\+Type type of proxy agora sdk connected, proxy\+Type will be P\+R\+O\+X\+Y\+\_\+\+T\+Y\+P\+E\+\_\+\+N\+O\+N\+E\+\_\+\+P\+R\+O\+XY if not connected to proxy(fallback).  local\+Proxy\+Ip local proxy ip, if not join local proxy, it will be \char`\"{}\char`\"{}  elapsed Time elapsed (ms) from the user calling  Rtc\+Engine\#join\+Channel(String, String, String, int) join\+Channel\} until this callback is triggered. }}\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a33c557a7ed4542fc4561a9d570831073}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a33c557a7ed4542fc4561a9d570831073}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onVideoRenderingTracingResult@{onVideoRenderingTracingResult}}
\index{onVideoRenderingTracingResult@{onVideoRenderingTracingResult}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onVideoRenderingTracingResult()}{onVideoRenderingTracingResult()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Video\+Rendering\+Tracing\+Result (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{Constants.\+M\+E\+D\+I\+A\+\_\+\+T\+R\+A\+C\+E\+\_\+\+E\+V\+E\+NT}]{current\+Event,  }\item[{\mbox{\hyperlink{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_1_1_video_rendering_tracing_info}{Video\+Rendering\+Tracing\+Info}}}]{tracing\+Info }\end{DoxyParamCaption})}

Reports the tracing result of video rendering event of the user.


\begin{DoxyParams}{Parameters}
{\em uid} & The user ID. \\
\hline
{\em current\+Event} & The current event of the tracing result\+: \#\+M\+E\+D\+I\+A\+\_\+\+T\+R\+A\+C\+E\+\_\+\+E\+V\+E\+NT. \\
\hline
{\em tracing\+Info} & The tracing result\+: \#\+Video\+Rendering\+Tracing\+Info. \\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a1c8858d82c94cccbbd1ba6eb592e604e}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a1c8858d82c94cccbbd1ba6eb592e604e}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onLocalVideoTranscoderError@{onLocalVideoTranscoderError}}
\index{onLocalVideoTranscoderError@{onLocalVideoTranscoderError}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onLocalVideoTranscoderError()}{onLocalVideoTranscoderError()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Local\+Video\+Transcoder\+Error (\begin{DoxyParamCaption}\item[{Local\+Transcoder\+Configuration.\+Transcoding\+Video\+Stream}]{stream,  }\item[{int}]{error }\end{DoxyParamCaption})}

Occurs when local video transcoder stream has an error.


\begin{DoxyParams}{Parameters}
{\em stream} & Stream type of Transcoding\+Video\+Stream. \\
\hline
{\em error} & The error code\+:
\begin{DoxyItemize}
\item {\ttfamily V\+T\+\_\+\+E\+R\+R\+\_\+\+O\+K(0)}\+: No error.
\item {\ttfamily V\+T\+\_\+\+E\+R\+R\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+N\+O\+T\+\_\+\+R\+E\+A\+D\+Y(1)}\+: The video track of the video source is not started.
\item {\ttfamily V\+T\+\_\+\+E\+R\+R\+\_\+\+I\+N\+V\+A\+L\+I\+D\+\_\+\+V\+I\+D\+E\+O\+\_\+\+S\+O\+U\+R\+C\+E\+\_\+\+T\+Y\+P\+E(2)}\+: The video source type is not supported.
\item {\ttfamily V\+T\+\_\+\+E\+R\+R\+\_\+\+I\+N\+V\+A\+L\+I\+D\+\_\+\+I\+M\+A\+G\+E\+\_\+\+P\+A\+T\+H(3)}\+: The image source url is not correct.
\item {\ttfamily V\+T\+\_\+\+E\+R\+R\+\_\+\+U\+N\+S\+U\+P\+P\+O\+R\+T\+\_\+\+I\+M\+A\+G\+E\+\_\+\+F\+O\+R\+M\+A\+T(4)}\+: The image format not the type png/jpeg/gif of image source.
\item {\ttfamily V\+T\+\_\+\+E\+R\+R\+\_\+\+I\+N\+V\+A\+L\+I\+D\+\_\+\+L\+A\+Y\+O\+U\+T(5)}\+: The layout is invalid. Possible reason\+: The width of the layout is zero. 
\end{DoxyItemize}\\
\hline
\end{DoxyParams}
\mbox{\Hypertarget{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5642c37198789f09a0e82560cea482c8}\label{classio_1_1agora_1_1rtc2_1_1_i_rtc_engine_event_handler_a5642c37198789f09a0e82560cea482c8}} 
\index{io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}!onAudioMetadataReceived@{onAudioMetadataReceived}}
\index{onAudioMetadataReceived@{onAudioMetadataReceived}!io.agora.rtc2.IRtcEngineEventHandler@{io.agora.rtc2.IRtcEngineEventHandler}}
\doxysubsubsection{\texorpdfstring{onAudioMetadataReceived()}{onAudioMetadataReceived()}}
{\footnotesize\ttfamily void io.\+agora.\+rtc2.\+I\+Rtc\+Engine\+Event\+Handler.\+on\+Audio\+Metadata\+Received (\begin{DoxyParamCaption}\item[{int}]{uid,  }\item[{byte\mbox{[}$\,$\mbox{]}}]{data }\end{DoxyParamCaption})}



Occurs when the S\+DK receives audio metadata. 

\begin{DoxySince}{Since}
v4.\+3.\+1 
\end{DoxySince}

\begin{DoxyParams}{Parameters}
{\em metadata} & The pointer of metadata \\
\hline
{\em length} & Size of metadata @technical preview \\
\hline
\end{DoxyParams}
