# React Native

Installation and usage of our React Native SDK is simple and involves the following steps:

### Prerequisites

First things first, make sure you have set up the development environment for React Native.
You can find the official guide [here](https://reactnative.dev/docs/environment-setup).

## SDK Installation

To install the Stream Video React Native SDK, run the following command in your terminal of choice:

```bash title=Terminal
yarn add @stream-io/video-react-native-sdk
```

Stream 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:

```bash title=Terminal
yarn add @stream-io/react-native-webrtc \
   react-native-incall-manager \
   react-native-svg \
   @react-native-community/netinfo

npx pod-install
```

So what did we install precisely?

- `@stream-io/video-react-native-sdk` (SVRN) is Stream's Video SDK which contains UI components, hooks and util functions that will enable audio/video calls.
- `@stream-io/react-native-webrtc` is a WebRTC module for React Native, SVRN depends on this dependency, it's components and utilities to render audio/video tracks and interact with the phone's media devices.
- `react-native-incall-manager` handles media-routes/sensors/events during an audio/video call.
- `react-native-svg` provides SVG support to React Native, SVRN's components and it's icons are reliant on this dependency.
- `@react-native-community/netinfo` - is used to detect the device's connectivity state, type and quality.

<admonition type="info">

Starting from version `125.3.0` version of `@stream-io/react-native-webrtc`, only React Native version `0.73` and above is supported. If you are on an older react native version than `0.73`, please use `125.2.1` version of `@stream-io/react-native-webrtc`.

</admonition>

### Android Specific installation

#### Update the minSdk version if necessary

If the minSdkVersion is less than 24 in your app, please update it to 24. In `android/build.gradle` add the following inside the `buildscript` section:

```java
buildscript {
    ext {
        ...
        minSdkVersion = 24
    }
    ...
}
```

#### Enable Java 8 Support

In `android/app/build.gradle` add the following inside the `android` section:

```java
compileOptions {
	sourceCompatibility JavaVersion.VERSION_1_8
	targetCompatibility JavaVersion.VERSION_11
}
```

#### Optional: R8/ProGuard Support

If you require R8/ProGuard support then in `android/app/proguard-rules.pro` add the following on a new line:

```plaintext
-keep class org.webrtc.** { *; }
```

### Declaring Permissions

Making video or audio calls requires the usage of the device's camera and microphone accordingly. In both platforms, we must declare the permissions.

#### iOS

Add the following keys and values to `Info.plist` file at a minimum:

- `Privacy - Camera Usage Description` - "`{'<Your_app_name>'}` requires camera access to capture and transmit video"
- `Privacy - Microphone Usage Description` - "`{'<Your_app_name>'}` requires microphone access to capture and transmit audio"

<admonition type="note">

You should replace `{'<Your_app_name>'}` (or also use your custom strings instead).

</admonition>

#### Android

In `AndroidManifest.xml` add the following permissions before the `<application>` section.

```xml
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-feature android:name="android.hardware.audio.output" />
<uses-feature android:name="android.hardware.microphone" />

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />.
```

If you plan to also support Bluetooth devices then also add the following.

```xml
<uses-feature android:name="android.hardware.bluetooth" android:required="false"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>

<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
```

<admonition type="info">

Permissions need to be granted by the user as well. Requests for Camera and Microphone usage are automatically asked when the stream is first requested by the app. But other permissions like `BLUETOOTH_CONNECT` in Android need to be requested manually. However, we recommend that all necessary permissions be manually asked at an appropriate place in your app for the best user experience.

We recommend the usage of [`react-native-permissions`](https://github.com/zoontek/react-native-permissions) library to request permissions in the app.

</admonition>

### Run on device

#### iOS

In iOS simulators, recording audio or video is not supported. So always test your app on an actual device for the best experience.

#### Android

In Android emulators, a static video stream can be sent and so it can be used for testing. However, we recommend that you always test your app on an actual device for the best experience.

## New Architecture (Fabric)

The SDK's native modules and views are compatible with the [New Architecture](https://reactnative.dev/docs/the-new-architecture/landing-page) and [Bridgeless mode](https://github.com/reactwg/react-native-new-architecture/discussions/154) through the **New Renderer Interop Layers**. These layers are [automatically enabled](https://github.com/reactwg/react-native-new-architecture/discussions/175) when you turn on the New Architecture in React Native 0.74 and above. We recommend that you use React Native 0.74+ if you are using the New Architecture with the SDK.

## Troubleshooting

### GestureDetector must be used as a descendant of GestureHandlerRootView

Our SDK uses `react-native-gesture-handler` library if it has been installed for smooth gestures. To fix this error, wrap your entry point with <GestureHandlerRootView> or gestureHandlerRootHOC.

For example:

```tsx
import { GestureHandlerRootView } from "react-native-gesture-handler";

export default function App() {
  return <GestureHandlerRootView>{/* content */}</GestureHandlerRootView>;
}
```

### Error: Super expression must either be null or a function

This was a [known issue](https://github.com/react-native-webrtc/react-native-webrtc/issues/1503) in `@stream-io/react-native-webrtc` library.

It has been fixed on version `118.1.0` of the `@stream-io/react-native-webrtc` library.

### Android Only Error: Could not find any matches for app.notifee:core:+ as no versions of app.notifee:core are available

This occurs on projects with a monorepo configuration. Notifee is unable to find the compiled AAR android library. You can do the following workaround in your `android/build.gradle` to mitigate this:

```ts
allprojects {
  repositories {
    maven { url "$rootDir/../../../node_modules/@notifee/react-native/android/libs" }
  }
}
```

This will add the Notifee library to the list of repositories that Gradle will search for dependencies. Please note that the exact path will vary depending on your project's structure.

**Reference**: <https://github.com/invertase/notifee/issues/808>

### Android Only Error: One of receiver_exported or receiver_not_exported

This was a [known issue](https://github.com/react-native-webrtc/react-native-incall-manager/issues/235) in `react-native-incall-manager` library.

It has been fixed on version `4.2.0` of the `react-native-incall-manager` library.

---

This page was last updated at 2025-08-15T14:16:44.387Z.

For the most recent version of this documentation, visit [https://getstream.io/video/docs/react-native/setup/installation/react-native/](https://getstream.io/video/docs/react-native/setup/installation/react-native/).