Android SDK-Leitfaden

Auf dieser Seite wird beschrieben, wie Sie das Android SDK verwenden.

Auf die Beispiel-App zugreifen

Wenn Sie die Android-Beispiel-App herunterladen möchten, klicken Sie auf Android-Beispiel-App.

Um eine Beispiel-App mit dem Android Mobile SDK zu erstellen, benötigen Sie Folgendes:

  • Unternehmensschlüssel und Unternehmens-Secret für das CCAI Platform-Portal.

  • Android 5.0 (API-Level 21, Lollipop) oder höher

  • Firebase Cloud Messaging oder Google Cloud Messaging für die Push-Benachrichtigung.

  • Die App wurde zu AndroidX migriert.

Anforderungen für das Upgrade des Twilio-SDK

Erfordert, dass das Twilio SDK bestimmten Versionen entspricht, wenn das Android SDK direkt über unser Paket integriert wird. Andernfalls kann dies ignoriert werden.

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

Außerdem sind ProGuard-Regeln bereits im Android SDK enthalten, um sicherzustellen, dass die Twilio Programmable Voice-Bibliothek nicht von ProGuard entfernt wird. Sie können zur Fehlerbehebung verwendet werden, falls ProGuard die Bibliothek versehentlich entfernt.

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

Zur Unterstützung der neuesten Twilio-Versionen ist das SDK ab Android SDK-Version 0.34.0 nicht mehr binärkompatibel mit Anwendungen, die auf Java 7 ausgerichtet sind. Um diese und zukünftige Releases verwenden zu können, müssen Entwickler ihre Anwendungen auf Java 8 aktualisieren. Hier ein Codebeispiel:

android {
    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
}

Unternehmensschlüssel und Unternehmens-Secret abrufen

  1. Melden Sie sich mit Administratoranmeldedaten im Admin-Portal an.

  2. Gehen Sie zu Einstellungen > Entwicklereinstellungen > Unternehmensschlüssel und geheimer Code.

  3. Rufen Sie den Unternehmensschlüssel und den geheimen Unternehmenscode ab.

Installation

Fügen Sie das Android SDK-Repository den Gradle-Einstellungen für das Stammprojekt hinzu.

build.gradle (Projekt)

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"
}

Unternehmenseinstellungen einrichten

Geben Sie die Einstellungen Ihres Unternehmens als Metadaten in der Datei „AndroidManifest.xml“ ein.

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>

JWT-Signierung

Aus Sicherheitsgründen müssen Endnutzerinformationen auf Ihrem Server als JWT signiert werden.

Die Beispiel-App enthält APIManager zum Testen. Sie müssen UJET_COMPANY_SECRET in mock/APIManager.java einfügen. APIManager muss eine Methode implementieren, die einen asynchronen Aufruf zum Signieren des JWT-Authentifizierungstokens initiiert und das Token zurückgibt.

In der Produktion müssen Sie den Signaturprozess auf Ihrem Server implementieren.

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

SDK initialisieren

Initialisieren Sie das SDK in der Methode onCreate der Android-Anwendungsklasse.

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

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

Endnutzerauthentifizierung

Der Endnutzer ist der Verbraucher, der Ihr Kundensupportteam über die Anwendung kontaktiert.

Um den Endnutzer in der Anwendung zu authentifizieren, führen wir einen JWT-Signierungsmechanismus ein.

Das Android SDK fordert zum Signieren der Nutzlast auf, wenn eine Authentifizierung erforderlich ist. Wenn die Signierung erfolgreich ist, tauscht die Anwendung das signierte JWT gegen das Autorisierungstoken des Endnutzers ein.

In ExampleApplication sollten Sie die UjetRequestListener-Schnittstelle zum Signieren des Autorisierungstokens und für benutzerdefinierte Daten implementieren.

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();
                    }
                });
        }
    }
}

Weitere Informationen finden Sie unter Endnutzerauthentifizierung.

Push-Benachrichtigungen einrichten

In diesem Abschnitt wird beschrieben, wie Sie mobile Push-Benachrichtigungen aktivieren.

Firebase vorbereiten

Sie sollten ein Firebase-Projekt vorbereiten.

Wenn Sie bereits ein Projekt haben, können Sie Ihr eigenes verwenden und diesen Prozess überspringen.

  1. Erstellen Sie ein Firebase-Projekt in der Firebase Console.

  2. Laden Sie „google-services.json“ in der Firebase Console unter „Einstellungen“ > „ALLGEMEIN“ herunter.

  1. Den Serverschlüssel finden Sie in der Firebase Console unter „Einstellungen“ > „CLOUD MESSAGING“.

Dienstkontoschlüssel hinzufügen

Sie müssen Ihrer mobilen App einen Dienstkontoschlüssel hinzufügen, damit Sie Push-Benachrichtigungen erhalten. Informationen zum Abrufen eines Dienstkontoschlüssels finden Sie unter Mit einem Dienstkonto authentifizieren.

So fügen Sie Ihrer mobilen App einen Dienstkontoschlüssel hinzu:

  1. Klicken Sie im CCAI Platform-Portal auf Einstellungen > Entwicklereinstellungen. Wenn Sie das Menü Einstellungen nicht sehen, klicken Sie auf  Menü.

  2. Rufen Sie den Bereich Mobile Apps auf.

  3. Klicken Sie neben Ihrer App auf Bearbeiten. Das Dialogfeld Mobile App bearbeiten wird angezeigt.

  4. Geben Sie im Dienstkontofeld Ihren Dienstkontoschlüssel ein und klicken Sie dann auf Speichern.

Android-Client einrichten

  1. Kopieren Sie google-services.json in das App-Verzeichnis, z. B. PROJECT_ROOT/app/google-services.json.

  2. Rufen Sie das FCM-Token mit dem folgenden Code ab:

    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 wird aufgerufen, das im Manifest registriert ist, wenn das Token aktualisiert wird. Weitere Informationen finden Sie unter Firebase Cloud Messaging-Client-App unter Android einrichten.

    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. Implementieren Sie UjetRequestListener.onRequestPushToken in Ihrer Application-Klasse. UjetRequestListener.onRequestPushToken sollte das FCM/GCM-Token zurückgeben.

    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. Die Push-Benachrichtigung verarbeiten. Wenn die Verarbeitung der eigenen Push-Benachrichtigungen von der Contact Center AI Platform (CCAI Platform) übernommen werden soll, können Sie die Daten direkt an UjetPushHandler.handle() übergeben.

    • Die Anwendung verarbeitet nur Nachrichten, bei denen das Feld ujet_noti_type (oder noti_type zur Abwärtskompatibilität) festgelegt ist.

    • Andernfalls können Sie festlegen, dass nur Nachrichten mit ujet_noti_type bis UjetPushHandler.handle() zur Verarbeitung gesendet werden.

    Hier sehen Sie ein Beispiel für eine Push-Benachrichtigung:

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

FCM-Nachricht verarbeiten

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
        }
    }
}

GCM-Nachricht verarbeiten

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
        }
    }
}

GCM-Nachricht in GcmReceiver verarbeiten (alte Methode)

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
        }
    }
}

App starten

Fügen Sie die folgende Zeile an der Stelle ein, an der die Anwendung gestartet werden soll (ohne Parameter):

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

Sie können das Android SDK auch ohne den Splashscreen starten.

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

Ujet.start(ujetStartOptions);

Sie können das Android SDK auch über einen Direct Access Point an einem bestimmten Punkt im Menü starten:

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

Ujet.start(ujetStartOptions);

Der menuKey kann mit einem Direct Access Point im CCAI Platform-Portal (mit Administratorrolle) erstellt werden.

  1. Gehe zu Einstellungen > Warteschlange.

  2. Wählen Sie eine beliebige Warteschlange aus der Menüstruktur aus.

  3. Setzen Sie ein Häkchen bei Direkten Zugriffspunkt erstellen.

  4. Geben Sie den Schlüssel in das Textformular ein.

  5. Klicken Sie auf Speichern.

Sie können das Android SDK auch mit einer bestimmten Ticket-ID starten, um sie an das CRM zu übergeben. Diese Ticket-ID wird geöffnet, wenn eine Chat- oder Anrufverbindung hergestellt wird.

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

Ujet.start(ujetStartOptions);

Benutzerdefinierte Daten an Ihr CRM senden

Benutzerdefinierte Daten können an Kundenservicemitarbeiter gesendet werden und werden im Support-Ticket für den eingehenden Anruf/Chat angezeigt.

Es gibt zwei Methoden zum Senden benutzerdefinierter Daten:

  • Signierte Methode: Vordefinierte Datensignierung mit JWT.

  • Methode ohne Signatur: Vordefinierte Daten mit einfachem JSON (nicht empfohlen).

Benutzerdefinierte Daten mit der signierten Methode senden

Wenn Sie benutzerdefinierte Daten mit der signierten Methode senden möchten, müssen Sie eine Signierungsmethode implementieren.

Rufen Sie zuerst benutzerdefinierte Daten für Ihre Host-App ab und senden Sie sie dann zum Signieren an Ihren Server. Auf Ihrem Server können Sie zusätzliche Daten über ein definiertes Formular hinzufügen. Signieren Sie sie mit dem Secret Ihres Unternehmens und geben Sie sie dann per JWT zurück.

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));
        }
        // ...
    }
}

Senden benutzerdefinierter Daten mit der unsignierten Methode

Google empfiehlt, die signierte Methode zum Senden benutzerdefinierter Daten in Ihrer Anwendung zu verwenden. Weitere Informationen finden Sie unter Benutzerdefinierte Daten mit der signierten Methode senden.

Sie können nicht signierte Daten senden, indem Sie das Android SDK mit Startoptionen starten, um benutzerdefinierte Daten mit UjetStartOptions.Builder#setUnsignedCustomData festzulegen. UjetTokenCallback sollte onToken(null) aufrufen.

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);

Nicht signierte benutzerdefinierte Daten zum Senden eines externen Chat-Transkripts verwenden

Sie können das externe Chat-Transkript zu Beginn an die CCAI-Plattform senden und dabei unsignierte benutzerdefinierte Daten verwenden. Verwenden Sie UjetCustomData.putObject("external_chat_transfer", hashMapObject), um die Transkriptdaten im JSON-Format festzulegen:

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);

JSON-Format:

  • greeting_override: String

  • agent: Wörterbuch

    • name: String

    • avatar: String [URL des Agenten-Avatars, optional]

  • transcript: Array

    • sender: string ["end_user" or "agent"]

    • timestamp: string [z. B. „2021-03-15 12:00:00Z“]

    • content: Array

      • type: String [einer von „text“, „media“]

      • text: String [für Texttyp erforderlich]

      • media: dictionary [für Medientyp erforderlich]

        • type: String [eines von „image“, „video“]

        • url: String [öffentliche URL, die auf die Media-Datei verweist]

JSON-Beispiel:

{
    "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"
            }
        ]
        }
    ]
}

Sie können Markdown für den Texttyp verwenden. Die folgenden Formate werden unterstützt:

  • Fett

  • Kursiv

  • Unterstrichen

  • Zeilenumbrüche

  • Aufzählungsliste

  • Nummerierte Liste

  • Links

Benutzerdefiniertes Datenformat

In diesem Abschnitt wird das Format der benutzerdefinierten Daten beschrieben, die im JWT übergeben werden können.

JSON-Codierung in JWT

Das JSON sollte „iat“ und „exp“ enthalten, um das JWT zu validieren. Das Objekt der benutzerdefinierten Daten ist der Wert des custom_data-Schlüssels.

{
    "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"
        }
    }
}

Der Schlüssel ist eine eindeutige Kennung für die Daten. Der Typ ist der Typ des Werts.

  • string

    • JSON-String
  • number

    • Ganzzahl, Gleitkommazahl
  • date

    • UTC-Unix-Zeitstempelformat mit 13 Ziffern. (enthält Millisekunden)
  • url

    • HTTP-URL-Format

Das Label ist der Anzeigename auf der CRM-Seite.

Anzeige benutzerdefinierter Daten verhindern

Sie können die Eigenschaft invisible_to_agent mit einem benutzerdefinierten Datenobjekt verwenden, um zu verhindern, dass signierte oder nicht signierte benutzerdefinierte Daten im Agent-Adapter angezeigt werden. Im vorherigen Beispiel wird die Sozialversicherungsnummer des Endnutzers nicht im Agent-Adapter angezeigt, da "invisible_to_agent" : true im Objekt ssn enthalten ist.

Wenn Sie die Property "invisible_to_agent" : true in ein benutzerdefiniertes Datenobjekt einfügen, können Sie mit dem folgenden Verhalten rechnen:

  • Die benutzerdefinierten Daten sind in der Datei mit Sitzungsmetadaten enthalten.
  • Die benutzerdefinierten Daten sind nicht in CRM-Datensätzen enthalten.

Weitere Informationen finden Sie unter Sitzungsdaten im Agent-Adapter ansehen.

Reservierte Daten-Properties

Sie können reservierte Dateneigenschaften als signierte benutzerdefinierte Daten an die Contact Center AI Platform (CCAI Platform) senden, wenn eine Sitzung beginnt. Weitere Informationen finden Sie unter Reservierte Datenattribute senden.

Im Folgenden finden Sie ein Beispiel für reservierte Datenattribute in benutzerdefinierten Daten:

  {
    "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"
      }
    }
  }
  

Ersetzen Sie Folgendes:

  • VERIFIED_CUSTOMER_BOOLEAN: „True“, wenn Sie diesen Endnutzer als legitimen Kunden betrachten.
  • VERIFIED_BAD_ACTOR_BOOLEAN: „True“, wenn Sie diesen Endnutzer als potenziell böswilligen Akteur betrachten.
  • REPEAT_CUSTOMER_BOOLEAN: „True“, wenn Sie festgestellt haben, dass dieser Endnutzer Ihr Contact Center bereits kontaktiert hat.

SDK-Konfiguration

Sie können mehrere Optionen konfigurieren, bevor Sie das Android SDK starten. Weitere Informationen finden Sie in der Klasse UjetOption. Die in der folgenden Tabelle beschriebenen Optionen „Fallback-Telefonnummer“ und „Netzwerksensibilität“ funktionieren nur, wenn im CCAI Platform-Portal unter Einstellungen > Entwicklereinstellungen > MMA > Bearbeiten die Ein/Aus-Schaltfläche PSTN-Fallback aktivieren aktiviert ist. Wenn die Ein/Aus-Schaltfläche PSTN-Fallback aktivieren deaktiviert ist, wird kein PSTN-Fallback ausgeführt. Die CCAI Platform verwendet die standardmäßige Netzwerkempfindlichkeit (0,85) zum Prüfen von Netzwerkverbindungen.

Option Beschreibung Wert Standardwert
Protokollebene Protokollebene, die in Logcat ausgegeben werden soll. Ganzzahl. Das gilt auch für die Logebene für Android-Logs. (Min.: 2, Max.: 7) 5 (Log.Warn)
Standardsprache Der Standardsprachcode. String. Ein ISO 639-Sprachcode. (z.B. „en“ für Englisch) null
Fallback-Telefonnummer Die Telefonnummer wird als Fallback verwendet, wenn keine Internetverbindung verfügbar ist oder die repräsentative Telefonnummer für das Unternehmen nicht im Admin-Portal vorhanden ist. String. Telefonnummer. null
Handler für nicht abgefangene Ausnahmen aktiviert Aktivieren Sie den Handler für nicht abgefangene Ausnahmen. Wenn true, werden alle nicht abgefangenen SDK-Ausnahmen zur Laufzeit von der App mit Thread.setDefaultUncaughtExceptionHandler verarbeitet. Wenn dieselbe Ausnahme jedoch zweimal auftritt, stürzt die App ab. Boolescher Wert. true
Netzwerksensibilität Die Empfindlichkeit für die Prüfung des Netzwerkstatus. Double zwischen 0 und 1, wobei 0 die am wenigsten und 1 die am stärksten sensible Variable ist. Bei einem Wert von 1 wird immer auf einen PSTN-Anruf zurückgegriffen. Wenn Sie diese Option verwenden, empfehlen wir, mit dem Wert .97 zu beginnen. Der Wert aus dem Portal unter Einstellungen > Entwicklereinstellungen > Mobile Apps > Fallback (Telefonnummer-Schwellenwert) überschreibt diesen Wert. 0.85
Dunkler Modus aktiviert Aktivieren Sie das dunkle Design. Wenn true, wendet das SDK ein Design für den dunklen Modus an, wenn der Nutzer den dunklen Modus aktiviert. Andernfalls wird die Aktion ignoriert. Boolescher Wert. false
Einzelner Kanal aktiviert Konfigurationsoption zum Anzeigen oder Umgehen des Kanalauswahlbildschirms für einen einzelnen Channel. Wenn true, zeigt das SDK einen einzelnen Bildschirm zur Kanalauswahl an, anstatt den Kanal automatisch auszuwählen, auch wenn nur ein Kanal in der Menüwarteschlange aktiviert ist. Boolescher Wert. false
Anrufansicht automatisch minimieren Konfigurationsoption zum automatischen Minimieren der Benutzeroberfläche des ersten Anrufbildschirms oder zum Warten, bis der Nutzer sie minimiert. Boolescher Wert. false
Rahmen für Agentsymbol aktiviert Konfigurationsoption zum Einblenden oder Entfernen eines kreisförmigen Rahmens um das Agentsymbol. Boolescher Wert. false
Statische Schriftgröße in der Auswahlansicht Konfigurationsoption zum automatischen Anpassen oder Deaktivieren der Textgröße von Picker-Elementen. Boolescher Wert. false
Medienanhang im Chat ausblenden Konfigurationsoption zum Ein- oder Ausblenden des Symbols für Medienanhänge in der Chat-Benutzeroberfläche. Boolescher Wert. false
READ_PHONE_STATE-Berechtigung ignorieren Wenn true festgelegt ist, fordert das SDK die Berechtigung READ_PHONE_STATE nicht an. Wenn Sie keine In-App-IVR-Anrufe verwenden möchten, setzen Sie dieses Flag auf true, um die Berechtigung nicht anzufordern. Außerdem muss in Ihrer Anwendung die Berechtigung android.permission.READ_PHONE_STATE für das CCAI Platform SDK explizit entfernt werden. Wir raten davon ab, diese Einstellung auf true zu setzen, da diese Berechtigung für In-App-IVR-Anrufe erforderlich ist. Boolesch false
Cobrowse.io-Lizenzschlüssel (falls zutreffend) Konfigurationsoption zum Einrichten der Cobrowse.io-Bibliothek. Sie finden Ihren Cobrowse-Lizenzschlüssel, indem Sie sich in https://cobrowse.io/dashboard/settings anmelden und den Abschnitt Lizenzschlüssel aufrufen. String null
Benutzerdefinierter Titel für den Chat-Header Konfigurationsoption zum Anpassen des Titeltexts des Chat-Headers in der Chat-Benutzeroberfläche. String null
Kurzantworten in der Chat-Benutzeroberfläche anpassen Konfigurationsoption zum Anpassen von Kurzantworten des virtuellen Kundenservicemitarbeiters in der Chat-Benutzeroberfläche. Kurzantworten des virtuellen Kundenservicemitarbeiters werden standardmäßig gruppiert. Wenn Sie sie jedoch einzeln anzeigen möchten, können Sie mit dieser Konfigurationsoption „QuickReplyButtonsStyle.INDIVIDUAL“ festlegen. UjetStylesOptions QuickReplyButtonsStyle.GROUPED
Verschiedene Attribute der Chat-Benutzeroberfläche anpassen Konfigurationsoption zum Anpassen verschiedener Attribute wie Schriftart, Hintergrundfarbe und Symbol UjetStylesOptions null
Statusleiste ausblenden Konfigurationsoption zum Ein- oder Ausblenden der Statusleiste. Wenn der Wert „true“ ist, wird die Statusleiste im SDK ausgeblendet. Boolesch false
Ladesymbol-Drawable-Ressource festlegen Konfigurationsoption zum Anpassen der Ansicht des Ladesymbols in der gesamten App. Wenn sie nicht verfügbar oder null ist, wird die Standardladeansicht verwendet. Ganzzahl null
Querformat deaktiviert Deaktivieren Sie das Querformat. Wenn der Wert „true“ ist, wird die Ausrichtung im Querformat nicht angewendet. Boolesch false
Inline-Schaltfläche „Neue Unterhaltung starten“ im Chat ausblenden Konfigurationsoption zum Ein- oder Ausblenden der Inline-Schaltfläche „Neue Unterhaltung starten“ in der Chat-Benutzeroberfläche. Boolesch false
Schaltfläche zum Überspringen von CSAT-Umfragen anzeigen Konfigurationsoption zum Ein- oder Ausblenden der Schaltfläche zum Überspringen im Dialogfeld für die Umfrage zur Kundenzufriedenheit Boolesch false
Beenden von Chats durch Endnutzer blockieren Konfigurationsoption zum Ein- oder Ausblenden der Schaltfläche „Chat beenden“ in der Chat-Benutzeroberfläche Boolesch false
„Chattranskript herunterladen“ ausblenden Die Schaltfläche zum Herunterladen des Chat-Transkripts im Menü „Chat-Aktionen“ und in der Chat-Benutzeroberfläche ein- oder ausblenden Wenn Sie dem String ujet_common_hide ein Leerzeichen hinzufügen, verschwindet der Text Hide und es wird nur der Rückwärtspfeil angezeigt. Ganzzahl. Werte:

0 = Überall anzeigen

1 = Über das Optionsmenü ausblenden

2 = Auf dem Bildschirm „Beitrag“ ausblenden

3 = Ausblenden sowohl im Optionsmenü als auch auf dem Bildschirm nach dem Chat.

0

UjetOption.setBlockChatTerminationByEndUser

Push-Benachrichtigungen global deaktivieren Wenn Sie UjetOption.setPushNotificationsAllowed auf false festlegen, werden alle Abhängigkeiten von Push-Benachrichtigungen umgangen und Push-Benachrichtigungen erreichen keine Endnutzer. Boolesch 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()
        )

Fallback

Sie können UjetErrorListener für den Fallback bei unerwarteten Fehlern verwenden. Wenn Sie diesen Listener nicht festlegen oder „false“ zurückgeben, verarbeitet das Android SDK den Fehler.

Das Android SDK leitet Nutzer nur dann mit einer Fallback-Nummer zum Dialer weiter, wenn der Schalter „PSTN Fallback aktivieren“ unter Einstellungen > Entwicklereinstellungen > MMA > Pop-up bearbeiten EIN ist. Andernfalls wird das SDK beendet.

Fehlertyp Fehlercode Trigger
NETWORK_ERROR 1 Das Netzwerk ist nicht verfügbar. Dieser Fehler wird nicht ausgelöst, wenn das Netzwerk während eines Chats, Anrufs oder der Anzeige des Bewertungsbildschirms nicht verfügbar ist.
AUTHENTICATION_ERROR 100 Bei der Authentifizierung ist ein unerwarteter Fehler aufgetreten.
AUTHENTICATION_JWT_ERROR 101 Bei der JWT-Validierung ist ein unerwarteter Fehler aufgetreten (z.B. ein Parsing-Fehler).
VOIP_CONNECTION_ERROR 1000 Es konnte keine Verbindung zum VoIP-Anbieter hergestellt werden. Dies erfolgt über den Callback des VoIP SDK.
VOIP_LIBRARY_NOT_FOUND 1001 Ein Anruf sollte über einen VoIP-Anbieter verbunden werden, aber es konnte keiner gefunden werden. Dies kann passieren, wenn ein Entwickler das falsche SDK eingebunden oder die VoIP-Anbieterbibliothek nicht in seine Abhängigkeiten aufgenommen hat.
CHAT_LIBRARY_NOT_FOUND 1.100 Tritt auf, wenn die Chatbibliothek nicht gefunden werden konnte. Dies kann passieren, wenn ein Entwickler das falsche SDK eingebunden oder die Twilio Chat-Bibliothek nicht in seine Abhängigkeiten aufgenommen hat.
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());
    }
});

App-Berechtigungen

Für die App sind die folgenden Berechtigungen erforderlich. Sie werden bei Bedarf vom Nutzer angefordert.

Berechtigung Beschreibung
KAMERA Wird für Smart Actions zum Aufnehmen von Fotos und Videos verwendet
MIKROFON Ermöglicht der App, VoIP-Anrufe über Twilio zu verwenden
Speicherplatz Ermöglicht der App, Fotos und Videos zu speichern

Deeplink einrichten (optional)

Wenn Sie Smart Actions für einen IVR-Anruf (PSTN) verwenden möchten, müssen Sie Deep Linking in Ihrem Projekt einrichten.

Das Deeplink-Format ist ein eindeutiger URI, z. B.:

ujet:// <package_name>/smartchannel.

Außerdem müssen Sie diesen Link oder eine URL, die zu diesem Link weiterleitet, im Admin-Portal festlegen (Einstellungen > Betriebsverwaltung > SMS zum Herunterladen der App senden aktivieren).

Sie müssen Ihrem Manifest einen Intent-Filter hinzufügen, der den Deeplink enthält.

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

Bevorzugter Channel

Mit dem Parameter „Preferred Channel“ (Bevorzugter Channel) können Sie Nutzer direkt zu einem bestimmten Channel weiterleiten. Der Endnutzer überspringt dann den Schritt zur Kanalauswahl und nimmt direkt über den im Parameter „Preferred Channel“ angegebenen Kanal Kontakt auf.

UjetStartOptions.preferredChannel

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

Terminbenachrichtigungen

Sie können optional UjetEventListener festlegen, um Benachrichtigungen zu Anwendungsereignissen zu erhalten.

Hier finden Sie eine Liste der verfügbaren Ereignistypen und Beschreibungen.

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());
    }
});
Ereignistyp Beschreibung Im Ereignis enthaltene Daten
EmailClicked Wird ausgelöst, wenn der Endnutzer auf den E‑Mail-Channel klickt. Warteschlangenmenüdaten
EmailSubmitted Wird ausgelöst, wenn der Endnutzer eine E‑Mail sendet. Menüdaten in die Warteschlange stellen, per E-Mail gesendete Daten
SessionPaused Wird ausgelöst, wenn der Endnutzer eine Chat- oder Anrufsitzung minimiert. Sitzungsdaten
SessionResumed Wird ausgelöst, wenn der Endnutzer aus dem Hintergrund zu einer Chat- oder Anrufsitzung zurückkehrt. Sitzungsdaten
SessionCreated Wird ausgelöst, wenn eine Chat- oder Anrufsitzung erstellt wird. Daten aus dem Warteschlangenmenü, Daten zur erstellten Sitzung
SessionEnded Wird ausgelöst, wenn eine Chat- oder Anrufsitzung beendet wird. Daten zum Warteschlangenmenü, Daten zur Erstellung von Sitzungen, Daten zum Beenden von Sitzungen
SdkTerminated Wird ausgelöst, wenn das SDK geschlossen wird, auch wenn es unerwartet geschlossen wird. Daten zum eingestellten SDK
ContentCardClicked Wird ausgelöst, wenn auf eine Inhaltskarte geklickt wird. Daten zu Klicks auf Inhaltskarten
ContentCardButtonClicked Wird ausgelöst, wenn auf eine Schaltfläche auf einer Inhaltskarte geklickt wird. Daten zu Klicks auf Buttons auf Inhaltskarten
QuickReplyClicked Wird ausgelöst, wenn auf eine Kurzantwort geklickt wird. Daten zu Klicks auf Kurzantworten
MessageLinkClicked Wird ausgelöst, wenn auf einen Link geklickt wird. Daten zu angeklickten Nachrichtenlinks

Warteschlangenmenüdaten

Schlüssel Typ Beschreibung
event_name String Enthält den Ereignisnamen. Beispiel: „E-Mail angeklickt“.
application String Enthält den Anwendungsnamen. Beispiel: „Android“.
app_id String Enthält die App-Kennung, die mit Context.getPackageName() identisch ist.
app_version String Enthält den Namen und den Code der App-Version. Beispiel: „0.32.0 (123)“.
sdk_version String Enthält die SDK-Version. Beispiel: „0.32.0“.
timestamp String Enthält den Zeitstempel in UTC (im Format „yyyy-MM-dd'T'HH:mm:ss'Z'“).
device_model String Enthält das Modell des Nutzergeräts. Beispiel: „Google Pixel“.
device_version String Enthält die Version des Nutzergeräts. Beispiel: „10, Q, SDK 29“.
company String Enthält den Namen des Unternehmens. Beispiel: „Unternehmen“.
menu_name String Enthält den Namen des untergeordneten Knotens (letzte Menüauswahl des Nutzers). Beispiel: „Untermenü“.
menu_id String Enthält die ID des untergeordneten Knotens (letzte Menüauswahl des Nutzers). Beispiel: „123“.
menu_path String Enthält die vollständige Sequenz der vom Nutzer ausgewählten Menüs. Beispiel: „Übergeordnetes Menü / Untergeordnetes Menü / Untermenü“.
menu_key String Enthält den DAP-Schlüssel und ist optional. Beispiel: „special_user_menu“

E‑Mail-Daten

Schlüssel Typ Beschreibung
has_attachments Boolesch Gibt „True“ zurück, wenn die E-Mail Anhänge hat, andernfalls „False“.

Sitzungsdaten

Schlüssel Typ Beschreibung
event_name String Enthält den Ereignisnamen. Beispiel: „E-Mail angeklickt“.
type String Enthält den Sitzungstyp. Beispiel: „chat“ oder „call“.
timestamp String Enthält den Zeitstempel in UTC (im Format „yyyy-MM-dd'T'HH:mm:ss'Z'“).

Daten zur Erstellung von Sitzungen

Schlüssel Typ Beschreibung
session_id String Enthält die Sitzungs-ID. Beispiel: „100“.
type String Enthält den Sitzungstyp. Beispiel: „chat“ oder „call“.
end_user_identifier String Enthält die Endnutzer-ID. Beispiel: „Max“.
messages_end_user String Enthält die Anzahl der Endnutzernachrichten und ist nur für Chatsitzungen enthalten. Beispiel: „3“.
messages_agent String Enthält die Anzahl der Agentennachrichten und ist nur für Chatsitzungen enthalten. Beispiel: „3“.

Daten zum Ende der Sitzung

Schlüssel Typ Beschreibung
agent_name String Enthält den Namen des Kundenservicemitarbeiters. Beispiel: „Max“.
ended_by String Enthält Details dazu, wer die Sitzung beendet hat. Mögliche Werte sind „agent“ (wenn der Kundenservicemitarbeiter die Sitzung beendet), „end_user“ (wenn der Endnutzer die Sitzung beendet), „timeout“ (wenn das Zeitlimit für den Chat erreicht ist) oder „dismissed“ (wenn der Chat geschlossen wird).
duration String Enthält die Sitzungsdauer in Sekunden und ist nur für Anrufsitzungen enthalten. Beispiel: „30 Sekunden“.

Daten zum eingestellten SDK

Schlüssel Typ Beschreibung
event_name String Enthält den Ereignisnamen. Beispiel: „E-Mail angeklickt“.

Daten zu Klicks auf Inhaltskarten

Schlüssel Typ Beschreibung
title String Der Titel der Karte.
title String Der Titel der Karte.
subtitle String Der Untertitel der Karte.
body String Die Beschreibung der Inhaltskarte.
link String Einen Link zu einer Webseite oder einen Deeplink. Das SDK nutzt die Funktionen des Betriebssystems, um die Datei zu öffnen.
event_params dictionary Ein Dictionary mit zusätzlichen Informationen zum Klickereignis. Das SDK verwendet diese.

Daten zu Klicks auf Schaltflächen auf Inhaltskarten

Schlüssel Typ Beschreibung
title String Der Titel der Karte.
title String Der Titel der Karte.
link String Einen Link zu einer Webseite oder einen Deeplink. Das SDK nutzt die Funktionen des Betriebssystems, um die Datei zu öffnen.
event_params dictionary Ein Dictionary mit zusätzlichen Informationen zum Klickereignis. Das SDK verwendet diese.

Daten zu Klicks auf Kurzantworten

Schlüssel Typ Beschreibung
title String Der Titel der Karte.
title String Der Titel der Karte.
link String Einen Link zu einer Webseite oder einen Deeplink. Das SDK nutzt die Funktionen des Betriebssystems, um die Datei zu öffnen.
event_params dictionary Ein Dictionary mit zusätzlichen Informationen zum Klickereignis. Das SDK verwendet diese.

Daten zu angeklickten Nachrichtenlinks

Schlüssel Typ Beschreibung
event_name String Enthält den Ereignisnamen, z. B. „Auf Nachrichtenlink geklickt“.
link String Einen Weblink oder einen Deeplink. Das SDK nutzt die Funktionen des Betriebssystems, um die Datei zu öffnen.

Änderungen beim Verhalten bei eingehenden Anrufen

Ab Geräten mit Android 10 werden eingehende Anrufe nicht direkt an Endnutzer weitergeleitet, wenn sich die Host-App im Hintergrund befindet. Stattdessen werden Nutzer über Benachrichtigungen über eingehende Anrufe informiert (auch wenn das Smartphone gesperrt ist). Sie haben dann die Möglichkeit, den Anruf anzunehmen oder abzulehnen.

Wir zeigen dieselben Benachrichtigungen an, wenn die Host-App im Hintergrund ausgeführt wird und der Bildschirm gesperrt ist, bevor ein eingehender Anruf eingeht. Diese Verhaltensänderung erfolgt, um die aktuellen Einschränkungen von Google für das Starten von Aktivitäten zu erfüllen, wenn sich die App im Hintergrund befindet. Das Verhalten wird nicht beeinträchtigt, wenn die Host-App im Vordergrund ausgeführt wird oder auf Geräten mit einer niedrigeren Android-Version als Android 10.

SDK-Sitzung anpassen

In diesem Abschnitt wird beschrieben, wie das SDK weiter angepasst werden kann.

Nach einer bestehenden Sitzung suchen

Prüfen Sie vor dem Start einer Sitzung mit der beschriebenen Methode, ob eine Sitzung vorhanden ist oder gerade läuft. Wenn es vorhanden ist, können Sie den Endnutzer auffordern, es fortzusetzen oder abzubrechen.

Das ist besonders wichtig, wenn ein Nutzer geändert wird.

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

Verbindung zur Sitzung trennen

Verwenden Sie die Methode, wenn Sie eine laufende Sitzung trennen möchten.

Bevor Sie diese Methode verwenden, sollten Sie mit Ujet.getStatus() prüfen, ob eine solche Sitzung vorhanden ist. Wenn Sie nach dem Trennen der Verbindung durch das SDK eine oder mehrere Aktionen ausführen möchten, z. B. eine Nachricht anzeigen oder die App schließen, können Sie den Antwort-Callback onFinished() verwenden, wie im nächsten Abschnitt beschrieben. Andernfalls legen Sie den Callback auf „null“ fest.

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

Endnutzerdaten aus dem Cache löschen

Sie sind dafür verantwortlich, den Cache zu leeren, wenn nutzerbezogene Daten in Ihrer App aktualisiert oder geändert wurden. Wenn sich der Endnutzer beispielsweise abgemeldet hat, rufen Sie die Methode zum Entfernen des Cache für diesen Nutzer auf, damit beim nächsten Start des SDK eine neue Sitzung für den neuen Endnutzer gestartet wird.

Ujet.clearUserData();

SDK ausblenden

Sie können das SDK mit der Methode Ujet.hideSDK() ausblenden. Das ist beispielsweise nützlich, wenn das SDK die Benutzeroberfläche Ihrer App beeinträchtigt. Initialisieren Sie das SDK mit Ujet.init(), bevor Sie diese Methode aufrufen. Ujet.init() gibt true zurück, wenn das SDK erfolgreich ausgeblendet wurde, und false, wenn nicht. Nachdem Sie das SDK ausgeblendet haben, können Sie es mit der Methode Ujet.start() wieder starten.

Im folgenden Beispiel wird das SDK ausgeblendet:

Ujet.hideSDK();

Spracheinstellung

Das Android SDK verwendet die folgende Prioritätsreihenfolge, um die Sprache zu bestimmen.

  1. Die Sprache wird auf dem Splash-Screen in der App ausgewählt.

  2. Die Standardsprache wird mit UjetOptions ausgewählt. Sie können die Standardsprache mit setDefaultLanguage("en") in UjetOptions festlegen. Weitere Informationen finden Sie im Abschnitt „Standardsprache“ unter „SDK-Konfiguration“.

  3. Die auf dem Gerät ausgewählte Gerätesprache (über Einstellungen > Allgemein > Sprache) wird verwendet, sofern sie von der App unterstützt wird.

  4. Der nächstgelegene Dialekt der Gerätesprache wird verwendet, wenn die App die Gerätesprache nicht unterstützt, aber den nächstgelegenen übergeordneten Dialekt. Wenn der Nutzer beispielsweise Spanisch (Kuba) als Sprache auf dem Gerät ausgewählt hat und die App Spanisch (Kuba) nicht, aber Spanisch unterstützt, wird Spanisch verwendet.

  5. Wenn die Gerätesprache von der App nicht unterstützt wird, wird Englisch als Standardsprache verwendet.

Symbole für externe Umleitungslinks konfigurieren

Passen Sie das Symbol im Channel „External Deflection Link“ an, indem Sie es in einen Drawable-Ordner Ihrer App hochladen. Achten Sie darauf, dass Sie beim Erstellen des externen Weiterleitungslinks im CCAI Platform-Portal unter Settings > Chat > External Deflection Links > View links > Add Deflection Link denselben Symbolnamen verwenden.

Wenn der Symbolname im CCAI Platform-Portal nicht mit dem in die App hochgeladenen Symbol übereinstimmt, wird im Android SDK das Standardsymbol verwendet.

Symbol „Vielen Dank“ für Umfragen konfigurieren

Sie können das Symbol auf der Seite „Vielen Dank“ für Umfragen anpassen oder überschreiben, indem Sie ein Symbol in den Drawable-Ordner Ihrer App hochladen und den Dateinamen ujet_survey_thank_you_icon als Symbolnamen verwenden.

Anpassen (optional)

In diesem Abschnitt wird beschrieben, wie Sie bestimmte Werte im SDK anpassen können.

Strings

Sie können in der Datei „strings.xml“ die Schlüssel für die einzelnen Strings überschreiben, um die in der Anwendung verwendeten Strings anzupassen.

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

Umfragekonfiguration

Anpassung der Textgröße

Passen Sie die Größe von Titel, Beschreibung und Auswahltext in der Anwendung an, indem Sie die folgenden Schlüssel in „dimens.xml“ überschreiben.

Die anpassbaren Textgrößen sind unten aufgeführt:

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

Design

So passen Sie das Design und den Hintergrund an: Schritt 1 bezieht sich auf das Design und Schritt 2 auf den Hintergrund.

  1. Passen Sie das Design an, indem Sie die Schlüssel für die einzelnen Stilelemente in „style.xml“ überschreiben. Beispiel:

    <!--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. Sie können die Hintergrundfarbe in der Anwendung anpassen, indem Sie die Schlüssel für die einzelnen Stilelemente in „style.xml“ überschreiben. Die anpassbare Hintergrundfarbe ist im Screenshot zu sehen.

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

Titel des Chat-Headers anpassen

Es gibt Optionen, um den Titeltext des Chat-Headers in der Chat-Benutzeroberfläche anzupassen.

Sie können den Titeltext der Chatüberschrift mit den folgenden Optionen anpassen:

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

Sie können die Kurzantworten des virtuellen Kundenservicemitarbeiters in der Chatoberfläche mit den folgenden Optionen anpassen:

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

Inhaltskarten

Sie können neben der Chat-Anpassung auch Anpassungen für Inhaltskarten hinzufügen. Sie können dies entweder über die JSON-Datei (siehe content_card property in der Datei app/src/main/assets/json/ujet_styles.json) oder über die Klasse ContentCardStyle tun.

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",
            )
        )
    )
)

Design des Webformulars

Sie können die Webformular-Karte zusammen mit der Chatanpassung anpassen. Sie können dies entweder über die JSON-Datei (siehe das Attribut form_card in der Datei app/src/main/assets/json/ujet_styles.json) oder über die Klasse FormCardStyle tun.

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,
        ),
    )
)

Umfragen

Sie können das Symbol auf der Dankesseite der Umfrage ändern, indem Sie ein Symbol in den Drawable-Ordner Ihrer App hochladen.

Verwenden Sie ujet_survey_thank_you_icon als Symbolnamen.

Fehlerbehebung

Das Starten eines neuen Chats hat länger als 30 Sekunden gedauert

Prüfen Sie, ob Sie auf eine Delegatenmethode benutzerdefinierter Daten reagieren. Sie sollten auf Anfrage gültige benutzerdefinierte Daten zurückgeben oder einfach „null“ mit einem Callback zurückgeben. Verwenden Sie den folgenden Code als Referenz.

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

Erläuterung zur Erklärung im Hinblick auf die Richtlinie

Wenn Sie in der Google Play Console eine Benachrichtigung erhalten, in der Sie aufgefordert werden, eine Richtlinie für die vom Android SDK verwendeten Dienste oder Berechtigungen anzugeben, verwenden Sie eine der folgenden Erklärungen.

Dienste im Vordergrund deklarieren, die vom Android SDK verwendet werden

Google hat in Android 14 Typen für Dienste im Vordergrund eingeführt und vorgeschrieben, dass diese beim Starten von Diensten im Vordergrund angegeben werden müssen. Weitere Informationen finden Sie unter https://developer.android.com/about/versions/14/changes/fgs-types-required#remote-messaging. Das Android-SDK der Contact Center AI Platform (CCAI Platform) verwendet Dienste im Vordergrund, um Chats und Anrufe zu starten. Daher haben wir den Diensttyp FOREGROUND_SERVICE_REMOTE_MESSAGING für Chats verwendet, da es sich um Textnachrichten handelt, und den Diensttyp FOREGROUND_SERVICE_MICROPHONE für Anrufe. Ohne diese Diensttypen stürzt das SDK beim Starten von Chats oder Anrufen auf Geräten mit Android 14 ab.

Full-Screen-Intent-Berechtigung deklarieren, die vom Android SDK verwendet wird

Die Berechtigung „USE_FULL_SCREEN_INTENT“ ist erforderlich, um Push-Benachrichtigungen für eingehende Anrufe anzuzeigen, wenn das Gerät gesperrt ist. Der Endnutzer wird benachrichtigt und die Benachrichtigung über den eingehenden Anruf wird im Vollbildmodus angezeigt (so benachrichtigt die integrierte Telefon-App den Endnutzer über eingehende Anrufe).

Unterstützung von Android 15

So unterstützen Sie Android 15:

  1. Legen Sie compileSdkVersion = 35 und targetSdkVersion = 35 in Ihrer build.gradle(:app) fest.

  2. Achten Sie darauf, dass die Version des Android-Gradle-Plug-ins (AGP) in Ihrem Projekt 8.5.1 oder höher ist. Weitere Informationen finden Sie unter Verpackung Ihrer freigegebenen Bibliotheken aktualisieren.

  3. Installieren Sie das Java Development Kit (JDK) Version 17 oder höher, um Android-Projekte mit AGP 8.0 oder höher zu erstellen. Weitere Informationen finden Sie unter JDK 17 für AGP 8.0 erforderlich.