Guide du SDK Android

Cette page explique comment utiliser le SDK Android.

Accéder à l'application exemple

Pour télécharger l'application exemple Android, cliquez sur Application exemple Android.

Pour créer une application exemple à l'aide du SDK Mobile pour Android, vous avez besoin des éléments suivants :

  • Clé et secret de l'entreprise sur le portail CCAI Platform.

  • Android 5.0 (niveau d'API 21, Lollipop) ou version ultérieure.

  • Firebase Cloud Messaging ou Google Cloud Messaging pour la notification push.

  • L'application a été migrée vers AndroidX.

Exigences de mise à niveau du SDK Twilio

Le SDK Twilio doit suivre des versions spécifiques si le SDK Android est intégré directement à l'aide de notre package. Sinon, vous pouvez ignorer cette étape.

// Twilio VoIP SDK
api 'com.twilio:voice-android:6.1.1'
// Twilio Conversations SDK
api 'com.twilio:conversations-android:3.1.0'

De plus, des règles ProGuard sont déjà incluses dans le SDK Android pour s'assurer que la bibliothèque Twilio Programmable Voice n'est pas supprimée par ProGuard et peut être utilisée pour résoudre les problèmes si ProGuard supprime accidentellement la bibliothèque.

-keep class com.twilio.** { *; }
-keep class tvo.webrtc.** { *; }
-dontwarn tvo.webrtc.**
-keep class com.twilio.voice.** { *; }
-keepattributes InnerClasses

Pour prendre en charge les dernières versions de Twilio, à partir de la version 0.34.0 du SDK Android, le SDK n'est plus compatible au niveau binaire avec les applications ciblant Java 7. Pour utiliser cette version et les versions ultérieures, les développeurs doivent mettre à niveau leurs applications pour cibler Java 8. Consultez l'exemple de code suivant :

android {
    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
}

Obtenir la clé et le code secret de l'entreprise

  1. Connectez-vous au portail d'administration à l'aide des identifiants administrateur.

  2. Accédez à Paramètres > Paramètres pour les développeurs > Clé et code secret de l'entreprise.

  3. Récupérez la clé de l'entreprise et le code secret de l'entreprise.

Installation

Ajoutez le dépôt du SDK Android à votre paramètre Gradle pour le projet racine.

build.gradle (Projet)

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            url "https://sdk.ujet.co/android/"
        }
    }
}

build.gradle (module: app)

dependencies {
    // Replace x.y.z with latest version of CCAI Platform SDK
    def ujetSdkVersion = "x.y.z"
    implementation "co.ujet.android:ujet-android:$ujetSdkVersion"

    // CCAI Platform supports co-browse for Web SDK version 0.46.0 or
    // higher.
    // To use co-browse, declare the following dependency.
    implementation "co.ujet.android:cobrowse:$ujetVersion"
}

Configurer les paramètres de l'entreprise

Saisissez les paramètres de votre entreprise en tant que métadonnées dans le fichier AndroidManifest.xml.

AndroidManifest.xml

<application>
    // ...
    <!-- Company Settings -->
    <meta-data android:name="co.ujet.android.subdomain" android:value="@string/ujet_subdomain"/>
    <meta-data android:name="co.ujet.android.companyKey" android:value="@string/ujet_company_key"/>
    <meta-data android:name="co.ujet.android.companyName" android:value="@string/ujet_company_name"/>
    // ...
</application>

strings.xml

<resources>
    <string name="ujet_subdomain">YOUR_SUBDOMAIN</string>
    <string name="ujet_company_key">YOUR_COMPANY_KEY</string>
    <string name="ujet_company_name">YOUR_COMPANY_NAME</string>
</resources>

Signature JWT

Pour des raisons de sécurité, les informations de l'utilisateur final doivent être signées en tant que JWT sur votre serveur.

L'application exemple contient APIManager pour les tests. Vous devez placer UJET_COMPANY_SECRET dans mock/APIManager.java. APIManager doit implémenter une méthode qui lance un appel asynchrone pour signer le jeton d'authentification JWT qui renvoie le jeton.

En production, vous devez implémenter le processus de signature sur votre serveur.

public class APIManager {
    public static final String UJET_COMPANY_SECRET = "Please input your UJET_COMPANY_SECRET from Ujet developer admin page";
    // ...
}

Initialiser le SDK

Initialisez le SDK dans la méthode onCreate de la classe d'application Android.

public class ExampleApplication extends Application implements UjetRequestListener {
    @Override
    public void onCreate() {
        super.onCreate();

        Ujet.init(this);
    }
    // ...
}

Authentification de l'utilisateur final

L'utilisateur final est le consommateur qui contacte votre équipe d'assistance client via l'application.

Pour authentifier l'utilisateur final dans l'application, nous introduisons un mécanisme de signature JWT.

Le SDK Android demande de signer la charge utile lorsqu'une authentification est nécessaire. Si la signature réussit, l'application échange le jeton JWT signé contre le jeton d'authentification de l'utilisateur final.

Dans ExampleApplication, vous devez implémenter l'interface UjetRequestListener pour la signature du jeton d'authentification et pour les données personnalisées.

public class ExampleApplication extends Application implements UjetRequestListener {
    @Override
    public void onCreate() {
        super.onCreate();

        Ujet.init(this);
    }

    @Override
    public void onSignPayloadRequest(Map<String, Object> payload, UjetPayloadType ujetPayloadType, UjetTokenCallback tokenCallback) {
        if (ujetPayloadType == UjetPayloadType.AuthToken) {

            // In production, you should implement this on your server.

            // The server must implement a method that initiates an asynchronous call
to sign and return a JWT auth token.
            APIManager.getHttpManager()
                .getAuthToken(payload, UjetPayloadType.AuthToken, new UjetTokenCallback() {
                    @Override
                    public void onSuccess(@Nullable final String authToken) {
                        tokenCallback.onToken(authToken);
                    }

                    @Override
                    public void onFailure(@Nullable final String authToken) {
                        tokenCallback.onError();
                    }
                });
        }
    }
}

Pour en savoir plus, consultez la section Authentification des utilisateurs finaux.

Configurer les notifications push

Cette section explique comment activer les notifications push sur mobile.

Préparer Firebase

Préparez un projet Firebase.

Si vous avez déjà votre projet, vous pouvez utiliser le vôtre et ignorer ce processus.

  1. Créez un projet Firebase dans la console Firebase.

  2. Téléchargez le fichier google-services.json depuis Paramètres > GÉNÉRAL dans la console Firebase.

  1. Obtenez la clé de serveur dans Paramètres > CLOUD MESSAGING de la console Firebase.

Ajouter une clé de compte de service

Vous devez ajouter une clé de compte de service à votre application mobile pour recevoir des notifications push. Pour obtenir une clé de compte de service, consultez S'authentifier avec un compte de service.

Pour ajouter une clé de compte de service à votre application mobile, procédez comme suit :

  1. Dans le portail CCAI Platform, cliquez sur Settings > Developer Settings (Paramètres > Paramètres pour les développeurs). Si le menu Paramètres ne s'affiche pas, cliquez sur  Menu.

  2. Accédez au volet Applications mobiles.

  3. Cliquez sur Modifier à côté de votre application. La boîte de dialogue Modifier l'application mobile s'affiche.

  4. Dans le champ Compte de service, saisissez la clé de votre compte de service, puis cliquez sur Enregistrer.

Configurer le client Android

  1. Copiez google-services.json dans le répertoire de votre application, par exemple PROJECT_ROOT/app/google-services.json.

  2. Obtenez le jeton FCM à l'aide du code suivant :

    FirebaseMessaging.getInstance().getToken()
        .addOnCompleteListener(task -> {
            if (!task.isSuccessful() || task.getResult() == null) {
                Log.w("FCM", "Couldn't get FCM token");
                return;
            }
    
            String token = task.getResult();
            Log.i("FCM", "FCM token: " + token);
        });
    

    FirebaseMessagingService est appelé, ce qui est enregistré dans le fichier manifeste si le jeton est actualisé. Pour en savoir plus, consultez Configurer une application cliente Firebase Cloud Messaging sur Android.

    public class YourFirebaseMessagingService extends FirebaseMessagingService {
       /**
           * There are two scenarios when onNewToken is called:
           * 1) When a new token is generated on initial app startup
           * 2) Whenever an existing token is changed
           * Under #2, there are three scenarios when the existing token is changed:
           * A) App is restored to a new device
           * B) User uninstalls/re-installs the app
           * C) User clears app data
           */
       @Override
       public void onNewToken(String token) {
           Log.i("FCM", "FCM token updated: " + token);
       }
    }
    
  3. Implémentez UjetRequestListener.onRequestPushToken dans votre classe Application. UjetRequestListener.onRequestPushToken doit renvoyer le jeton FCM/GCM.

    public class YourApplication extends Application implements UjetRequestListener {
        /**
            * Return your FCM/GCM token
            */
        @Override
        public String onRequestPushToken() {
            return yourToken(); // As shown in the previous step, you can get your token using FirebaseMessaging.getInstance().getToken().addOnCompleteListener(task -> { })
        }
    }
    
  4. Gérez la notification push. Si vous souhaitez que Contact Center AI Platform (CCAI Platform) gère le traitement de ses propres messages push, vous pouvez transmettre les données directement à UjetPushHandler.handle().

    • L'application ne traite que les messages dont le champ ujet_noti_type (ou noti_type, pour la rétrocompatibilité) est défini.

    • Sinon, vous pouvez choisir de n'envoyer que les messages avec ujet_noti_type à UjetPushHandler.handle() pour traitement.

    Voici un exemple de message de notification push :

    {
        "call_id"           : 12345,
        "ujet_noti_type"    : "connect_call",
        "noti_type"         : "connect_call",
        "call_type"         : "ScheduledCall",
        "fail_reason"       : "none",
        "fail_details"      : "none"
    }
    

Gérer les messages FCM

public class YourFirebaseMessagingService extends FirebaseMessagingService {
    private UjetPushHandler ujetPushHandler;

    @Override
    public void onCreate() {
        super.onCreate();
        this.ujetPushHandler = new UjetPushHandler(this);
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if (ujetPushHandler.handle(remoteMessage)) {
            // Handled by CCAI Platform

        } else {
            // Handle your push notification message in here
        }
    }
}

Gérer un message GCM

public class YourGcmListenerService extends GcmListenerService {
    private UjetPushHandler ujetPushHandler;

    @Override
    public void onCreate() {
        super.onCreate();
        this.ujetPushHandler = new UjetPushHandler(this);
    }

    @Override
    public void onMessageReceived(String s, Bundle bundle) {
        if (ujetPushHandler.handle(bundle)) {
            // Handled by CCAI Platform

        } else {
            // Handle your message
        }
    }
}

Gérer les messages GCM dans GcmReceiver (ancienne méthode)

public class YourGcmReceiver extends WakefulBroadcastReceiver {
    private UjetPushHandler ujetPushHandler;

    @Override
    public void onReceive(Context context, Intent intent) {
        ujetPushHandler = new UjetPushHandler(context);
        if (ujetPushHandler.handle(intent.getExtras())) {
            // Handled by CCAI Platform

        } else {
            // Handle your message
        }
    }
}

Démarrer l'application

Ajoutez la ligne suivante à l'endroit où vous souhaitez démarrer l'application (sans aucun paramètre) :

Ujet.start(new UjetStartOptions.Builder().build());

Vous pouvez également démarrer le SDK Android sans l'écran de démarrage.

UjetStartOptions ujetStartOptions = new UjetStartOptions.Builder()
        .setSkipSplashEnabled(true)
        .build();

Ujet.start(ujetStartOptions);

Vous pouvez également démarrer le SDK Android à partir d'un point spécifique du menu avec cette clé à l'aide d'un point d'accès direct :

String menuKey = "MENU_KEY";
UjetStartOptions ujetStartOptions = new UjetStartOptions.Builder()
        .setMenuKey(menuKey)
        .build();

Ujet.start(ujetStartOptions);

Le menuKey peut être créé avec un point d'accès direct dans le portail CCAI Platform (avec le rôle d'administrateur).

  1. Accédez à Paramètres > File d'attente.

  2. Sélectionnez une file d'attente dans la structure du menu.

  3. Cochez Créer un point d'accès direct.

  4. Saisissez la clé dans le formulaire de texte.

  5. Cliquez sur Enregistrer.

Vous pouvez également démarrer le SDK Android avec un ID de ticket spécifique pour le transmettre au CRM. Cet ID de demande sera ouvert lorsqu'une discussion ou un appel seront établis.

String ticketId = "TICKET_ID";
UjetStartOptions ujetStartOptions = new UjetStartOptions.Builder()
        .setTicketId(ticketId)
        .build();

Ujet.start(ujetStartOptions);

Envoyer des données personnalisées à votre CRM

Des données personnalisées peuvent être envoyées aux agents du service client et s'afficheront dans la demande d'assistance pour l'appel ou le chat entrants.

Il existe deux méthodes pour envoyer des données personnalisées :

  • Méthode signée : signature de données prédéfinie avec JWT.

  • Méthode non signée : données prédéfinies avec un code JSON brut (non recommandé).

Utiliser la méthode signée pour envoyer des données personnalisées

Pour envoyer des données personnalisées à l'aide de la méthode signée, implémentez une méthode de signature.

Commencez par récupérer les données personnalisées dans votre application hôte, puis envoyez-les à votre serveur pour signature. Sur votre serveur, vous pouvez ajouter des données supplémentaires à l'aide d'un formulaire défini. Signez-les avec le code secret de votre entreprise, puis renvoyez-les par JWT.

public class ExampleApplication extends Application implements UjetRequestListener {
    @Override
    public void onCreate() {
        super.onCreate();

        Ujet.init(this);
    }

    @Override
    public void onSignPayloadRequest(Map<String, Object> payload, UjetPayloadType ujetPayloadType, UjetTokenCallback tokenCallback) {
        // ...
        if (ujetPayloadType == UjetPayloadType.CustomData) {
            /**
                * These codes are for providing signed custom data.
                * Add some data from app, and add more sensitive data from server and sign it.
                */
            UjetCustomData appCustomData = new UjetCustomData();
            appCustomData.put("model", "Model", "MODEL1234");
            appCustomData.put("customer_id", "Customer ID", 12345);
            appCustomData.put("temperature", "Temperature", 70.5f);
            appCustomData.put("purchase_date", "Purchase Date", new Date());
            appCustomData.put("battery", "Battery", "52%");
            appCustomData.put("location", "Location", "San Francisco, CA, United States");
            appCustomData.putURL("dashboard_url", "Dashboard URL", "https://internal.dashboard.com/12345");

            payload.put("custom_data", appCustomData.getData());

            tokenCallback.onToken(APIManager.getHttpManager().getSignedCustomData(payload));
        }
        // ...
    }
}

Utiliser une méthode non signée pour envoyer des données personnalisées

Google vous recommande d'utiliser la méthode signée pour envoyer des données personnalisées dans votre application. Pour en savoir plus, consultez Utiliser la méthode signée pour envoyer des données personnalisées.

Vous pouvez envoyer des données non signées en démarrant le SDK Android avec des options de démarrage pour définir des données personnalisées à l'aide de UjetStartOptions.Builder#setUnsignedCustomData et UjetTokenCallback doit appeler onToken(null).

HashMap<String, Object> jsonData = new HashMap<>();
// Convert json string into hashmap object and store it in jsonData
UjetCustomData customData = new UjetCustomData();
customData.putObject("external_chat_transfer", jsonData); // Use `external_chat_transfer` key to send chat transcript data

UjetStartOptions ujetStartOptions = new UjetStartOptions.Builder()
        .setUnsignedCustomData(customData)
        .build();

Ujet.start(ujetStartOptions);

Utiliser des données personnalisées non signées pour envoyer une transcription de chat externe

Vous pouvez envoyer la transcription de chat externe à CCAI Platform à l'aide de données personnalisées non signées lorsqu'elle démarre. Utilisez UjetCustomData.putObject("external_chat_transfer", hashMapObject) pour définir les données de transcription au format JSON comme suit :

HashMap<String, Object> jsonData = new HashMap<>();
// Convert json string into hashmap object and store it in jsonData
UjetCustomData customData = new UjetCustomData();
customData.putObject("external_chat_transfer", jsonData); // Use `external_chat_transfer` key to send chat transcript data

UjetStartOptions ujetStartOptions = new UjetStartOptions.Builder()
        .setUnsignedCustomData(customData)
        .build();

Ujet.start(ujetStartOptions);

Format JSON :

  • greeting_override : chaîne

  • agent : dictionnaire

    • name : chaîne

    • avatar : chaîne [URL de l'avatar de l'agent, facultatif]

  • transcript : tableau

    • sender : chaîne ["end_user" ou "agent"]

    • timestamp : chaîne [par exemple, "2021-03-15 12:00:00Z"]

    • content : tableau

      • type : chaîne [texte ou média]

      • text : chaîne [obligatoire pour le type de texte]

      • media : dictionnaire [obligatoire pour le type de contenu multimédia]

        • type : chaîne [image ou vidéo]

        • url : chaîne [URL publique pointant vers le fichier multimédia]

Exemple JSON :

{
    "greeting_override": "Please hold while we connect you with a human agent.",
    "agent": {
        "name": "Name",
        "avatar": "avatar url"
    },
    "transcript": [
        {
        "sender": "agent",
        "timestamp": "2021-03-15 12:00:15Z",
        "content": [
            {
            "type": "text",
            "text": "**Suggestions shown:**\n\n* Help with batch or delivery\n* Help with metrics or order feedback\n* Help with Instant Cashout"
            }
        ]
        },
        {
        "sender": "end_user",
        "timestamp": "2021-03-15 12:00:16Z",
        "content": [
            {
            "type": "text",
            "text": "Help with batch or delivery"
            }
        ]
        }
    ]
}

Vous pouvez utiliser Markdown sur le type de texte. Les formats suivants sont acceptés :

  • Gras

  • Italique

  • Souligné

  • Sauts de ligne

  • Liste à puces

  • Liste numérotée

  • Liens

Format de données personnalisé

Cette section présente le format des données personnalisées qui peuvent être transmises dans le jeton JWT.

JSON encodé en JWT

Le fichier JSON doit inclure "iat" et "exp" pour valider le JWT. L'objet des données personnalisées est la valeur de la clé custom_data.

{
    "iat" : 1537399656,
    "exp" : 1537400256,
    "custom_data" : {
        "location" : {
            "label" : "Location",
            "value" : "1000 Stockton St, San Francisco, CA, United States",
            "type" : "string"
        },
        "dashboard_url" : {
            "label" : "Dashboard URL",
            "value" : "http://(company_name)/dashboard/device_user_ID",
            "type" : "url"
        },
        "contact_date" : {
            "label" : "Contact Date",
            "value" : 1537399655992,
            "type" : "date"
        },
        "membership_number" : {
            "label" : "Membership Number",
            "value" : 62303,
            "type" : "number"
        },
        "model" : {
            "label" : "Model",
            "value" : "iPhone",
            "type" : "string"
        },
        "os_version" : {
            "label" : "OS Version",
            "value" : "12.0",
            "type" : "string"
        },
        "last_transaction_id" : {
            "label" : "Last Transaction ID",
            "value" : "243324DE-01A1-4F71-BABC-3572B77AC487",
            "type" : "string"
        },
        "battery" : {
            "label" : "Battery",
            "value" : "-100%",
            "type" : "string"
        },
        "bluetooth" : {
            "label" : "Bluetooth",
            "value" : "Bluetooth not supported",
            "type" : "string"
        },
        "wifi" : {
            "label" : "Wi-Fi",
            "value" : "Wi-Fi not connected",
            "type" : "string"
        },
        "ssn" : {
            "invisible_to_agent" : true,
            "label" : "Social Security Number",
            "value" : "102-186-1837",
            "type" : "string"
        }
    }
}

La clé est un identifiant unique pour les données. Le type correspond au type de la valeur.

  • string

    • Chaîne JSON
  • number

    • entier, float
  • date

    • Format de code temporel UNIX UTC à 13 chiffres. (contient des millisecondes)
  • url

    • Format d'URL HTTP

Le libellé correspond au nom à afficher sur la page du CRM.

Empêcher l'affichage de données personnalisées

Vous pouvez utiliser la propriété invisible_to_agent avec un objet de données personnalisé pour empêcher l'affichage de données personnalisées signées ou non signées dans l'adaptateur d'agent. Dans l'exemple précédent, le numéro de sécurité sociale de l'utilisateur final n'est pas affiché dans l'adaptateur d'agent, car "invisible_to_agent" : true est inclus dans l'objet ssn.

Lorsque vous incluez la propriété "invisible_to_agent" : true avec un objet de données personnalisé, voici ce qui se passe :

Pour en savoir plus, consultez Afficher les données de session dans l'adaptateur d'agent.

Propriétés de données réservées

Vous pouvez envoyer des propriétés de données réservées à Contact Center AI Platform (CCAI Platform) en tant que données personnalisées signées au début d'une session. Pour en savoir plus, consultez Envoyer des propriétés de données réservées.

Voici un exemple de propriétés de données réservées dans les données personnalisées :

  {
    "custom_data": {
      "reserved_verified_customer": {
        "label": "Verified Customer",
        "value": "VERIFIED_CUSTOMER_BOOLEAN": ,
        "type": "boolean"
      },
      "reserved_bad_actor": {
        "label": "Bad Actor",
        "value": "VERIFIED_BAD_ACTOR_BOOLEAN": ,
        "type": "boolean"
      },
      "reserved_repeat_customer": {
        "label": "Repeat Customer",
        "value": "REPEAT_CUSTOMER_BOOLEAN": ,
        "type": "boolean"
      }
    }
  }
  

Remplacez les éléments suivants :

  • VERIFIED_CUSTOMER_BOOLEAN : "True" si vous considérez que cet utilisateur final est un client légitime.
  • VERIFIED_BAD_ACTOR_BOOLEAN : "True" si vous considérez que cet utilisateur final peut être un acteur malveillant.
  • REPEAT_CUSTOMER_BOOLEAN : "True" si vous avez déterminé que cet utilisateur final a déjà contacté votre centre d'appels.

Configuration du SDK

Vous pouvez configurer plusieurs options avant de démarrer le SDK Android. Consultez la classe UjetOption. Les options "Numéro de téléphone de secours" et "Sensibilité du réseau" décrites dans le tableau ci-dessous ne fonctionnent que lorsque l'option Activer le secours RTC est activée dans le portail de la plate-forme CCAI, sous Paramètres > Paramètres pour les développeurs > MMA > Modifier. Lorsque l'option Activer le basculement vers le réseau téléphonique public commuté est désactivée, nous ne basculons pas vers le réseau téléphonique public commuté. La plate-forme CCAI utilise la sensibilité réseau par défaut (0,85) pour vérifier les connexions réseau.

Option Description Valeur Valeur par défaut
Niveau de journalisation Niveau de journalisation à afficher dans Logcat. Entier. Il en va de même pour le niveau de journalisation du journal Android. (Min. : 2, Max. : 7) 5 (Log.Warn)
Langue par défaut Code de langue par défaut. Chaîne. Code de langue ISO 639. (par exemple, "en" pour l'anglais) null
Numéro de téléphone de secours Le numéro de téléphone est utilisé comme solution de repli lorsque Internet n'est pas disponible ou que le numéro de téléphone du représentant de l'entreprise n'existe pas dans le portail d'administration. Chaîne. Numéro de téléphone. null
Gestionnaire d'exceptions non détectées activé Activez le gestionnaire d'exceptions non interceptées. Si la valeur est true, l'application gère toutes les exceptions SDK non interceptées au moment de l'exécution à l'aide de Thread.setDefaultUncaughtExceptionHandler. Toutefois, si la même exception se produit deux fois, l'application plante. Valeur booléenne. true
Sensibilité du réseau Sensibilité pour vérifier l'état du réseau. Double entre 0 et 1, où 0 est la moins sensible et 1 la plus sensible. Une valeur de 1 entraînera toujours un basculement vers un appel RTCP. Si vous l'utilisez, nous vous recommandons de commencer par une valeur de .97. La valeur du seuil de numéro de téléphone de secours dans le portail, sous Paramètres > Paramètres pour les développeurs > Applications mobiles > Secours, remplace cette valeur. 0.85
Mode sombre activé Activez le thème du mode sombre. Si la valeur est true, le SDK applique un thème de mode sombre lorsque l'utilisateur active le mode sombre, et ignore l'action dans le cas contraire. Valeur booléenne. false
Canal unique activé Option de configuration permettant d'afficher ou d'ignorer l'écran de sélection de la chaîne pour une seule chaîne. Si la valeur est true, le SDK affiche un seul écran de sélection de chaîne au lieu de sélectionner automatiquement la chaîne, même si une seule chaîne est activée dans la file d'attente du menu. Valeur booléenne. false
Réduire automatiquement la vue de l'appel Option de configuration permettant de réduire automatiquement l'UI de l'écran d'appel initial par défaut ou d'attendre que l'utilisateur la réduise. Valeur booléenne. false
Bordure de l'icône de l'agent activée Option de configuration permettant d'afficher ou de supprimer une bordure circulaire autour de l'icône de l'agent. Valeur booléenne. false
Taille de police statique dans la vue du sélecteur Option de configuration permettant d'ajuster automatiquement ou de désactiver la taille du texte de l'élément du sélecteur. Valeur booléenne. false
Masquer une pièce jointe multimédia dans une discussion Option de configuration permettant d'afficher ou de masquer l'icône de pièce jointe multimédia dans l'interface utilisateur du chat. Valeur booléenne. false
Ignorer l'autorisation READ_PHONE_STATE Si la valeur est définie sur true, le SDK ne demande pas l'autorisation READ_PHONE_STATE. Si vous ne souhaitez pas utiliser les appels IVR dans l'application, définissez ce signal sur true pour éviter de demander cette autorisation. Votre application doit également supprimer explicitement l'autorisation android.permission.READ_PHONE_STATE pour le SDK CCAI Platform. Notez que nous vous déconseillons de définir cette valeur sur true, car cette autorisation est requise pour que les appels SVI dans l'application fonctionnent. Booléen false
Clé de licence Cobrowse.io (le cas échéant) Option de configuration permettant de configurer la bibliothèque Cobrowse.io. Pour trouver votre clé de licence Cobrowse, connectez-vous à https://cobrowse.io/dashboard/settings et accédez à la section Clé de licence. Chaîne null
Titre d'en-tête de chat personnalisé Option de configuration permettant de personnaliser le texte du titre de l'en-tête de chat dans l'interface utilisateur de chat. Chaîne null
Personnaliser les réponses rapides de l'UI de chat Option de configuration permettant de personnaliser les réponses rapides de l'agent virtuel dans l'interface utilisateur du chat. Les réponses rapides de l'agent virtuel sont regroupées par défaut. Toutefois, si vous souhaitez les afficher individuellement, vous pouvez utiliser cette option de configuration pour définir QuickReplyButtonsStyle.INDIVIDUAL. UjetStylesOptions QuickReplyButtonsStyle.GROUPED
Personnaliser différents attributs de l'UI de chat Option de configuration permettant de personnaliser différents attributs tels que la police, la couleur d'arrière-plan, l'icône, etc. UjetStylesOptions null
Masquer la barre d'état Option de configuration permettant d'afficher ou de masquer la barre d'état. Si la valeur est "true", le SDK masquera la barre d'état. Booléen false
Définir la res de drawable de l'icône de chargement Option de configuration permettant de personnaliser la vue du spinner de chargement dans l'application. Si elle n'est pas disponible ou est nulle, nous utilisons la vue de chargement par défaut. Integer null
Orientation paysage désactivée Désactivez l'orientation paysage. Si la valeur est "true", l'orientation paysage n'est pas appliquée. Booléen false
Masquer le bouton "Démarrer une conversation" dans le chat Option de configuration permettant d'afficher ou de masquer le bouton "Démarrer une conversation" intégré à l'interface utilisateur du chat. Booléen false
Afficher le bouton "Ignorer" pour la CSAT Option de configuration permettant d'afficher ou de masquer le bouton "Ignorer" dans la boîte de dialogue CSAT Booléen false
Bloquer la fin du chat par l'utilisateur final Option de configuration permettant d'afficher ou de masquer le bouton "Arrêter le chat" dans l'UI de chat Booléen false
Masquer la transcription du chat à télécharger Affichez ou masquez le bouton "Télécharger la transcription de la discussion" dans le menu des actions de discussion et dans l'interface utilisateur de discussion. Si vous ajoutez un espace à la chaîne ujet_common_hide, le texte Hide disparaît et seule la flèche de retour s'affiche. Entier. Valeurs :

0 = Afficher partout

1 = Masquer dans le menu d'options

2 = Masquer sur l'écran post-chat

3 : masquer à la fois dans le menu des options et sur l'écran de chat après la publication.

0

UjetOption.setBlockChatTerminationByEndUser

Désactiver les notifications push au niveau mondial Si vous définissez UjetOption.setPushNotificationsAllowed sur false, vous contournez toutes les dépendances des notifications push et vous empêchez les notifications push d'atteindre les utilisateurs finaux. Booléen true
UjetOption ujetOption = new UjetOption.Builder()
        .setLogLevel(Log.INFO)
        .setDefaultLanguage("en")
        .setFallbackPhoneNumber("+18001112222")
        .setUncaughtExceptionHandlerEnabled(false)
        .setNetworkSensitivity(0)
        .setDarkModeEnabled(true)
        .setShowSingleChannelEnabled(true)
        .setAutoMinimizeCallView(true)
        .setShowAgentIconBorderEnabled(true)
        .setStaticFontSizeInPickerView(true)
        .setHideMediaAttachmentInChat(true)
        .setIgnoreReadPhoneStatePermission(true)
        .setCobrowseLicenseKey("COBROWSE_IO_LICENSE_KEY_HERE")
        .setCobrowseURL("COBROWSE_IO_API_URL_HERE")
        .setCustomChatHeaderTitle("CHAT_HEADER_TITLE_TEXT")
        .setUjetStylesOptions(
             new UjetStylesOptions.Builder()
            .setChatQuickReplyButtonsStyle(QuickReplyButtonsStyle.INDIVIDUAL)
            .setChatStyles(new ChatStyles(...)) // See `Content Cards Theme` item
            .build()            )
        .setBlockChatTerminationByEndUser(true)
        .setHideStatusBar(true)
        .setLoadingSpinnerDrawableRes(R.drawable.RESOURCE_NAME)
        .setLandscapeOrientationDisabled(true)
        .setShowCsatSkipButton(false)
        .setHideDownloadChatTranscript(0) // 0 to 3. 0 = Show everywhere, 1 = Hide from the options menu, 2 = Hide from the post chat screen, 3 = Hide from both the options menu and the post chat screen.
        .setPushNotificationsAllowed(true)
        .build();

//The following customizes various attributes in chat UI
ChatStyles chatStyles = new ChatStyles();
chatStyles.setBackButton(new BackButtonStyle(false, "ujet_agent_sample")); //customizes back button styles
chatStyles.setHeader(...); //customizes chat header styles
chatStyles.setAgentMessageBubbles(...); //customizes agent messages styles
chatStyles.setConsumerMessageBubbles(...); //customizes consumer messages styles
chatStyles.setSystemMessages(...); //customizes system messages styles
chatStyles.setEndChatButton(...); //customizes end chat button styles
chatStyles.setTimeStamps(...); //customizes timestamp styles
chatStyles.setUserInputBar(...); //customizes user input bar styles

UjetOption ujetOption = new UjetOption.Builder()
        .setUjetStylesOptions(
            new UjetStylesOptions.Builder()
            .setChatStyles(chatStyles)
            .build()
        )

//The following customizes various attributes in chat UI using json file. Store json file in assets folder
//and create a method to read json file contents and convert it into json string.
String chatStylesFromJson = parseJsonContentsFromAssetsFolder();

UjetOption ujetOption = new UjetOption.Builder()
        .setUjetStylesOptions(
            new UjetStylesOptions.Builder()
            .setChatStyles(chatStylesFromJson)
            .build()
        )

Action de remplacement

Vous pouvez utiliser UjetErrorListener pour le remplacement des erreurs inattendues. Si vous ne définissez pas ce listener ou si vous renvoyez la valeur "false", le SDK Android gérera l'erreur.

Le SDK Android redirige les utilisateurs vers le clavier de numérotation avec un numéro de secours uniquement lorsque l'option "Activer le numéro de secours RTC" est activée dans Paramètres > Paramètres développeur > MMA > Modifier le pop-up. Dans le cas contraire, quittez le SDK.

Type d'erreur Code d'erreur Déclencheur
NETWORK_ERROR 1 Le réseau n'est pas disponible. Notez que cette erreur ne se produit pas lorsque le réseau n'est pas disponible pendant une conversation par chat ou un appel, ou sur l'écran de notation.
AUTHENTICATION_ERROR 100 Une erreur inattendue s'est produite lors de l'authentification.
AUTHENTICATION_JWT_ERROR 101 Une erreur inattendue s'est produite lors de la validation du JWT (par exemple, une erreur d'analyse).
VOIP_CONNECTION_ERROR 1000 Échec de l'établissement d'une connexion au fournisseur VoIP. Il est géré par le biais du rappel du SDK VoIP.
VOIP_LIBRARY_NOT_FOUND 1001 Un appel doit être connecté à l'aide d'un fournisseur VoIP, mais aucun n'a été trouvé. Cela peut se produire lorsqu'un développeur a intégré le mauvais SDK ou n'a pas ajouté la bibliothèque de fournisseur VoIP dans ses dépendances.
CHAT_LIBRARY_NOT_FOUND 1100 Se produit lorsque la bibliothèque de chat est introuvable. Cela peut se produire lorsqu'un développeur a intégré le mauvais SDK ou n'a pas ajouté la bibliothèque Twilio Chat à ses dépendances.
Ujet.setUjetEventListener(new UjetEventListener() {
    @Override
    public void onEvent(UjetEventType eventType, HashMap<String, Object> eventData) {
        // eventType specifies the event type and eventData holds the data related to the event.
        // You can parse the eventData and here we are just logging the event type and event data.
        Log.i("CCAI Platform Event Type", eventType.getValue());

        StringBuilder builder = new StringBuilder();
        for (Map.Entry<String, Object> entry : eventData.entrySet()) {
            builder.append(entry.getKey()).append(" : ").append(entry.getValue()).append("\n");
        }

        Log.i("CCAI Platform Event Data", builder.toString());
    }
});

Autorisations de l'application

L'application nécessite les autorisations suivantes et les demande à l'utilisateur si nécessaire.

Autorisation Description
CAMÉRA Utilisé pour les actions intelligentes permettant de prendre des photos et d'enregistrer des vidéos
MICRO Autorise l'application à utiliser les appels VoIP via Twilio
STORAGE Autorise l'application à enregistrer des photos et des vidéos

Configuration des liens profonds (facultatif)

Si vous souhaitez utiliser des actions intelligentes pour un appel SVI (RTCP), vous devez configurer le lien profond dans votre projet.

Le format de lien profond est un URI unique, par exemple :

ujet:// <package_name>/smartchannel.

Vous devez également définir ce lien ou toute URL qui redirigera vers ce lien dans le portail d'administration (Paramètres > Gestion des opérations > Activer l'envoi de SMS pour télécharger l'application).

Vous devrez ajouter un filtre d'intent contenant le lien profond dans votre fichier manifeste.

<activity android:name="co.ujet.android.activity.UjetActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:host="<package_name>"
                android:scheme="ujet"
                android:path="/smartchannel" />
    </intent-filter>
</activity>

Canal préféré

Le paramètre "Canal préféré" vous permet de rediriger les consommateurs directement vers un canal spécifique. L'utilisateur final ignore ensuite l'étape de sélection du canal et établit directement le contact via le canal spécifié dans le paramètre "Canal préféré".

UjetStartOptions.preferredChannel

Ujet.start(new)
UjetStartOptions.Builder().setPreferredChannel
(UjetPreferredChannel.UjetPreferredChannelChat).build());

Notifications d'événements

Vous pouvez éventuellement définir UjetEventListener pour recevoir des notifications d'événements d'application.

Les types d'événements et les descriptions disponibles sont listés ici.

Ujet.setUjetEventListener(new UjetEventListener() {
    @Override
    public void onEvent(UjetEventType eventType, HashMap<String, Object> eventData) {
        // eventType specifies the event type and eventData holds the data related to the event.
        // You can parse the eventData and here we are just logging the event type and event data.
        Log.i("CCAI Platform Event Type", eventType.getValue());

        StringBuilder builder = new StringBuilder();
        for (Map.Entry<String, Object> entry : eventData.entrySet()) {
            builder.append(entry.getKey()).append(" : ").append(entry.getValue()).append("\n");
        }

        Log.i("CCAI Platform Event Data", builder.toString());
    }
});
Type d'événement Description Données incluses dans l'événement
EmailClicked Déclencheur lorsque l'utilisateur final clique sur le canal de messagerie. Données du menu de la file d'attente
EmailSubmitted Déclencheur lorsque l'utilisateur final envoie un e-mail. Données du menu de file d'attente, données envoyées par e-mail
SessionPaused Déclenché lorsque l'utilisateur final réduit une session de chat ou d'appel. Données de session
SessionResumed Déclenché lorsque l'utilisateur final revient à une session de chat ou d'appel depuis l'arrière-plan. Données de session
SessionCreated Se déclenche lorsqu'une session de chat ou d'appel est créée. Données du menu de la file d'attente, données de création de la session
SessionEnded Déclencheur lorsqu'une session de chat ou d'appel est terminée. Données du menu de file d'attente, données de création de session, données de fin de session
SdkTerminated Se déclenche lorsque le SDK est fermé, y compris de manière inattendue. Données de fin du SDK
ContentCardClicked Se déclenche lorsqu'un utilisateur clique sur une fiche de contenu. Données sur les clics sur les cartes de contenu
ContentCardButtonClicked Se déclenche lorsqu'un utilisateur clique sur le bouton d'une fiche de contenu. Données sur les clics sur les boutons des fiches de contenu
QuickReplyClicked Se déclenche lorsqu'une réponse rapide est sélectionnée. Données sur les clics sur les réponses rapides
MessageLinkClicked Se déclenche lorsqu'un utilisateur clique sur un lien. Données sur les clics sur les liens dans les messages

Données du menu de la file d'attente

Clé Type Description
event_name Chaîne Contient le nom de l'événement. Par exemple, "E-mail cliqué".
application Chaîne Contient le nom de l'application. Exemple : "Android".
app_id Chaîne Contient l'identifiant de l'application, qui est identique à Context.getPackageName().
app_version Chaîne Contient le nom et le code de version de l'application. Exemple : "0.32.0 (123)".
sdk_version Chaîne Contient la version du SDK. Exemple : "0.32.0".
timestamp Chaîne Contient un code temporel en UTC (au format aaaa-MM-jj'T'HH:mm:ss'Z').
device_model Chaîne Contient le modèle de l'appareil de l'utilisateur. (par exemple, "Google Pixel").
device_version Chaîne Contient la version de l'appareil de l'utilisateur. Exemple : "10, Q, SDK 29".
company Chaîne Contient le nom de l'entreprise. Exemple : "Entreprise".
menu_name Chaîne Contient le nom du nœud feuille (dernière sélection de menu de l'utilisateur). Exemple : "Sous-menu".
menu_id Chaîne Contient l'ID du nœud feuille (dernière sélection de menu de l'utilisateur). Exemple : "123".
menu_path Chaîne Contient la séquence complète des menus sélectionnés par l'utilisateur. Par exemple, "Menu principal / Sous-menu / Sous-sous-menu".
menu_key Chaîne Contient la clé DAP et est facultatif. Exemple : "special_user_menu".

Données envoyées par e-mail

Clé Type Description
has_attachments Booléen Renvoie "True" si l'e-mail contient des pièces jointes, ou "False" dans le cas contraire.

Données de session

Clé Type Description
event_name Chaîne Contient le nom de l'événement. Par exemple, "E-mail cliqué".
type Chaîne Contient le type de session. Par exemple, "chat" ou "appel".
timestamp Chaîne Contient un code temporel en UTC (au format aaaa-MM-jj'T'HH:mm:ss'Z').

Données de session créée

Clé Type Description
session_id Chaîne Contient l'ID de session. Exemple : "100".
type Chaîne Contient le type de session. Par exemple, "chat" ou "appel".
end_user_identifier Chaîne Contient l'identifiant de l'utilisateur final. Exemple : "Jean".
messages_end_user Chaîne Contient le nombre de messages de l'utilisateur final et n'est inclus que pour la session de chat. Exemple : "3".
messages_agent Chaîne Indique le nombre de messages de l'agent et n'est inclus que pour la session de chat. Exemple : "3".

Données de session terminée

Clé Type Description
agent_name Chaîne Contient le nom de l'agent. Exemple : "Jean".
ended_by Chaîne Contient des informations sur la personne qui a mis fin à la session. Les valeurs possibles sont "agent" (lorsque l'agent met fin à la session), "end_user" (lorsque l'utilisateur final met fin à la session), "timeout" (lorsque le chat expire) ou "dismissed" (lorsque le chat est fermé).
duration Chaîne Contient la durée de la session en secondes et n'est inclus que pour la session d'appel. Exemple : "30 secondes".

Données de fin du SDK

Clé Type Description
event_name Chaîne Contient le nom de l'événement. Par exemple, "E-mail cliqué".

Données sur les clics sur les cartes de contenu

Clé Type Description
title string Titre de la fiche.
title string Titre de la fiche.
subtitle string Sous-titre de la fiche.
body string Description de la fiche de contenu.
link string Un lien vers une page Web ou un lien profond. Le SDK utilise les fonctionnalités de l'OS pour l'ouvrir.
event_params dictionary Un dictionnaire contenant des informations supplémentaires sur l'événement de clic. Le SDK l'utilise.

Données sur les clics sur les boutons de cartes de contenu

Clé Type Description
title string Titre de la fiche.
title string Titre de la fiche.
link string Un lien vers une page Web ou un lien profond. Le SDK utilise les fonctionnalités de l'OS pour l'ouvrir.
event_params dictionary Un dictionnaire contenant des informations supplémentaires sur l'événement de clic. Le SDK l'utilise.

Données sur les clics sur les réponses rapides

Clé Type Description
title string Titre de la fiche.
title string Titre de la fiche.
link string Un lien vers une page Web ou un lien profond. Le SDK utilise les fonctionnalités de l'OS pour l'ouvrir.
event_params dictionary Un dictionnaire contenant des informations supplémentaires sur l'événement de clic. Le SDK l'utilise.

Données sur les clics sur les liens dans les messages

Clé Type Description
event_name Chaîne Contient le nom de l'événement (par exemple, "Clic sur le lien du message").
link Chaîne Un lien vers une page Web ou un lien profond. Le SDK utilise les fonctionnalités de l'OS pour l'ouvrir.

Modifications du comportement des appels entrants

À partir des appareils équipés d'Android 10, les appels entrants ne seront pas reçus directement par les utilisateurs finaux lorsque l'application hôte est en arrière-plan. Nous utilisons plutôt des notifications pour alerter les utilisateurs des appels entrants (même lorsque le téléphone est verrouillé), en leur donnant la possibilité d'accepter ou de refuser l'appel.

Nous affichons les mêmes notifications lorsque l'application hôte est en arrière-plan et que l'écran est verrouillé avant l'arrivée d'un appel entrant. Cette modification du comportement vise à respecter les récentes restrictions de Google concernant le démarrage d'activités lorsque l'application est en arrière-plan. Le comportement n'est pas affecté lorsque l'application hôte est au premier plan ou s'exécute sur des appareils équipés d'une version d'Android antérieure à la version 10.

Personnaliser la session SDK

Cette section explique comment personnaliser davantage le SDK.

Vérifier l'existence d'une session

Avant de démarrer une session, utilisez la méthode décrite pour vérifier s'il existe une session en cours ou déjà terminée. Si elle existe, vous pouvez inviter l'utilisateur final à la reprendre ou à l'annuler.

C'est particulièrement important lorsqu'un utilisateur est modifié.

if (Ujet.getStatus() != UjetStatus.None) {
    // Display alert to cancel login or resume existing session
}

Déconnecter la session

Consultez la méthode si vous souhaitez déconnecter une session en cours.

Avant d'utiliser cette méthode, assurez-vous de vérifier si une telle session existe à l'aide de Ujet.getStatus(). Si vous souhaitez effectuer une ou plusieurs actions après que le SDK a déconnecté la session(par exemple, afficher un message ou fermer l'application), vous pouvez utiliser le rappel de réponse onFinished(), comme indiqué dans la section suivante. Sinon, définissez le rappel sur "null".

Ujet.disconnect(new UjetResponseCallback() {
    @Override
    public void onFinished() {
        // `onFinished()` is triggered after CCAI Platform disconnects the session.
        finish(); // Finishes the activity.
    }
});

Effacer les données utilisateur final du cache

Il vous incombe d'effacer le cache lorsque les données liées à l'utilisateur final ont été mises à jour ou modifiées dans votre application. Par exemple, si l'utilisateur final s'est déconnecté, appelez la méthode pour supprimer le cache de cet utilisateur afin qu'une nouvelle session soit lancée pour le nouvel utilisateur final au prochain démarrage du SDK.

Ujet.clearUserData();

Masquer le SDK

Vous pouvez masquer le SDK à l'aide de la méthode Ujet.hideSDK(). Cela peut être utile lorsque le SDK interfère avec l'interface utilisateur de votre application, par exemple. Initialisez le SDK à l'aide de Ujet.init() avant d'appeler cette méthode. Ujet.init() renvoie true si le SDK est masqué, et false dans le cas contraire. Après avoir masqué le SDK, vous pouvez le redémarrer à l'aide de la méthode Ujet.start().

L'exemple suivant masque le SDK :

Ujet.hideSDK();

Préférences linguistiques

Le SDK Android utilise l'ordre de priorité suivant pour déterminer la langue.

  1. Langue sélectionnée sur l'écran de démarrage de l'application.

  2. Langue par défaut sélectionnée à l'aide de UjetOptions. Vous pouvez définir la langue par défaut à l'aide de setDefaultLanguage("en") dans UjetOptions. Pour en savoir plus, consultez la section "Langue par défaut" dans la section de configuration du SDK.

  3. La langue de l'appareil sélectionnée dans l'appareil (via Paramètres > Général > Langue) sera utilisée si elle est prise en charge par l'application.

  4. Le dialecte le plus proche de la langue de l'appareil sera utilisé lorsque l'application ne prend pas en charge la langue de l'appareil, mais prend en charge le dialecte parent le plus proche. Par exemple, si l'utilisateur a sélectionné l'espagnol de Cuba comme langue sur l'appareil et que l'application ne prend pas en charge l'espagnol de Cuba, mais prend en charge la langue parente espagnole, c'est l'espagnol qui sera utilisé.

  5. L'anglais sera utilisé comme langue par défaut lorsque la langue de l'appareil n'est pas prise en charge par l'application.

Configurer les icônes de liens de déviation externe

Personnalisez l'icône dans le canal "Lien de redirection externe" en l'important dans un dossier drawable de votre application. Assurez-vous d'utiliser le même nom d'icône lorsque vous créez le lien de redirection externe dans le portail de la plate-forme CCAI, sous Paramètres > Chat > Liens de redirection externe > Afficher les liens > Ajouter un lien de redirection.

Si le nom de l'icône dans le portail de la plate-forme CCAI ne correspond pas à l'icône importée dans l'application, le SDK Android utilise l'icône par défaut.

Configurer l'icône Merci des enquêtes

Vous pouvez personnaliser ou remplacer l'icône sur la page de remerciements de l'enquête en important une icône dans le dossier drawable de votre application et en utilisant le nom de fichier ujet_survey_thank_you_icon comme nom d'icône.

Personnaliser (facultatif)

Cette section explique comment personnaliser des valeurs spécifiques dans le SDK.

Strings

Vous pouvez personnaliser les chaînes utilisées dans l'application en remplaçant les clés de chaque chaîne dans strings.xml.

<resources>
    <!--Greeting title and message in splash screen-->
    <string name="ujet_greeting_title">Customer Support</string>
    <string name="ujet_greeting_description">runs on UJET</string>
</resources>

Configuration de l&#39;enquête

Personnalisation de la taille du texte

Personnalisez la taille du titre, de la description et du texte du sélecteur utilisés dans l'application en remplaçant les clés suivantes dans dimens.xml.

Voici les tailles de texte personnalisables :

<resources>
    <!-- Don't include the following tags if you don't want to customize any of these keys and prefer to use the CCAI Platform default values instead. -->

    <!-- You can customize title text size by updating value here. -->
    <dimen name="ujet_title">10sp</dimen>

    <!-- You can customize description text size by updating value here. -->
    <dimen name="ujet_description">10sp</dimen>

    <!-- You can customize picker text size by updating value here. -->
    <dimen name="ujet_picker_item_text_size">10sp</dimen>
</resources>

Thème

Personnalisez le thème et l'arrière-plan en procédant comme suit. L'étape 1 concerne le thème et l'étape 2, l'arrière-plan.

  1. Personnalisez le thème en remplaçant les clés de chaque élément de style dans style.xml. Par exemple,

    <!--Default style applies to both Light and Dark Mode Themes-->
    <style name="Ujet">
        <item name="ujet_typeFace">ProximaNova-Reg.otf</item>
        <item name="ujet_colorPrimary">@color/primaryDefault</item>
        <item name="ujet_colorPrimaryDark">@color/primaryDarkDefault</item>
        <item name="ujet_buttonRadius">10dp</item>
        <item name="ujet_companyLogo">@drawable/your_company_logo_default</item>
    
        <!-- You can customize the avatar in waiting UI before call or chat is connected by using the following option. -->
        <item name="ujet_defaultAvatar">@drawable/your_default_avatar</item>
    </style>
    
    <!--This is optional and can be used to update style in Light Mode Theme only-->
    <style name="Ujet.Light">
        <item name="ujet_typeFace">ProximaNova-Reg.otf</item>
        <item name="ujet_colorPrimary">@color/primaryLightMode</item>
        <item name="ujet_colorPrimaryDark">@color/primaryDarkLightMode</item>
        <item name="ujet_buttonRadius">10dp</item>
        <item name="ujet_companyLogo">@drawable/your_company_logo_light_mode</item>
    
        <!-- You can customize the avatar in waiting UI before call or chat is connected by using the following option. -->
        <item name="ujet_defaultAvatar">@drawable/your_default_avatar</item>
    </style>
    
    <!--This is optional and can be used to update style in Dark Mode Theme only-->
    <style name="Ujet.Dark">
        <item name="ujet_typeFace">ProximaNova-Reg.otf</item>
        <item name="ujet_colorPrimary">@color/primaryDarkMode</item>
        <item name="ujet_colorPrimaryDark">@color/primaryDarkForDarkMode</item>
        <item name="ujet_buttonRadius">10dp</item>
        <item name="ujet_companyLogo">@drawable/your_company_logo</item>
    
        <!-- You can customize the avatar in waiting UI before call or chat is connected by using the following option. -->
        <item name="ujet_defaultAvatar">@drawable/your_default_avatar</item>
    </style>
    
  2. Vous pouvez personnaliser la couleur d'arrière-plan dans l'application en remplaçant les clés de chaque élément de style dans style.xml. La capture d'écran montre une couleur d'arrière-plan personnalisable.

    <style name="Ujet">
        <!-- Don't include the following tags if you don't want to customize any of these keys and prefer to use the CCAI Platform default values instead. -->
        <!-- You can customize light mode theme background color by updating value here in hex. -->
        <item name="ujet_colorBackground">@color/backgroundDefault</item>
        <!-- You can customize dark mode theme background color by updating value here in hex. -->
        <item name="ujet_colorBackgroundDark">@color/backgroundDefaultDark</item>
    </style>
    

Personnaliser le titre de l'en-tête du chat

Des options sont disponibles pour personnaliser le texte du titre de l'en-tête de chat dans votre UI.

Vous pouvez personnaliser le texte du titre de l'en-tête du chat à l'aide des options suivantes :

<item name="ujet_chatCustomHeaderTextColor">@color/chatHeaderTextLightMode</item>
<item name="ujet_chatCustomHeaderTextColowDark">@color/chatHeaderTextDarkMode</item>
<item name="ujet_chatCustomHeaderTextSize">16sp</item>
<item name="ujet_chatCustomHeaderTextStyle">bold</item>

Vous pouvez personnaliser les réponses rapides de l'agent virtuel dans l'interface utilisateur du chat à l'aide des options suivantes :

<item name="ujet_colorChatQuickReplyButtonBackground">@color/chatQuickReplyButtonBackgroundLightMode</item>
<item name="ujet_colorChatQuickReplyButtonBackgroundDark">@color/chatQuickReplyButtonBackgroundDarkMode</item>
<item name="ujet_colorChatQuickReplyButtonPressedBackground">@color/chatQuickReplyButtonPressedBackgroundLightMode</item>
<item name="ujet_colorChatQuickReplyButtonPressedBackgroundDark">@color/chatQuickReplyButtonPressedBackgroundDarkMode</item>
<item name="ujet_colorChatQuickReplyButtonText">@color/chatQuickReplyButtonTextLightMode</item>
<item name="ujet_colorChatQuickReplyButtonTextDark">@color/chatQuickReplyButtonTextDarkMode</item>
<item name="ujet_colorChatQuickReplyButtonPressedText">@color/chatQuickReplyButtonPressedTextLightMode</item>
<item name="ujet_colorChatQuickReplyButtonPressedTextDark">@color/chatQuickReplyButtonPressedTextDarkMode</item>
<item name="ujet_colorChatQuickReplyButtonStroke">@color/chatQuickReplyButtonStrokeLightMode</item>
<item name="ujet_colorChatQuickReplyButtonStrokeDark">@color/chatQuickReplyButtonStrokeDarkMode</item>
<item name="ujet_chatQuickReplyButtonTypeFace">Kreon-Regular.ttf</item>
<item name="ujet_chatQuickReplyButtonStrokeWidth">3dp</item>
<item name="ujet_chatQuickReplyButtonCornerRadius">3dp</item>
<item name="ujet_chatQuickReplyButtonVerticalMargin">0dp</item>
<item name="ujet_chatQuickReplyButtonHorizontalPadding">10dp</item>
<item name="ujet_chatQuickReplyButtonVerticalPadding">1dp</item>
<item name="ujet_chatQuickReplyButtonAlignment">right</item>

Cartes de contenu

Vous pouvez personnaliser les fiches de contenu et le chat. Pour ce faire, vous pouvez utiliser le fichier JSON (reportez-vous à content_card property dans le fichier app/src/main/assets/json/ujet_styles.json) ou la classe ContentCardStyle.

ChatStyles(
    ...
    contentCard = ContentCardStyle(
        backgroundColor = "color_reference",
        cornerRadius = 8,
        font = FontStyle(
            colorReference = "color_reference",
            size = 16,
            style = "bold|italic",
            family = "Roboto-Black.ttf",
        ),
        border = BorderStyle(
            color = "color_reference",
            width = 2,
        ),
        title = TextStyle(
            FontStyle(
                colorReference = "color_reference",
                size = 18,
                style = "bold|italic",
                family = "Roboto-Black.ttf",
            )
        ),
        subtitle = TextStyle(
            FontStyle(
                colorReference = "color_reference",
                size = 16,
                style = "bold|italic",
                family = "Roboto-Black.ttf",
            )
        ),
        body = TextStyle(
            FontStyle(
                colorReference = "color_reference",
                size = 16,
                style = "bold|italic",
                family = "Roboto-Black.ttf",
            )
        )
    )
)

Thème du formulaire Web

Vous pouvez personnaliser la fiche du formulaire Web ainsi que le chat. Vous pouvez le faire en utilisant le fichier JSON (reportez-vous à la propriété form_card dans le fichier app/src/main/assets/json/ujet_styles.json) ou en utilisant la classe FormCardStyle.

ChatStyles(
    ...
    formCard = FormCardStyle(
        backgroundColor = "color_reference",
        cornerRadius = 8,
        font = FontStyle(
            colorReference = "color_reference",
            size = 16,
            style = "bold|italic",
            family = "Roboto-Black.ttf",
        ),
        border = BorderStyle(
            color = "color_reference",
            width = 2,
        ),
        title = TextStyle(
            FontStyle(
                colorReference = "color_reference",
                size = 18,
                style = "bold|italic",
                family = "Roboto-Black.ttf",
            )
        ),
        subtitle = TextStyle(
            FontStyle(
                colorReference = "color_reference",
                size = 16,
                style = "bold|italic",
                family = "Roboto-Black.ttf",
            )
        ),
        image = ImageStyle (
           height = 94,
        ),
    )
)

Enquêtes

Vous pouvez modifier l'icône sur la page de remerciements de l'enquête en important une icône dans le dossier drawable de votre application.

Veillez à utiliser ujet_survey_thank_you_icon comme nom d'icône.

Dépannage

Le démarrage d'une nouvelle discussion a pris plus de 30 secondes.

Vérifiez si vous répondez à une méthode de délégation de données personnalisées. Vous devez renvoyer des données personnalisées valides sur demande ou simplement renvoyer la valeur "null" avec un rappel. Utilisez le code suivant comme référence.

    @Override
    public void onSignPayloadRequest(Map<String, Object> payload, UjetPayloadType ujetPayloadType, UjetTokenCallback tokenCallback) {
        if (ujetPayloadType == UjetPayloadType.CustomData) {
            tokenCallback.onToken(null);
        }
    }

Explication de la déclaration relative à une règle

Si vous recevez une notification dans la Google Play Console vous demandant de déclarer une règle pour les services ou les autorisations utilisés par le SDK Android, utilisez l'une des explications suivantes.

Déclarer les services de premier plan utilisés par le SDK Android

Google a introduit les types de services de premier plan dans Android 14 et a rendu obligatoire leur spécification lors du démarrage des services de premier plan, comme indiqué sur https://developer.android.com/about/versions/14/changes/fgs-types-required#remote-messaging. Le SDK Android Contact Center AI Platform (CCAI Platform) utilise des services de premier plan pour lancer le chat et l'appel. Nous avons donc utilisé le type de service FOREGROUND_SERVICE_REMOTE_MESSAGING pour le chat, car nous traitons des messages texte, et le type de service FOREGROUND_SERVICE_MICROPHONE pour l'appel. Sans ces types de services, le SDK plantera lors de l'initialisation du chat ou de l'appel à partir des appareils Android 14.

Déclarer l'autorisation d'afficher les intents en plein écran utilisée par le SDK Android

L'autorisation USE_FULL_SCREEN_INTENT est requise pour afficher la notification push d'appel entrant lorsque l'appareil est verrouillé. Il alerte l'utilisateur final et affiche la notification d'appel entrant en plein écran (c'est ainsi que l'application téléphonique intégrée notifie l'appel entrant à l'utilisateur final).

Compatibilité avec Android 15

Pour prendre en charge Android 15, procédez comme suit :

  1. Définissez compileSdkVersion = 35 et targetSdkVersion = 35 dans votre build.gradle(:app).

  2. Assurez-vous que la version du plug-in Android Gradle (AGP) de votre projet est la version 8.5.1 ou ultérieure. Pour en savoir plus, consultez Mettre à jour le packaging de vos bibliothèques partagées.

  3. Installez le kit de développement Java (JDK) version 17 ou ultérieure pour créer des projets Android à l'aide d'AGP 8.0 ou version ultérieure. Pour en savoir plus, consultez JDK 17 requis pour exécuter AGP 8.0.