Stay organized with collectionsSave and categorize content based on your preferences.
Contact Center AI Platform (CCAI Platform) provides integration with mobile applications using a
number of methods including React. This document explains how to integrate React
Native for Android.
Before following these Android-specific instructions, complete the instructions atReact Native for Mobile SDK.
Integrate the SDK into Android
To integrate the SDK into Android, follow these steps:
Add the following code inside<application>of theAndroidManifest.xmlfile:
importandroid.util.Logimportco.ujet.android.Ujetimportcom.google.firebase.messaging.FirebaseMessagingServiceimportcom.google.firebase.messaging.RemoteMessageclassMyFirebaseMessagingService:FirebaseMessagingService(){privatevarfirebaseTokenManager:FirebaseTokenManager?=nulloverridefunonCreate(){super.onCreate()firebaseTokenManager=FirebaseTokenManager(this)}overridefunonNewToken(token:String){firebaseTokenManager?.updateToken(token)}overridefunonMessageReceived(message:RemoteMessage){if(Ujet.canHandlePush(message.data)){Log.d("Firebase","Handle the push message by UJET")}else{// Handle your notifications}}}
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-09-04 UTC."],[[["\u003cp\u003eThis document details how to integrate the Contact Center AI Platform (CCAI Platform) with React Native for Android applications.\u003c/p\u003e\n"],["\u003cp\u003eIntegrating the SDK into Android involves modifying \u003ccode\u003eAndroidManifest.xml\u003c/code\u003e, \u003ccode\u003ebuild.gradle\u003c/code\u003e files, and \u003ccode\u003estrings.xml\u003c/code\u003e to include necessary configurations and dependencies.\u003c/p\u003e\n"],["\u003cp\u003eRegistering the module requires updating the \u003ccode\u003egetPackages\u003c/code\u003e function in \u003ccode\u003eReactApplication\u003c/code\u003e and creating \u003ccode\u003eMyAppPackage\u003c/code\u003e to include \u003ccode\u003eUJETModule\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eImplementing the \u003ccode\u003eUjetRequestListener\u003c/code\u003e and \u003ccode\u003eReactInstanceEventListener\u003c/code\u003e in your application is necessary to handle callback events and requests from the Ujet SDK.\u003c/p\u003e\n"],["\u003cp\u003eSetting up push notifications involves creating \u003ccode\u003eMyFirebaseMessagingService\u003c/code\u003e, updating \u003ccode\u003eAndroidManifest.xml\u003c/code\u003e, creating \u003ccode\u003eFirebaseTokenManager\u003c/code\u003e, and making changes to several \u003ccode\u003ebuild.gradle\u003c/code\u003e files, along with initializing Firebase in \u003ccode\u003eApplication.onCreate\u003c/code\u003e.\u003c/p\u003e\n"]]],[],null,["# React Native for Android\n\nContact Center AI Platform (CCAI Platform) provides integration with mobile applications using a\nnumber of methods including React. This document explains how to integrate React\nNative for Android.\n\nBefore following these Android-specific instructions, complete the instructions at [React Native for Mobile SDK](/contact-center/ccai-platform/docs/mobileSDK-overview#mobile-sdk-react).\n\nIntegrate the SDK into Android\n------------------------------\n\nTo integrate the SDK into Android, follow these steps:\n\n1. Add the following code inside `\u003capplication\u003e` of the\n `AndroidManifest.xml` file:\n\n \u003capplication\u003e\n \u003cactivity\n android:name=\"co.ujet.android.activity.UjetActivity\"\n android:exported=\"true\"\u003e\n \u003cintent-filter\u003e\n \u003caction android:name=\"android.intent.action.VIEW\"/\u003e\n \u003ccategory android:name=\"android.intent.category.DEF```AULT\"/\u003e\n \u003ccategory android:name=\"android.intent.category.BROWSABLE\"/\u003e\n \u003cdata\n android:host=\"com.sampleapp\"\n android:path=\"/smartchannel\"\n android:scheme=\"ujet\" /\u003e\n \u003c/intent-filter\u003e\n \u003c/activity\u003e\n\n \u003cmeta-data\n android:name=\"co.ujet.android.companyKey\"\n android:value=\"@string/ujet_company_key\"/\u003e\n \u003cmeta-data\n android:name=\"co.ujet.android.companyName\"\n android:value=\"@string/ujet_company_name\"/\u003e\n \u003cmeta-data\n android:name=\"co.ujet.android.subdomain\"\n android:value=\"@string/ujet_subdomain\"/\u003e\n \u003cmeta-data\n android:name=\"co.ujet.android.companyUrl\"\n android:value=\"@string/ujet_company_url\"/\u003e\n \u003c/application\u003e\n\n2. Update `android/build.gradle`.\n\n allprojects {\n repositories {\n google()\n mavenCentral()\n maven {\n url \"https://sdk.ujet.co/android/\"\n }\n }\n }\n\n3. Update `android/app/build.gradle`.\n\n def ujetSdkVersion = \"x.y.z\"\n implementation \"co.ujet.android:ujet-android:$ujetSdkVersion\"\n implementation \"co.ujet.android:cobrowse:$ujetSdkVersion\"\n }\n\n4. Run `res/values/strings.xml`.\n\n \u003cresources\u003e\n \u003cstring name=\"ujet_company_key\"\u003eYOUR_COMPANY_KEY\u003c/string\u003e\n \u003cstring name=\"ujet_company_name\"\u003eYOUR_COMPANY_NAME\u003c/string\u003e\n\n \u003c!-- If your tenant / portal url ends with \"ujet.co\" then set ujet_subdomain string only (ignore\n ujet_company_url), otherwise set ujet_company_url only (ignore ujet_subdomain) following below instructions. --\u003e\n \u003c!-- To get subdomain, extract string content between 'https://' and first '.' of your tenant/portal URL. \n Example, If your tenant url is https://XXX.YYY.ZZZ/ then subdomain will be XXX --\u003e\n \u003cstring name=\"ujet_subdomain\"\u003eYOUR_SUBDOMAIN\u003c/string\u003e\n\n \u003c!-- Use tenant url as company url here, it should be in format of https://XXX.YYY.ZZZ/api/v2\n (here XXX should match with your subdomain) --\u003e\n \u003cstring name=\"ujet_company_url\"\u003eYOUR_COMPANY_URL\u003c/string\u003e\n \u003c/resources\u003e\n\n5. Download the `google-service.json` file and put it inside of your project\n at the following location: `/android/app/google-services.json`\n\nRegister the module\n-------------------\n\nFor more information about registering modules, see [Register the Module\n(Android Specific)](https://reactnative.dev/docs/native-modules-android#register-the-module-android-specific).\n\n1. Open ReactApplication and update the `getPackages` function.\n\n override fun getPackages(): List\u003cReactPackage\u003e {\n return PackageList(this).packages.apply {\n add(MyAppPackage())\n }\n }\n\n2. Create `MyAppPackage`.\n\n import android.view.View\n import com.facebook.react.ReactPackage\n import com.facebook.react.bridge.NativeModule\n import com.facebook.react.bridge.ReactApplicationContext\n import com.facebook.react.uimanager.ReactShadowNode\n import com.facebook.react.uimanager.ViewManager\n\n class MyAppPackage: ReactPackage {\n override fun createViewManagers(\n reactContext: ReactApplicationContext\n ): MutableList\u003cViewManager\u003cView, ReactShadowNode\u003c*\u003e\u003e\u003e = mutableListOf()\n\n override fun createNativeModules(\n reactContext: ReactApplicationContext\n ): MutableList\u003cNativeModule\u003e = listOf(\n UJETModule(reactContext)\n ).toMutableList()\n }\n\n| **Note:** If you already implemented ReactPackage, then add `UJETModule` in the `createNativeModules` function.\n\nImplement Callback\n------------------\n\nImplement `UjetRequestListener` and `ReactInstanceEventListener` from your application. \n\n class YourApplication: Application(), ReactApplication, UjetRequestListener, ReactInstanceEventListener {\n private var reactContext: ReactContext? = null\n\n override fun onCreate() {\n super.onCreate()\n\n Ujet.init(this)\n\n reactNativeHost.reactInstanceManager.addReactInstanceEventListener(this)\n }\n\n override fun onReactContextInitialized(reactContext: ReactContext?) {\n this.reactContext = reactContext\n }\n\n override fun onSignPayloadRequest(\n payload: MutableMap\u003cString, Any?\u003e,\n ujetPayloadType: UjetPayloadType,\n callback: UjetTokenCallback\n ) {\n if (reactContext == null) {\n callback.onError()\n return\n }\n\n when (ujetPayloadType) {\n UjetPayloadType.AuthToken -\u003e {\n UJETModule.authTokenCallback = callback\n createMapAndSendEvent(\"authToken\", payload)\n }\n UjetPayloadType.CustomData -\u003e {\n UJETModule.customDataCallback = callback\n createMapAndSendEvent(\"customData\", payload)\n }\n else -\u003e callback.onError()\n }\n }\n\n override fun onRequestPushToken(): String? {\n sendEvent(reactContext ?: return, \"onRequestAndroidPushToken\", null)\n }\n\n private fun sendEvent(reactContext: ReactContext, eventName: String, params: WritableMap?) {\n reactContext\n .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)\n .emit(eventName, params)\n }\n\n private fun createMapAndSendEvent(typeName: String, payload: Map\u003cString, Any?\u003e) {\n val writableMap = Arguments.createMap()\n for ((key, value) in payload) {\n writableMap.putString(key, value.toString())\n }\n\n val params = Arguments.createMap()\n params.putString(\"type\", typeName)\n params.putMap(\"data\", writableMap)\n sendEvent(reactContext ?: return, \"onSignPayloadRequest\", params)\n }\n }\n\nSet up push notifications\n-------------------------\n\nTo integrate push notifications natively, follow these steps:\n\n1. Create `MyFirebaseMessagingService` that implements\n `FirebaseMessagingService`.\n\n import android.util.Log\n import co.ujet.android.Ujet\n import com.google.firebase.messaging.FirebaseMessagingService\n import com.google.firebase.messaging.RemoteMessage\n\n class MyFirebaseMessagingService: FirebaseMessagingService() {\n private var firebaseTokenManager: FirebaseTokenManager? = null\n\n override fun onCreate() {\n super.onCreate()\n firebaseTokenManager = FirebaseTokenManager(this)\n }\n\n override fun onNewToken(token: String) {\n firebaseTokenManager?.updateToken(token)\n }\n\n override fun onMessageReceived(message: RemoteMessage) {\n if (Ujet.canHandlePush(message.data)) {\n Log.d(\"Firebase\", \"Handle the push message by UJET\")\n } else {\n // Handle your notifications\n }\n }\n }\n\n2. Update `AndroidManifest.xml`.\n\n \u003capplication\u003e\n \u003cservice\n android:name=\".firebase.MyFirebaseMessagingService\"\n android:exported=\"false\"\u003e\n \u003cintent-filter\u003e\n \u003caction android:name=\"com.google.firebase.MESSAGING_EVENT\" /\u003e\n \u003c/intent-filter\u003e\n \u003c/service\u003e\n \u003c/application\u003e\n\n3. Create `FirebaseTokenManager`.\n\n import android.content.Context\n import com.google.android.gms.tasks.Task\n import com.google.firebase.messaging.FirebaseMessaging\n\n class FirebaseTokenManager(context: Context) {\n private val sharedPreferences = context.getSharedPreferences(\"${context.packageName}_preferences\", Context.MODE_PRIVATE)\n private var token: String? = null\n\n fun getToken(): String? {\n token = sharedPreferences.getString(\"firebaseToken\", null)\n if (token == null) {\n FirebaseMessaging.getInstance().token.addOnCompleteListener { task: Task\u003cString?\u003e -\u003e\n if (!task.isSuccessful || task.result == null) {\n return@addOnCompleteListener\n }\n token = task.result\n updateToken(token)\n }\n }\n return token\n }\n\n fun updateToken(token: String?) {\n sharedPreferences\n .edit()\n .putString(\"firebaseToken\", token)\n .apply()\n }\n }\n\n4. Update `android/build.gradle`.\n\n buildscript {\n dependencies {\n classpath(\"com.google.gms:google-services:4.4.1\")\n }\n }\n\n5. Update `android/app/build.gradle`.\n\n apply plugin: 'com.google.gms.google-services'\n\n dependencies {\n implementation platform(\"com.google.firebase:firebase-bom:32.7.3\")\n implementation 'com.google.firebase:firebase-messaging'\n }\n\n6. Initialize Firebase in `Application.onCreate`.\n\n class YourApplication: Application(), ReactApplication {\n override fun onCreate() {\n super.onCreate()\n\n firebaseTokenManager = FirebaseTokenManager(this)\n }\n }"]]