{"id":3281,"date":"2024-12-27T11:09:01","date_gmt":"2024-12-27T11:09:01","guid":{"rendered":"https:\/\/sparkminds.net\/?p=3281"},"modified":"2024-12-27T11:12:43","modified_gmt":"2024-12-27T11:12:43","slug":"create-a-streaming-app-with-react-native-and-getstream","status":"publish","type":"post","link":"https:\/\/sparkminds.net\/vi\/create-a-streaming-app-with-react-native-and-getstream\/","title":{"rendered":"Create a Streaming App with React Native and GetStream"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"3281\" class=\"elementor elementor-3281\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f9b500c elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f9b500c\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-85de0f9\" data-id=\"85de0f9\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d7cb175 elementor-widget elementor-widget-text-editor\" data-id=\"d7cb175\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\tIn the fourth industrial revolution, streaming became more popular in multiple sectors, such as entertainment, retail, and consulting services. If you want to create a streaming app to help your business boom, you are in the right place. This article will help you understand streaming and how to develop a streaming app with React Native and GetStream.\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a4c0ade elementor-widget elementor-widget-heading\" data-id=\"a4c0ade\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Streaming Overview<\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8e7e87c elementor-widget elementor-widget-heading\" data-id=\"8e7e87c\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<p class=\"elementor-heading-title elementor-size-default\">What Is Streaming?<\/p>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-eb05c6f elementor-widget elementor-widget-text-editor\" data-id=\"eb05c6f\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\tStreaming is the continuous transmission of audio or video files from a server to a client. In simpler terms, streaming is what happens when audiences watch TV or listen to podcasts on Internet-connected devices. With streaming, the media file being played on the client device is stored remotely and transmitted a few seconds at a time over the Internet.\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b3e1f9c elementor-widget elementor-widget-heading\" data-id=\"b3e1f9c\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<p class=\"elementor-heading-title elementor-size-default\">How does streaming work?<\/p>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6be5cc4 elementor-widget elementor-widget-text-editor\" data-id=\"6be5cc4\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\tJust like other data sent over the Internet, audio and video data are broken down into data packets. Each packet contains a small piece of the file, and an audio or video player in the browser on the client device receives the flow of data packets and interprets them as video or audio.\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c3a80bd elementor-widget elementor-widget-heading\" data-id=\"c3a80bd\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<p class=\"elementor-heading-title elementor-size-default\">Does streaming use the User Datagram Protocol (UDP) or the Transmission Control Protocol (TCP)?<\/p>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e18f804 elementor-widget elementor-widget-text-editor\" data-id=\"e18f804\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Some streaming methods use UDP, while others use TCP. UDP and TCP are transport protocols, meaning they are used for moving packets of data across networks. Both are used with the Internet Protocol (IP). TCP opens a dedicated connection before transmitting data, and it ensures all data packets arrive in order. Unlike TCP, UDP does neither of these things. As a result, TCP is more reliable, but transmitting data via UDP does not take as long as it does via TCP, although some packets are lost along the way.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4bc8b7c elementor-widget elementor-widget-text-editor\" data-id=\"4bc8b7c\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\tIf TCP is like a package delivery service that requires the recipient to sign for the package, then UDP is like a delivery service that leaves packages on the front porch without knocking on the door to get a signature. The TCP delivery service loses fewer packages, but the UDP delivery service is faster, because packages can get dropped off even if no one is home to sign for them.\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bdbcb9d elementor-widget elementor-widget-text-editor\" data-id=\"bdbcb9d\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\tFor streaming, in some cases, speed is far more important than reliability. For instance, if someone is in a video conference, they would prefer to interact with the other conference attendees in real time than to sit and wait for every bit of data to be delivered. Therefore, a few lost data packets are not a huge concern, and UDP should be used.\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7ae64ed elementor-widget elementor-widget-text-editor\" data-id=\"7ae64ed\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\tIn other cases, reliability is more important for streaming. For example, both HTTP live streaming (HLS) and MPEG-DASH are streaming protocols that use TCP for transport. Many video-on-demand services use TCP.\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-256ea17 elementor-widget elementor-widget-heading\" data-id=\"256ea17\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<p class=\"elementor-heading-title elementor-size-default\">What is buffering?<\/p>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-afc202a elementor-widget elementor-widget-text-editor\" data-id=\"afc202a\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Streaming media players load a few seconds of the stream ahead of time so that the video or audio can continue playing if the connection is briefly interrupted. This is known as buffering. Buffering ensures that videos can play smoothly and continuously. However, over slow connections, or if a network has a great deal of latency, a video can take a long time to buffer.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2643bdd elementor-widget elementor-widget-heading\" data-id=\"2643bdd\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Create a Streaming App with React Native Using GetStream<\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5454e30 elementor-widget elementor-widget-text-editor\" data-id=\"5454e30\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>In this tutorial, we\u2019ll jump straight into building a streaming app without covering additional React Native setup.<\/p><p>To create a complete streaming system, we would typically need to develop our own backend, CMS, and mobile app. But now we are focusing solely on building a streaming app using just React Native. To achieve this, we need to use a third-party library called <a href=\"https:\/\/getstream.io\/video\/docs\/reactnative\/\"><span style=\"text-decoration: underline;\">GetStream<\/span><\/a>.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-247a2db elementor-widget elementor-widget-heading\" data-id=\"247a2db\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<p class=\"elementor-heading-title elementor-size-default\">Installation (<a href=\"https:\/\/getstream.io\/video\/docs\/react-native\/setup\/installation\/react-native\/\"><u>Details here<\/u><\/a>)<\/p>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fdf6641 elementor-widget elementor-widget-text-editor\" data-id=\"fdf6641\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>In order to install the Stream Video React Native SDK, run the following command in your terminal of choice:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ade47d1 elementor-widget elementor-widget-html\" data-id=\"ade47d1\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<pre><code>yarn add @stream-io\/video-react-native-sdk<\/code><\/pre>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0ad42e8 elementor-widget elementor-widget-text-editor\" data-id=\"0ad42e8\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\tStream Video React Native SDK requires installing some peer dependencies to provide you with a great calling experience. You can run the following command to install them:\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ff289a2 elementor-widget elementor-widget-html\" data-id=\"ff289a2\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<pre><code>yarn add @stream-io\/react-native-webrtc \\\\\r\n   react-native-incall-manager react-native-svg \\\\\r\n   @react-native-community\/netinfo\r\nnpx pod-install\r\n<\/code><\/pre>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f77471d elementor-widget elementor-widget-heading\" data-id=\"f77471d\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<p class=\"elementor-heading-title elementor-size-default\">Android Specific installation<\/p>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9d2d269 elementor-widget elementor-widget-text-editor\" data-id=\"9d2d269\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\tIn android\/build.gradle add the following inside the buildscript section:\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cb925ef elementor-widget elementor-widget-html\" data-id=\"cb925ef\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<pre><code>buildscript {\r\n    ext {\r\n        ...\r\n        minSdkVersion = 24\r\n    }\r\n    ...\r\n}\r\n<\/code><\/pre>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-509f33c elementor-widget elementor-widget-text-editor\" data-id=\"509f33c\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p><strong>Enable Java 8 Support<br \/><\/strong>In android\/app\/build.gradle add the following inside the android section:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f6d9d44 elementor-widget elementor-widget-html\" data-id=\"f6d9d44\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<pre><code>compileOptions {\r\n    sourceCompatibility JavaVersion.VERSION_1_8\r\n    targetCompatibility JavaVersion.VERSION_11\r\n}<\/code><\/pre>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a06dddf elementor-widget elementor-widget-text-editor\" data-id=\"a06dddf\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p><strong>Optional: R8\/ProGuard Support<br \/><\/strong>If you require R8\/ProGuard support then in android\/app\/proguard-rules.pro add the following on a new line:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aa42908 elementor-widget elementor-widget-html\" data-id=\"aa42908\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<pre><code>-keep class org.webrtc.** { *; }\r\n<\/code><\/pre>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-15f2297 elementor-widget elementor-widget-heading\" data-id=\"15f2297\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<p class=\"elementor-heading-title elementor-size-default\">Declaring Permissions<\/p>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c065910 elementor-widget elementor-widget-text-editor\" data-id=\"c065910\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\tMaking video or audio calls requires the usage of the device&#8217;s camera and microphone accordingly. In both platforms, we must declare the permissions.\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-460e2b6 elementor-widget elementor-widget-text-editor\" data-id=\"460e2b6\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p><strong>iOS<\/strong><\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6576ba4 elementor-widget elementor-widget-text-editor\" data-id=\"6576ba4\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Add the following keys and values to Info.plist file at a minimum:<br \/>Privacy &#8211; Camera Usage Description &#8211; &#8220;&lt;Your_app_name&gt; requires camera access to capture and transmit video&#8221; Privacy &#8211; Microphone Usage Description &#8211; &#8221; &lt;Your_app_name&gt; requires microphone access to capture and transmit audio&#8221;<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a0f86ae elementor-widget elementor-widget-text-editor\" data-id=\"a0f86ae\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p><strong>Android<\/strong><\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8ea4948 elementor-widget elementor-widget-text-editor\" data-id=\"8ea4948\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>In <span class=\"notion-enable-hover\" spellcheck=\"false\" data-token-index=\"1\">AndroidManifest.xml<\/span> add the following permissions before the <span class=\"notion-enable-hover\" spellcheck=\"false\" data-token-index=\"3\">&lt;application&gt;<\/span> section.<!-- notionvc: 77056b33-3689-4cca-86be-2a1ca8c836a3 --><\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-50bfc55 elementor-widget elementor-widget-html\" data-id=\"50bfc55\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<pre><code>&lt;uses-feature android:name&#x3D;&quot;android.hardware.camera&quot; &#x2F;&gt;\r\n&lt;uses-feature android:name&#x3D;&quot;android.hardware.camera.autofocus&quot; &#x2F;&gt;\r\n&lt;uses-feature android:name&#x3D;&quot;android.hardware.audio.output&quot; &#x2F;&gt;\r\n&lt;uses-feature android:name&#x3D;&quot;android.hardware.microphone&quot; &#x2F;&gt;\r\n\r\n&lt;uses-permission android:name&#x3D;&quot;android.permission.CAMERA&quot; &#x2F;&gt;\r\n&lt;uses-permission android:name&#x3D;&quot;android.permission.RECORD_AUDIO&quot; &#x2F;&gt;\r\n&lt;uses-permission android:name&#x3D;&quot;android.permission.ACCESS_NETWORK_STATE&quot; &#x2F;&gt;\r\n&lt;uses-permission android:name&#x3D;&quot;android.permission.CHANGE_NETWORK_STATE&quot; &#x2F;&gt;\r\n&lt;uses-permission android:name&#x3D;&quot;android.permission.MODIFY_AUDIO_SETTINGS&quot; &#x2F;&gt;\r\n&lt;uses-permission android:name&#x3D;&quot;android.permission.INTERNET&quot; &#x2F;&gt;\r\n<\/code><\/pre>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9c745d6 elementor-widget elementor-widget-text-editor\" data-id=\"9c745d6\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\tIf you plan to also support Bluetooth devices then add the following command.\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-88ad6d9 elementor-widget elementor-widget-html\" data-id=\"88ad6d9\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<pre><code>&lt;uses-permission android:name&#x3D;&quot;android.permission.BLUETOOTH&quot; android:maxSdkVersion&#x3D;&quot;30&quot; &#x2F;&gt;\r\n&lt;uses-permission android:name&#x3D;&quot;android.permission.BLUETOOTH_ADMIN&quot; android:maxSdkVersion&#x3D;&quot;30&quot; &#x2F;&gt;\r\n&lt;uses-permission android:name&#x3D;&quot;android.permission.BLUETOOTH_CONNECT&quot; &#x2F;&gt;\r\n<\/code><\/pre>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2483a31 elementor-widget elementor-widget-text-editor\" data-id=\"2483a31\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Next, we will build two screens: the Host screen and the Viewer screen.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-302e91f elementor-widget elementor-widget-text-editor\" data-id=\"302e91f\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\tStreamingHostScreen.tsx\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8b5ac88 elementor-widget elementor-widget-html\" data-id=\"8b5ac88\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<pre><code>import React, { useEffect, useLayoutEffect } from &quot;react&quot;;\r\nimport {\r\n  HostLivestream,\r\n  StreamCall,\r\n  StreamVideo,\r\n  StreamVideoClient,\r\n  User,\r\n} from &quot;@stream-io&#x2F;video-react-native-sdk&quot;;\r\nimport { AppStackScreenProp } from &quot;navigators&quot;;\r\nimport { Layout } from &quot;components&quot;;\r\nimport { HostLivestreamControlsView } from &quot;.&#x2F;HostLivestreamControlsView&quot;;\r\nimport { HostLivestreamTopView } from &quot;.&#x2F;HostLivestreamTopView&quot;;\r\n\r\nimport IncallManager from &quot;react-native-incall-manager&quot;;\r\n\r\nconst apiKey &#x3D; &quot;mmhfdzb5evj2&quot;; &#x2F;&#x2F; API key for Stream Video SDK\r\nconst token &#x3D;\r\n  &quot;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3Byb250by5nZXRzdHJlYW0uaW8iLCJzdWIiOiJ1c2VyL0dlbmVyYWxfR3JpZXZvdXMiLCJ1c2VyX2lkIjoiR2VuZXJhbF9Hcmlldm91cyIsInZhbGlkaXR5X2luX3NlY29uZHMiOjYwNDgwMCwiaWF0IjoxNzI2MDQ3MzYyLCJleHAiOjE3MjY2NTIxNjJ9.GDMFP4wf3DifOw1ZmxO0KSy2HG_t4ByFv2kKwW5hVp4&quot;; &#x2F;&#x2F; JWT token for user authentication\r\nconst userId &#x3D; &quot;General_Grievous&quot;; &#x2F;&#x2F; User ID for the stream\r\nconst callId &#x3D; &quot;FMeNGvwQJY26&quot;; &#x2F;&#x2F; Call ID for the livestream session\r\n\r\n&#x2F;&#x2F; StreamingHostScreen functional component\r\nexport const StreamingHostScreen: React.FC&lt;\r\n  AppStackScreenProp&lt;&quot;StreamingHost&quot;&gt;\r\n&gt; &#x3D; ({ navigation }) &#x3D;&gt; {\r\n  const user: User &#x3D; { id: userId, name: &quot;SparkMinds Host&quot; }; &#x2F;&#x2F; User details\r\n\r\n  &#x2F;&#x2F; Get or create an instance of the StreamVideoClient\r\n  const client &#x3D; StreamVideoClient.getOrCreateInstance({ apiKey, user, token });\r\n\r\n  &#x2F;&#x2F; Initialize a call of type &#39;livestream&#39; with the given callId\r\n  const call &#x3D; client.call(&quot;livestream&quot;, callId);\r\n\r\n  &#x2F;&#x2F; useEffect to handle joining and ending the livestream\r\n  useEffect(() &#x3D;&gt; {\r\n    call.join({ create: true }); &#x2F;&#x2F; Join or create the livestream\r\n    IncallManager.start({ media: &quot;video&quot; }); &#x2F;&#x2F; Start the call with video\r\n\r\n    return () &#x3D;&gt; {\r\n      call.endCall(); &#x2F;&#x2F; Clean up by ending the call\r\n      IncallManager.stop(); &#x2F;&#x2F; Stop the call manager when component unmounts\r\n    };\r\n  }, []);\r\n\r\n  &#x2F;&#x2F; useLayoutEffect to hide the default header\r\n  useLayoutEffect(() &#x3D;&gt; {\r\n    navigation.setOptions({\r\n      headerShown: false, &#x2F;&#x2F; Hide the navigation header\r\n    });\r\n  }, []);\r\n\r\n  &#x2F;&#x2F; Main JSX layout for hosting the livestream\r\n  return (\r\n    &lt;Layout&gt;\r\n      {&#x2F;* StreamVideo provider for handling video stream *&#x2F;}\r\n      &lt;StreamVideo client&#x3D;{client}&gt;\r\n        {&#x2F;* StreamCall component wrapping the livestream *&#x2F;}\r\n        &lt;StreamCall call&#x3D;{call}&gt;\r\n          {&#x2F;* HostLivestream component, providing custom top view and controls *&#x2F;}\r\n          &lt;HostLivestream\r\n            HostLivestreamTopView&#x3D;{HostLivestreamTopView} &#x2F;&#x2F; Top view for the host stream UI\r\n            HostLivestreamControls&#x3D;{HostLivestreamControlsView} &#x2F;&#x2F; Controls for managing the stream\r\n          &#x2F;&gt;\r\n        &lt;&#x2F;StreamCall&gt;\r\n      &lt;&#x2F;StreamVideo&gt;\r\n    &lt;&#x2F;Layout&gt;\r\n  );\r\n};\r\n\r\n<\/code><\/pre>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7453d79 elementor-widget elementor-widget-text-editor\" data-id=\"7453d79\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>HostLivestreamTopView.tsx<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0141c45 elementor-widget elementor-widget-html\" data-id=\"0141c45\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<pre><code>import React from &quot;react&quot;;\r\nimport {\r\n  DurationBadge,\r\n  FollowerCount,\r\n  HostLivestreamTopViewProps,\r\n  LiveIndicator,\r\n} from &quot;@stream-io&#x2F;video-react-native-sdk&quot;;\r\nimport { SViewStyle } from &quot;models&quot;;\r\nimport { View } from &quot;react-native&quot;;\r\nimport { useSafeAreaInsets } from &quot;react-native-safe-area-context&quot;;\r\nimport { style } from &quot;theme&quot;;\r\n\r\nexport const HostLivestreamTopView: React.FC&lt;\r\n  HostLivestreamTopViewProps\r\n&gt; &#x3D; () &#x3D;&gt; {\r\n  const insets &#x3D; useSafeAreaInsets(); &#x2F;&#x2F; Get the safe area insets to handle devices with notches\r\n\r\n  return (\r\n    &#x2F;&#x2F; Main container for the top view, with top padding based on safe area insets\r\n    &lt;View style&#x3D;{[$topView, { paddingTop: insets.top }]}&gt;\r\n      {&#x2F;* Displays the stream duration for the host *&#x2F;}\r\n      &lt;DurationBadge mode&#x3D;&quot;host&quot; &#x2F;&gt;\r\n\r\n      {&#x2F;* Spacer view to push other elements apart *&#x2F;}\r\n      &lt;View style&#x3D;{style.flex_1} &#x2F;&gt;\r\n\r\n      {&#x2F;* Live indicator showing the stream is currently live *&#x2F;}\r\n      &lt;LiveIndicator &#x2F;&gt;\r\n\r\n      {&#x2F;* Displays the number of followers watching the stream *&#x2F;}\r\n      &lt;FollowerCount &#x2F;&gt;\r\n    &lt;&#x2F;View&gt;\r\n  );\r\n};\r\n\r\n&#x2F;&#x2F; Styling for the top view container, arranging elements in a row with padding\r\nconst $topView: SViewStyle &#x3D; [style.row, style.px_md];\r\n<\/code><\/pre>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-967ab33 elementor-widget elementor-widget-text-editor\" data-id=\"967ab33\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>HostLivestreamControlsView.tsx<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-789d7ea elementor-widget elementor-widget-html\" data-id=\"789d7ea\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<pre><code>import React from &quot;react&quot;;\r\nimport {\r\n  HostLivestreamControlsProps,\r\n  HostStartStreamButton,\r\n  LivestreamMediaControls,\r\n} from &quot;@stream-io&#x2F;video-react-native-sdk&quot;;\r\nimport { SViewStyle } from &quot;models&quot;;\r\nimport { View } from &quot;react-native&quot;;\r\nimport { spacing, style } from &quot;theme&quot;;\r\nimport { useSafeAreaInsets } from &quot;react-native-safe-area-context&quot;;\r\n\r\ntype HostLivestreamControlsViewProps &#x3D; {} &amp; HostLivestreamControlsProps;\r\n\r\n&#x2F;&#x2F; Main functional component for controlling the host livestream\r\nexport const HostLivestreamControlsView: React.FC&lt;\r\n  HostLivestreamControlsViewProps\r\n&gt; &#x3D; ({\r\n  onEndStreamHandler, &#x2F;&#x2F; Handler for ending the stream\r\n  onStartStreamHandler, &#x2F;&#x2F; Handler for starting the stream\r\n  hls, &#x2F;&#x2F; HLS (HTTP Live Streaming) protocol flag or configuration\r\n  disableStopPublishedStreamsOnEndStream, &#x2F;&#x2F; Option to disable stopping published streams when ending\r\n  onLayout, &#x2F;&#x2F; Layout handler, typically for UI measurement purposes\r\n}) &#x3D;&gt; {\r\n  const insets &#x3D; useSafeAreaInsets(); &#x2F;&#x2F; Get safe area insets (e.g., for iPhone with notches)\r\n\r\n  return (\r\n    &#x2F;&#x2F; Root view containing controls with safe area padding and layout handling\r\n    &lt;View\r\n      style&#x3D;{[$root, { paddingBottom: insets.bottom || spacing.md }]} &#x2F;&#x2F; Adding bottom padding based on safe area insets\r\n      onLayout&#x3D;{onLayout} &#x2F;&#x2F; Handling layout changes\r\n    &gt;\r\n      {&#x2F;* Start&#x2F;End stream button, passing through event handlers and stream config *&#x2F;}\r\n      &lt;HostStartStreamButton\r\n        onEndStreamHandler&#x3D;{onEndStreamHandler}\r\n        onStartStreamHandler&#x3D;{onStartStreamHandler}\r\n        hls&#x3D;{hls}\r\n        disableStopPublishedStreamsOnEndStream&#x3D;{\r\n          disableStopPublishedStreamsOnEndStream\r\n        }\r\n      &#x2F;&gt;\r\n      {&#x2F;* Media controls for interacting with the livestream (play, pause, etc.) *&#x2F;}\r\n      &lt;LivestreamMediaControls &#x2F;&gt;\r\n    &lt;&#x2F;View&gt;\r\n  );\r\n};\r\n\r\n&#x2F;&#x2F; Styles for the root view using project-defined styles\r\nconst $root: SViewStyle &#x3D; [style.row_between, style.px_md, style.pt_md];\r\n<\/code><\/pre>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c1c579e elementor-widget elementor-widget-text-editor\" data-id=\"c1c579e\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>StreamingViewerScreen.tsx<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d7e8ad1 elementor-widget elementor-widget-html\" data-id=\"d7e8ad1\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<code><pre>import React, { useLayoutEffect } from &quot;react&quot;;\r\nimport { Layout } from &quot;components&quot;;\r\nimport { AppStackScreenProp } from &quot;navigators&quot;;\r\nimport {\r\n  LivestreamPlayer,\r\n  StreamVideo,\r\n  StreamVideoClient,\r\n  User,\r\n} from &quot;@stream-io&#x2F;video-react-native-sdk&quot;;\r\nimport { ViewerLivestreamView } from &quot;.&#x2F;ViewerLivestreamView&quot;;\r\n\r\nconst apiKey &#x3D; &quot;mmhfdzb5evj2&quot;; &#x2F;&#x2F; API key for Stream Video SDK\r\nconst token &#x3D;\r\n  &quot;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3Byb250by5nZXRzdHJlYW0uaW8iLCJzdWIiOiJ1c2VyL0dlbmVyYWxfR3JpZXZvdXMiLCJ1c2VyX2lkIjoiR2VuZXJhbF9Hcmlldm91cyIsInZhbGlkaXR5X2luX3NlY29uZHMiOjYwNDgwMCwiaWF0IjoxNzI2MDQ3MzYyLCJleHAiOjE3MjY2NTIxNjJ9.GDMFP4wf3DifOw1ZmxO0KSy2HG_t4ByFv2kKwW5hVp4&quot;; &#x2F;&#x2F; JWT token for user authentication\r\nconst userId &#x3D; &quot;General_Grievous&quot;; &#x2F;&#x2F; User ID for the viewer\r\nconst callId &#x3D; &quot;FMeNGvwQJY26&quot;; &#x2F;&#x2F; Call ID for the livestream session\r\n\r\nconst user: User &#x3D; { id: userId, name: &quot;SparkMinds Viewer&quot; }; &#x2F;&#x2F; Viewer user details\r\n\r\n&#x2F;&#x2F; StreamingViewerScreen functional component\r\nexport const StreamingViewerScreen: React.FC&lt;\r\n  AppStackScreenProp&lt;&quot;StreamingViewer&quot;&gt;\r\n&gt; &#x3D; ({ navigation }) &#x3D;&gt; {\r\n  &#x2F;&#x2F; Create an instance of the StreamVideoClient with the given API key, user details, and token\r\n  const client &#x3D; StreamVideoClient.getOrCreateInstance({ apiKey, user, token });\r\n\r\n  &#x2F;&#x2F; useLayoutEffect to set up the navigation header\r\n  useLayoutEffect(() &#x3D;&gt; {\r\n    navigation.setOptions({\r\n      headerShown: false, &#x2F;&#x2F; Hide the navigation header while viewing the livestream\r\n    });\r\n  }, []);\r\n\r\n  &#x2F;&#x2F; Main JSX layout for the livestream viewer\r\n  return (\r\n    &lt;Layout&gt;\r\n      {&#x2F;* StreamVideo provider to handle video stream for the viewer *&#x2F;}\r\n      &lt;StreamVideo client&#x3D;{client}&gt;\r\n        {&#x2F;* LivestreamPlayer to manage the livestream playback *&#x2F;}\r\n        &lt;LivestreamPlayer\r\n          callType&#x3D;&quot;livestream&quot; &#x2F;&#x2F; Specifies the type of stream (livestream)\r\n          callId&#x3D;{callId} &#x2F;&#x2F; Passes the callId for the specific livestream session\r\n          ViewerLivestream&#x3D;{ViewerLivestreamView} &#x2F;&#x2F; Custom viewer view for the livestream UI\r\n        &#x2F;&gt;\r\n      &lt;&#x2F;StreamVideo&gt;\r\n    &lt;&#x2F;Layout&gt;\r\n  );\r\n};\r\n<\/pre><\/code>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-67550a2 elementor-widget elementor-widget-text-editor\" data-id=\"67550a2\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\tViewerLivestreamView.tsx\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-639edd4 elementor-widget elementor-widget-html\" data-id=\"639edd4\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<code><pre>import React, { useEffect } from &quot;react&quot;;\r\nimport { StyleSheet } from &quot;react-native&quot;;\r\nimport InCallManager from &quot;react-native-incall-manager&quot;;\r\nimport { useCallStateHooks } from &quot;@stream-io&#x2F;video-react-bindings&quot;;\r\nimport { hasVideo } from &quot;@stream-io&#x2F;video-client&quot;;\r\nimport {\r\n  DurationBadge,\r\n  FloatingParticipantView,\r\n  FollowerCount,\r\n  LiveIndicator,\r\n  LivestreamLayout,\r\n  useTheme,\r\n  ViewerLivestreamProps,\r\n  ViewerLivestreamTopViewProps,\r\n} from &quot;@stream-io&#x2F;video-react-native-sdk&quot;;\r\nimport { Layout } from &quot;components&quot;;\r\nimport { ViewerLivestreamTopView } from &quot;.&#x2F;ViewerLivestreamTopView&quot;;\r\nimport { ViewerLivestreamControls } from &quot;.&#x2F;ViewerLivestreamControls&quot;;\r\n\r\ntype ViewerLivestreamViewProps &#x3D; {} &amp; ViewerLivestreamProps;\r\n\r\nexport const ViewerLivestreamView: React.FC&lt;ViewerLivestreamViewProps&gt; &#x3D; ({\r\n  onLeaveStreamHandler,\r\n}) &#x3D;&gt; {\r\n  const {\r\n    theme: { viewerLivestream }, &#x2F;&#x2F; Get the theme for viewer livestream\r\n  } &#x3D; useTheme();\r\n  const { useHasOngoingScreenShare, useParticipants } &#x3D; useCallStateHooks(); &#x2F;&#x2F; Hooks for call state management\r\n  const hasOngoingScreenShare &#x3D; useHasOngoingScreenShare(); &#x2F;&#x2F; Check if there is an ongoing screen share\r\n  const [currentSpeaker] &#x3D; useParticipants(); &#x2F;&#x2F; Get the current speaker from participants\r\n  const floatingParticipant &#x3D;\r\n    hasOngoingScreenShare &amp;&amp;\r\n    currentSpeaker &amp;&amp;\r\n    hasVideo(currentSpeaker) &amp;&amp; &#x2F;&#x2F; Check if the current speaker has video\r\n    currentSpeaker;\r\n\r\n  const [topViewHeight, setTopViewHeight] &#x3D; React.useState&lt;number&gt;(); &#x2F;&#x2F; State for the height of the top view\r\n  const [controlsHeight, setControlsHeight] &#x3D; React.useState&lt;number&gt;(); &#x2F;&#x2F; State for the height of the controls\r\n\r\n  &#x2F;&#x2F; Automatically route audio to speaker devices as relevant for watching videos\r\n  useEffect(() &#x3D;&gt; {\r\n    InCallManager.start({ media: &quot;video&quot; }); &#x2F;&#x2F; Start the in-call manager for video\r\n    return () &#x3D;&gt; InCallManager.stop(); &#x2F;&#x2F; Stop the in-call manager when the component unmounts\r\n  }, []);\r\n\r\n  &#x2F;&#x2F; Props for the top view of the livestream\r\n  const topViewProps: ViewerLivestreamTopViewProps &#x3D; {\r\n    LiveIndicator,\r\n    FollowerCount,\r\n    DurationBadge,\r\n    onLayout: (event) &#x3D;&gt; {\r\n      setTopViewHeight(event.nativeEvent.layout.height); &#x2F;&#x2F; Set the height of the top view\r\n    },\r\n  };\r\n\r\n  return (\r\n    &lt;Layout style&#x3D;{viewerLivestream.container}&gt;\r\n      {&quot; &quot;}\r\n      {&#x2F;* Main layout for the viewer livestream *&#x2F;}\r\n      &lt;ViewerLivestreamTopView {...topViewProps} &#x2F;&gt;{&quot; &quot;}\r\n      {&#x2F;* Render the top view with props *&#x2F;}\r\n      {floatingParticipant &amp;&amp; ( &#x2F;&#x2F; Render floating participant if available\r\n        &lt;FloatingParticipantView\r\n          participant&#x3D;{floatingParticipant} &#x2F;&#x2F; Pass the floating participant\r\n          draggableContainerStyle&#x3D;{[\r\n            StyleSheet.absoluteFill, &#x2F;&#x2F; Fill the container absolutely\r\n            {\r\n              top: topViewHeight, &#x2F;&#x2F; Position based on top view height\r\n              bottom: controlsHeight, &#x2F;&#x2F; Position based on controls height\r\n            },\r\n          ]}\r\n        &#x2F;&gt;\r\n      )}\r\n      &lt;LivestreamLayout &#x2F;&gt; {&#x2F;* Render the main livestream layout *&#x2F;}\r\n      &lt;ViewerLivestreamControls\r\n        onLeaveStreamHandler&#x3D;{onLeaveStreamHandler} &#x2F;&#x2F; Pass handler for leaving the stream\r\n        onLayout&#x3D;{(event) &#x3D;&gt; {\r\n          setControlsHeight(event.nativeEvent.layout.height); &#x2F;&#x2F; Set the height of the controls\r\n        }}\r\n      &#x2F;&gt;\r\n    &lt;&#x2F;Layout&gt;\r\n  );\r\n};<\/pre><\/code>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4de77c9 elementor-widget elementor-widget-text-editor\" data-id=\"4de77c9\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\tViewerLivestreamTopView.tsx\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a2d6266 elementor-widget elementor-widget-html\" data-id=\"a2d6266\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<code><pre>import React from &quot;react&quot;;\r\nimport {\r\n  FollowerCount,\r\n  LiveIndicator,\r\n  ViewerLivestreamTopViewProps,\r\n} from &quot;@stream-io&#x2F;video-react-native-sdk&quot;;\r\nimport { SViewStyle } from &quot;models&quot;;\r\nimport { View } from &quot;react-native&quot;;\r\nimport { style } from &quot;theme&quot;;\r\nimport { useSafeAreaInsets } from &quot;react-native-safe-area-context&quot;;\r\n\r\nexport const ViewerLivestreamTopView: React.FC&lt;\r\n  ViewerLivestreamTopViewProps\r\n&gt; &#x3D; ({ onLayout }) &#x3D;&gt; {\r\n  const insets &#x3D; useSafeAreaInsets(); &#x2F;&#x2F; Get safe area insets for proper padding\r\n\r\n  return (\r\n    &lt;View onLayout&#x3D;{onLayout} style&#x3D;{[$root, { paddingTop: insets.top }]}&gt;\r\n      {&#x2F;* Indicator showing the stream is live *&#x2F;}\r\n      &lt;LiveIndicator &#x2F;&gt;\r\n      {&#x2F;* Displays the number of followers watching the stream *&#x2F;}\r\n      &lt;FollowerCount &#x2F;&gt;\r\n    &lt;&#x2F;View&gt;\r\n  );\r\n};\r\n\r\nconst $root: SViewStyle &#x3D; [\r\n  style.row,\r\n  style.abs,\r\n  style.px_md,\r\n  { left: 0, top: 0, zIndex: 1 },\r\n  style.w_screenWidth,\r\n];<\/pre><\/code>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a8290a8 elementor-widget elementor-widget-text-editor\" data-id=\"a8290a8\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\tViewerLivestreamControls.tsx\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fb4f2b5 elementor-widget elementor-widget-html\" data-id=\"fb4f2b5\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<code><pre>import {\r\n  ViewerLeaveStreamButton,\r\n  ViewerLivestreamControlsProps,\r\n} from &quot;@stream-io&#x2F;video-react-native-sdk&quot;;\r\nimport { SViewStyle } from &quot;models&quot;;\r\nimport React from &quot;react&quot;;\r\nimport { View } from &quot;react-native&quot;;\r\nimport { useSafeAreaInsets } from &quot;react-native-safe-area-context&quot;;\r\nimport { spacing, style } from &quot;theme&quot;;\r\n\r\nexport const ViewerLivestreamControls: React.FC&lt;\r\n  ViewerLivestreamControlsProps\r\n&gt; &#x3D; ({ onLeaveStreamHandler, onLayout }) &#x3D;&gt; {\r\n  const insets &#x3D; useSafeAreaInsets(); &#x2F;&#x2F; Get safe area insets for bottom padding\r\n\r\n  return (\r\n    &lt;View\r\n      onLayout&#x3D;{onLayout} &#x2F;&#x2F; Handle layout changes\r\n      style&#x3D;{[$root, { paddingBottom: insets.bottom || spacing.md }]} &#x2F;&#x2F; Apply styles and padding for safe area\r\n    &gt;\r\n      {&#x2F;* Button for viewers to leave the stream *&#x2F;}\r\n      &lt;ViewerLeaveStreamButton onLeaveStreamHandler&#x3D;{onLeaveStreamHandler} &#x2F;&gt;\r\n    &lt;&#x2F;View&gt;\r\n  );\r\n};\r\n\r\nconst $root: SViewStyle &#x3D; [\r\n  style.abs,\r\n  style.bottom_0,\r\n  style.left_0,\r\n  style.right_0,\r\n  style.row,\r\n  style.px_md,\r\n  style.py_lg,\r\n];\r\n<\/pre><\/code>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-99a6fab elementor-widget elementor-widget-text-editor\" data-id=\"99a6fab\" data-element_type=\"widget\" data-settings=\"{&quot;ultimate_floating_fx_translate_y&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Conclusion, by following this guide, you can create a basic steaming app with React Native. In case, you want to build a comprehensive streaming app, I recommend you to hire a software outsourcing agency as SparkMinds. You can <a href=\"https:\/\/sparkminds.net\/contacts\/\"><span style=\"text-decoration: underline;\">contact us<\/span><\/a>, share the project details and get the quotation.\u00a0<br \/>We are always willing to sign an <a href=\"https:\/\/sparkminds.net\/non-disclosure-agreement-nda\/\"><span style=\"text-decoration: underline;\">NDA<\/span> <\/a>to save your information!<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>In the fourth industrial revolution, streaming became more popular in multiple sectors, such as entertainment, retail, and consulting services. If [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3284,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[24,47],"tags":[],"class_list":["post-3281","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-custom-web-app","category-general","no-social-count","single-post-item mb40"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Create a Streaming App with React Native and GetStream<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/sparkminds.net\/vi\/create-a-streaming-app-with-react-native-and-getstream\/\" \/>\n<meta property=\"og:locale\" content=\"vi_VN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Create a Streaming App with React Native and GetStream\" \/>\n<meta property=\"og:description\" content=\"In the fourth industrial revolution, streaming became more popular in multiple sectors, such as entertainment, retail, and consulting services. If [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sparkminds.net\/vi\/create-a-streaming-app-with-react-native-and-getstream\/\" \/>\n<meta property=\"og:site_name\" content=\"SparkMinds\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/sparkminds.jsc\" \/>\n<meta property=\"article:published_time\" content=\"2024-12-27T11:09:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-12-27T11:12:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/sparkminds.net\/wp-content\/uploads\/2024\/12\/create-a-streaming-app-scaled.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1707\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 ph\u00fat\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\/\/sparkminds.net\/#\/schema\/person\/f4769a5d0dd2b458b03580b337c920b8\"},\"headline\":\"Create a Streaming App with React Native and GetStream\",\"datePublished\":\"2024-12-27T11:09:01+00:00\",\"dateModified\":\"2024-12-27T11:12:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/\"},\"wordCount\":888,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/sparkminds.net\/#organization\"},\"image\":{\"@id\":\"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/sparkminds.net\/wp-content\/uploads\/2024\/12\/create-a-streaming-app-scaled.webp\",\"articleSection\":[\"Custom Web\/App\",\"General\"],\"inLanguage\":\"vi\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/\",\"url\":\"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/\",\"name\":\"Create a Streaming App with React Native and GetStream\",\"isPartOf\":{\"@id\":\"https:\/\/sparkminds.net\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/sparkminds.net\/wp-content\/uploads\/2024\/12\/create-a-streaming-app-scaled.webp\",\"datePublished\":\"2024-12-27T11:09:01+00:00\",\"dateModified\":\"2024-12-27T11:12:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#breadcrumb\"},\"inLanguage\":\"vi\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"vi\",\"@id\":\"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#primaryimage\",\"url\":\"https:\/\/sparkminds.net\/wp-content\/uploads\/2024\/12\/create-a-streaming-app-scaled.webp\",\"contentUrl\":\"https:\/\/sparkminds.net\/wp-content\/uploads\/2024\/12\/create-a-streaming-app-scaled.webp\",\"width\":2560,\"height\":1707},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/sparkminds.net\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a Streaming App with React Native and GetStream\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/sparkminds.net\/#website\",\"url\":\"https:\/\/sparkminds.net\/\",\"name\":\"SparkMinds\",\"description\":\"A Reliable Software Development Partner\",\"publisher\":{\"@id\":\"https:\/\/sparkminds.net\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/sparkminds.net\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"vi\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/sparkminds.net\/#organization\",\"name\":\"SparkMinds J.S.C\",\"alternateName\":\"SparkMinds\",\"url\":\"https:\/\/sparkminds.net\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"vi\",\"@id\":\"https:\/\/sparkminds.net\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/sparkminds.net\/wp-content\/uploads\/2024\/11\/sticky-logo-menu-sparkmind.png\",\"contentUrl\":\"https:\/\/sparkminds.net\/wp-content\/uploads\/2024\/11\/sticky-logo-menu-sparkmind.png\",\"width\":181,\"height\":66,\"caption\":\"SparkMinds J.S.C\"},\"image\":{\"@id\":\"https:\/\/sparkminds.net\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/sparkminds.jsc\",\"https:\/\/www.linkedin.com\/company\/sparkminds-j-s-c\/about\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/sparkminds.net\/#\/schema\/person\/f4769a5d0dd2b458b03580b337c920b8\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"vi\",\"@id\":\"https:\/\/sparkminds.net\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bdfb7783cd4581a22bc1899273891ef702c5338854739f578d2f5cb72d515f34?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bdfb7783cd4581a22bc1899273891ef702c5338854739f578d2f5cb72d515f34?s=96&d=mm&r=g\",\"caption\":\"admin\"},\"sameAs\":[\"https:\/\/sparkminds.net\"],\"url\":\"https:\/\/sparkminds.net\/vi\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Create a Streaming App with React Native and GetStream","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/sparkminds.net\/vi\/create-a-streaming-app-with-react-native-and-getstream\/","og_locale":"vi_VN","og_type":"article","og_title":"Create a Streaming App with React Native and GetStream","og_description":"In the fourth industrial revolution, streaming became more popular in multiple sectors, such as entertainment, retail, and consulting services. If [&hellip;]","og_url":"https:\/\/sparkminds.net\/vi\/create-a-streaming-app-with-react-native-and-getstream\/","og_site_name":"SparkMinds","article_publisher":"https:\/\/www.facebook.com\/sparkminds.jsc","article_published_time":"2024-12-27T11:09:01+00:00","article_modified_time":"2024-12-27T11:12:43+00:00","og_image":[{"width":2560,"height":1707,"url":"https:\/\/sparkminds.net\/wp-content\/uploads\/2024\/12\/create-a-streaming-app-scaled.webp","type":"image\/webp"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi":"admin","\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc":"4 ph\u00fat"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#article","isPartOf":{"@id":"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/"},"author":{"name":"admin","@id":"https:\/\/sparkminds.net\/#\/schema\/person\/f4769a5d0dd2b458b03580b337c920b8"},"headline":"Create a Streaming App with React Native and GetStream","datePublished":"2024-12-27T11:09:01+00:00","dateModified":"2024-12-27T11:12:43+00:00","mainEntityOfPage":{"@id":"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/"},"wordCount":888,"commentCount":0,"publisher":{"@id":"https:\/\/sparkminds.net\/#organization"},"image":{"@id":"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#primaryimage"},"thumbnailUrl":"https:\/\/sparkminds.net\/wp-content\/uploads\/2024\/12\/create-a-streaming-app-scaled.webp","articleSection":["Custom Web\/App","General"],"inLanguage":"vi","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/","url":"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/","name":"Create a Streaming App with React Native and GetStream","isPartOf":{"@id":"https:\/\/sparkminds.net\/#website"},"primaryImageOfPage":{"@id":"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#primaryimage"},"image":{"@id":"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#primaryimage"},"thumbnailUrl":"https:\/\/sparkminds.net\/wp-content\/uploads\/2024\/12\/create-a-streaming-app-scaled.webp","datePublished":"2024-12-27T11:09:01+00:00","dateModified":"2024-12-27T11:12:43+00:00","breadcrumb":{"@id":"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#breadcrumb"},"inLanguage":"vi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/"]}]},{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#primaryimage","url":"https:\/\/sparkminds.net\/wp-content\/uploads\/2024\/12\/create-a-streaming-app-scaled.webp","contentUrl":"https:\/\/sparkminds.net\/wp-content\/uploads\/2024\/12\/create-a-streaming-app-scaled.webp","width":2560,"height":1707},{"@type":"BreadcrumbList","@id":"https:\/\/sparkminds.net\/create-a-streaming-app-with-react-native-and-getstream\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sparkminds.net\/"},{"@type":"ListItem","position":2,"name":"Create a Streaming App with React Native and GetStream"}]},{"@type":"WebSite","@id":"https:\/\/sparkminds.net\/#website","url":"https:\/\/sparkminds.net\/","name":"SparkMinds","description":"A Reliable Software Development Partner","publisher":{"@id":"https:\/\/sparkminds.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sparkminds.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"vi"},{"@type":"Organization","@id":"https:\/\/sparkminds.net\/#organization","name":"SparkMinds J.S.C","alternateName":"SparkMinds","url":"https:\/\/sparkminds.net\/","logo":{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/sparkminds.net\/#\/schema\/logo\/image\/","url":"https:\/\/sparkminds.net\/wp-content\/uploads\/2024\/11\/sticky-logo-menu-sparkmind.png","contentUrl":"https:\/\/sparkminds.net\/wp-content\/uploads\/2024\/11\/sticky-logo-menu-sparkmind.png","width":181,"height":66,"caption":"SparkMinds J.S.C"},"image":{"@id":"https:\/\/sparkminds.net\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/sparkminds.jsc","https:\/\/www.linkedin.com\/company\/sparkminds-j-s-c\/about\/"]},{"@type":"Person","@id":"https:\/\/sparkminds.net\/#\/schema\/person\/f4769a5d0dd2b458b03580b337c920b8","name":"admin","image":{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/sparkminds.net\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/bdfb7783cd4581a22bc1899273891ef702c5338854739f578d2f5cb72d515f34?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bdfb7783cd4581a22bc1899273891ef702c5338854739f578d2f5cb72d515f34?s=96&d=mm&r=g","caption":"admin"},"sameAs":["https:\/\/sparkminds.net"],"url":"https:\/\/sparkminds.net\/vi\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/sparkminds.net\/vi\/wp-json\/wp\/v2\/posts\/3281","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sparkminds.net\/vi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sparkminds.net\/vi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sparkminds.net\/vi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sparkminds.net\/vi\/wp-json\/wp\/v2\/comments?post=3281"}],"version-history":[{"count":5,"href":"https:\/\/sparkminds.net\/vi\/wp-json\/wp\/v2\/posts\/3281\/revisions"}],"predecessor-version":[{"id":3314,"href":"https:\/\/sparkminds.net\/vi\/wp-json\/wp\/v2\/posts\/3281\/revisions\/3314"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sparkminds.net\/vi\/wp-json\/wp\/v2\/media\/3284"}],"wp:attachment":[{"href":"https:\/\/sparkminds.net\/vi\/wp-json\/wp\/v2\/media?parent=3281"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sparkminds.net\/vi\/wp-json\/wp\/v2\/categories?post=3281"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sparkminds.net\/vi\/wp-json\/wp\/v2\/tags?post=3281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}