Android SDK 指南

本頁說明如何使用 Android SDK。

存取範例應用程式

如要下載 Android 範例應用程式,請按一下「Android example app」

如要使用 Android 行動 SDK 建立範例應用程式,您需要下列項目:

  • CCAI 平台入口網站的公司金鑰和公司密鑰。

  • Android 5.0 (API 級別 21,Lollipop) 以上版本。

  • Firebase 雲端通訊或 Google Cloud 訊息服務,用於推送通知。

  • 應用程式已遷移至 AndroidX。

Twilio SDK 升級規定

如果使用我們的套件直接整合 Android SDK,則必須使用特定版本的 Twilio SDK,否則可以忽略這項要求。

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

此外,Android SDK 中已包含 ProGuard 規則,可確保 Twilio Programmable Voice 程式庫不會遭到 ProGuard 移除,並在 ProGuard 意外移除程式庫時用於疑難排解。

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

為支援最新版 Twilio,Android SDK 0.34.0 版起,SDK 不再與以 Java 7 為目標的應用程式二進位檔相容。如要使用這個版本和日後發布的版本,開發人員必須將應用程式升級為以 Java 8 為目標。請參閱下列程式碼範例:

android {
    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
}

取得公司金鑰和公司密鑰

  1. 使用管理員憑證登入管理入口網站。

  2. 依序前往「設定」>「開發人員設定」>「公司金鑰和密碼」

  3. 擷取「公司金鑰」和「公司密碼」

安裝

在根專案的 Gradle 設定中新增 Android SDK 存放區。

build.gradle (Project)

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

設定公司設定

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

JWT 簽署

為確保安全,伺服器必須以 JWT 形式簽署使用者資訊。

範例應用程式包含 APIManager,供您測試,您需要在 mock/APIManager.java 中放入 UJET_COMPANY_SECRET。APIManager 必須實作一種方法,啟動非同步呼叫來簽署 JWT 驗證權杖,並傳回權杖。

在實際工作環境中,您必須在伺服器上實作簽署程序。

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

初始化 SDK

在 Android Application 類別的 onCreate 方法中初始化 SDK。

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

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

使用者驗證

終端使用者是透過應用程式與客戶支援團隊聯絡的消費者。

為在應用程式中驗證使用者,我們導入了 JWT 簽署機制。

Android SDK 需要驗證時,會要求簽署酬載。如果簽署成功,應用程式會將已簽署的 JWT 換成使用者的授權權杖。

ExampleApplication 中,您應實作 UjetRequestListener 介面,用於簽署驗證權杖和自訂資料。

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

詳情請參閱使用者驗證

設定推播通知

本節說明如何啟用行動推播通知。

準備 Firebase

請準備好 Firebase 專案。

如果您已有專案,可以使用自己的專案並略過這個程序。

  1. Firebase 主控台中建立 Firebase 專案。

  2. 在 Firebase 控制台的「設定」>「一般」中,下載 google-services.json。

  1. 前往 Firebase 控制台的「設定」>「雲端通訊」,取得伺服器金鑰。

新增服務帳戶金鑰

您必須在行動應用程式中新增服務帳戶金鑰,才能接收推播通知。如要取得服務帳戶金鑰,請參閱「以服務帳戶進行驗證」。

如要在行動應用程式中新增服務帳戶金鑰,請按照下列步驟操作:

  1. 在 CCAI Platform 入口網站中,依序點選「Settings」>「Developer Settings」。 如果沒有看到「設定」選單,請按一下「選單」圖示

  2. 前往「行動應用程式」窗格。

  3. 按一下應用程式旁的「編輯」,系統會顯示「編輯行動應用程式」對話方塊。

  4. 在「服務帳戶」欄位中,輸入服務帳戶金鑰,然後按一下「儲存」

設定 Android 用戶端

  1. google-services.json 複製到應用程式目錄,例如 PROJECT_ROOT/app/google-services.json

  2. 使用下列程式碼取得 FCM 權杖:

    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。詳情請參閱「在 Android 上設定 Firebase 雲端訊息用戶端應用程式」。

    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. 在 Application 類別中導入 UjetRequestListener.onRequestPushTokenUjetRequestListener.onRequestPushToken 應傳回 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. 處理推播通知。如要讓 Contact Center AI Platform (CCAI Platform) 處理自己的推送訊息,可以直接將資料傳遞至 UjetPushHandler.handle()

    • 應用程式只會處理已設定 ujet_noti_type (或 noti_type,適用於回溯相容性) 欄位的訊息。

    • 否則,您可以選擇只將含有 ujet_noti_type 的訊息傳送至 UjetPushHandler.handle() 進行處理。

    以下是推播通知訊息的範例:

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

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

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

在 GcmReceiver 中處理 GCM 訊息 (舊方法)

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

開始申請

在要啟動應用程式的位置新增下列程式碼行 (不含任何參數):

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

您也可以啟動 Android SDK,而不顯示啟動畫面。

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

Ujet.start(ujetStartOptions);

您也可以使用直接存取點,透過這個鍵從選單中的特定位置啟動 Android SDK:

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

Ujet.start(ujetStartOptions);

menuKey 可在 CCAI 平台入口網站中建立 (需具備管理員角色)。

  1. 依序前往「設定」>「佇列」

  2. 從選單結構中選取任一佇列。

  3. 勾選「建立直接存取點」

  4. 在文字表單中輸入金鑰。

  5. 按一下 [儲存]

您也可以使用特定工單 ID 啟動 Android SDK,並將該 ID 傳遞至 CRM。連線後,系統會開啟這個案件 ID。

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

Ujet.start(ujetStartOptions);

將自訂資料傳送至 CRM

自訂資料可以傳送給支援服務專員,並顯示在來電/即時通訊的支援服務單中。

傳送自訂資料的方法有兩種:

  • 簽署方法:使用 JWT 預先定義資料簽署。

  • 未簽署的方法:使用純 JSON 的預先定義資料 (不建議)。

使用已簽署的方法傳送自訂資料

如要使用簽署方法傳送自訂資料,請導入簽署方法。

首先,請將自訂資料擷取至主機應用程式,然後傳送至伺服器進行簽署。您可以在伺服器上使用已定義的表單新增其他資料。 使用公司密鑰簽署,然後以 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));
        }
        // ...
    }
}

使用未簽署的方法傳送自訂資料

Google 建議您使用簽署方法,在應用程式中傳送自訂資料。詳情請參閱「使用簽署方法傳送自訂資料」。

您可以透過啟動 Android SDK 並設定啟動選項,使用 UjetStartOptions.Builder#setUnsignedCustomDataUjetTokenCallback 設定自訂資料,然後呼叫 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);

使用未簽署的自訂資料傳送外部對話記錄

開始對話時,您可以使用未簽署的自訂資料,將外部即時通訊記錄傳送至 CCAI Platform。使用 UjetCustomData.putObject("external_chat_transfer", hashMapObject) 將 JSON 格式的轉錄稿資料設為如下:

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 格式:

  • greeting_override:字串

  • agent:字典

    • name:字串

    • avatar:字串 [服務專員顯示圖片網址,選用]

  • transcript:陣列

    • sender:字串 (「end_user」或「agent」)

    • timestamp:字串 [即「2021-03-15 12:00:00Z」]

    • content:陣列

      • type:字串 [text、media 其中之一]

      • text:字串 [文字類型為必填]

      • media:字典 [媒體類型必填]

        • type:字串 [image、video 其中之一]

        • url:字串 [指向媒體檔案的公開網址]

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

您可以在文字類型中使用 Markdown。支援的格式如下:

  • 粗體

  • 斜體

  • 底線

  • 換行

  • 項目符號清單

  • 編號清單

  • 連結

自訂資料格式

本節說明可在 JWT 中傳遞的自訂資料格式。

以 JWT 編碼的 JSON

JSON 應包含 iat 和 exp,以驗證 JWT。自訂資料的物件是 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"
        }
    }
}

金鑰是資料的專屬 ID。類型是值的類型。

  • string

    • JSON 字串
  • number

    • 整數、浮點數
  • date

    • 世界標準時間 Unix 時間戳記格式,長度為 13 位數。(包含毫秒)
  • url

    • HTTP 網址格式

標籤是 CRM 頁面上的顯示名稱。

禁止顯示自訂資料

您可以搭配自訂資料物件使用 invisible_to_agent 屬性,防止簽署或未簽署的自訂資料顯示在代理程式介面卡中。在上一個範例中,由於 "invisible_to_agent" : true 包含在 ssn 物件中,因此代理程式介面卡不會顯示使用者的身分證字號。

如果您在自訂資料物件中加入 "invisible_to_agent" : true 屬性,可能會發生下列情況:

詳情請參閱「在代理程式轉接程式中查看工作階段資料」。

保留資料屬性

工作階段開始時,您可以將預留的資料屬性以簽署的自訂資料形式,傳送至 Contact Center AI 平台 (CCAI 平台)。詳情請參閱傳送保留的資料屬性

以下是自訂資料中保留的資料屬性範例:

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

更改下列內容:

  • VERIFIED_CUSTOMER_BOOLEAN:如果您認為這個使用者是正當客戶,則為 True。
  • VERIFIED_BAD_ACTOR_BOOLEAN:如果您認為這個使用者可能是惡意行為人,請設為 True。
  • REPEAT_CUSTOMER_BOOLEAN:如果您判斷這位使用者先前曾與聯絡中心聯絡,則為 True。

SDK 設定

啟動 Android SDK 前,您可以設定多個選項。請參閱 UjetOption 類別。下表所述的「備用電話號碼」和「網路敏感度」選項,只有在 CCAI Platform 入口網站的「設定」>「開發人員設定」>「MMA」>「編輯」中,啟用 PSTN 備援切換鈕開啟時才會生效。如果關閉「啟用 PSTN 備用模式」切換鈕,系統就不會切換至 PSTN。CCAI Platform 會使用預設網路敏感度 (0.85) 檢查網路連線。

選項 說明 預設值
記錄檔層級 要在 Logcat 中列印的記錄層級。 整數。與 Android 記錄的記錄層級相同。(最小值:2,最大值:7) 5 (Log.Warn)
預設語言 預設語言代碼。 字串。ISO 639 語言代碼。(例如,以「en」表示英文) null
備用電話號碼 如果無法連上網際網路,或管理入口網站中沒有公司的代表電話號碼,系統就會使用這個電話號碼做為備用選項。 字串。電話號碼。 null
已啟用未捕捉到的例外狀況處理常式 啟用未偵測到的例外狀況處理常式。如果是 true,應用程式會在執行階段使用 Thread.setDefaultUncaughtExceptionHandler 處理所有未擷取的 SDK 例外狀況。不過,如果發生兩次相同的例外狀況,應用程式就會當機。 布林值。 true
網路靈敏度 檢查網路狀態的靈敏度。 介於 01 之間,其中 0 是最不敏感的,1 則是最敏感的。如果值為 1,系統一律會改用 PSTN 通話。如果使用這項功能,建議您先將值設為 .97。「設定」>「開發人員設定」>「行動應用程式」>「備用」電話號碼門檻下的 Portal 值會覆寫這個值。 0.85
已啟用深色模式 啟用深色模式主題。如果 true,SDK 會在使用者開啟深色模式時套用深色模式主題,否則會忽略這項動作。 布林值。 false
已啟用單一管道 設定選項:顯示或略過單一頻道的頻道選擇畫面。如果 true,即使選單佇列中只啟用一個頻道,SDK 仍會顯示單一頻道選取畫面,而不是自動選取頻道。 布林值。 false
自動縮小通話畫面 設定選項,可預設自動將初始通話畫面 UI 縮到最小,或等待使用者縮小。 布林值。 false
已啟用服務專員圖示邊框 設定選項:顯示或移除代理程式圖示周圍的圓形邊框。 布林值。 false
挑選器檢視區塊中的靜態字型大小 設定選項,可自動調整或停用挑選器項目文字大小。 布林值。 false
隱藏即時通訊中的媒體附件 設定選項,可在即時通訊使用者介面中顯示或隱藏媒體附件圖示。 布林值。 false
忽略 READ_PHONE_STATE 權限 如果設為 true,SDK 就不會要求 READ_PHONE_STATE 權限。如不想使用應用程式內 IVR 通話,請將這個旗標設為 true,避免要求這項權限,且應用程式需要明確移除 CCAI Platform SDK 的 android.permission.READ_PHONE_STATE 權限。請注意,我們不建議將這項設定設為 true,因為應用程式內 IVR 通話必須有這項權限才能運作。 布林值 false
Cobrowse.io 授權金鑰 (如適用) 設定 Cobrowse.io 程式庫的設定選項。登入 https://cobrowse.io/dashboard/settings,然後前往「授權金鑰」部分,即可找到 Cobrowse 授權金鑰。 字串 null
自訂即時通訊標題 設定選項,可在即時通訊 UI 中自訂即時通訊標題文字。 字串 null
自訂即時通訊使用者介面快速回覆 設定選項,可在即時通訊 UI 中自訂虛擬服務專員的快速回覆。虛擬服務專員的快速回覆預設會分組顯示,但如要個別顯示,可以使用這個設定選項設定 QuickReplyButtonsStyle.INDIVIDUAL UjetStylesOptions QuickReplyButtonsStyle.GROUPED
自訂即時通訊 UI 的各種屬性 設定選項,可自訂字型、背景顏色、圖示等各種屬性。 UjetStylesOptions null
隱藏狀態列 設定選項,可顯示或隱藏狀態列。如果值為 true,SDK 就會隱藏狀態列。 布林值 false
設定載入中旋轉圖示可繪製資源 設定選項,可在整個應用程式中自訂載入微調器檢視畫面。如果這個選項無法使用或為空值,系統會使用預設載入檢視畫面。 整數 null
已停用橫向顯示比例 停用橫向模式。如果值為 true,系統就不會套用橫向模式。 布林值 false
隱藏即時通訊中的「發起新對話」內嵌按鈕 設定選項,可在即時通訊使用者介面中顯示或隱藏「發起新對話」內嵌按鈕。 布林值 false
顯示顧客滿意度略過按鈕 設定選項:在 CSAT 對話方塊中顯示或隱藏略過按鈕 布林值 false
禁止使用者終止即時通訊 設定選項,可在即時通訊 UI 中顯示或隱藏結束對話按鈕 布林值 false
隱藏「下載即時通訊轉錄稿」 在對話動作選單和對話使用者介面中,顯示或隱藏「下載對話記錄」按鈕。如果將半形空格加到 ujet_common_hide 字串,Hide 文字就會消失,只會顯示返回箭頭。 整數。值:

0 = 在所有位置顯示

1 = 從選項選單中隱藏

2 = 從後續即時通訊畫面隱藏

3 = 從選項選單和貼文聊天畫面中隱藏。

0

UjetOption.setBlockChatTerminationByEndUser

在全域層級關閉推播通知 UjetOption.setPushNotificationsAllowed 設為 false 會略過所有推播通知依附元件,並防止推播通知傳送給使用者。 布林值 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()
        )

備用

您可以將 UjetErrorListener 用於非預期錯誤的回退。如果未設定這個接聽程式或傳回 false,Android SDK 會處理錯誤。

只有在「設定」>「開發人員設定」>「MMA」>「編輯彈出式視窗」中,將「啟用 PSTN 備援」切換鈕設為「開啟」時,Android SDK 才會將使用者重新導向至撥號器,並提供備援號碼,否則 SDK 會結束。

錯誤類型 錯誤代碼 觸發條件
NETWORK_ERROR 1 無法連上網路。請注意,如果網路在通訊、通話或評分畫面期間無法使用,系統不會觸發這項錯誤。
AUTHENTICATION_ERROR 100 驗證期間發生未預期的錯誤。
AUTHENTICATION_JWT_ERROR 101 JWT 驗證期間發生未預期的錯誤 (例如剖析錯誤)。
VOIP_CONNECTION_ERROR 1000 無法與 VoIP 供應商建立連線。這項作業是透過 VoIP SDK 的回呼處理。
VOIP_LIBRARY_NOT_FOUND 1001 系統應使用 VoIP 供應商連線通話,但找不到這類供應商。如果開發人員整合了錯誤的 SDK,或未在依附元件中新增 VoIP 供應商程式庫,就可能發生這種情況。
CHAT_LIBRARY_NOT_FOUND 1100 找不到即時通訊程式庫時會發生這種情況。如果開發人員整合了錯誤的 SDK,或未在依附元件中加入 Twilio Chat 程式庫,就可能發生這種情況。
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());
    }
});

應用程式權限

應用程式需要下列權限,並會在必要時要求使用者授予這些權限。

權限 說明
攝影機 用於智慧動作,可拍照及錄影
麥克風 允許應用程式透過 Twilio 使用 VoIP 通話
儲存空間 允許應用程式儲存相片和影片

設定深層連結 (選用)

如要將智慧動作用於 IVR (PSTN) 通話,您需要在專案中設定深層連結。

深層連結格式為不重複的 URI,例如:

ujet:// <package_name>/smartchannel.

此外,您必須在管理入口網站中設定這個連結,或任何會重新導向至這個連結的網址 (依序前往「設定」>「營運管理」>「啟用傳送簡訊來下載應用程式」)

您需要在資訊清單中加入含有深層連結的意圖篩選器。

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

偏好頻道

Preferred Channel 參數可將消費者直接導向特定管道。使用者會略過管道選取步驟,直接透過「首選管道」參數指定的管道發起聯絡。

UjetStartOptions.preferredChannel

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

活動通知

您可以選擇設定 UjetEventListener,接收應用程式事件通知。

如需可用的事件類型和說明,請參閱這篇文章。

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());
    }
});
事件類型 說明 活動中包含的資料
EmailClicked 在使用者點選電子郵件管道時觸發。 佇列選單資料
EmailSubmitted 在使用者傳送電子郵件時觸發。 佇列選單資料、提交的電子郵件資料
SessionPaused 當使用者將即時通訊或通話工作階段縮到最小時觸發。 工作階段資料
SessionResumed 使用者從背景切換回即時通訊或通話工作階段時觸發。 工作階段資料
SessionCreated 在建立即時通訊或通話工作階段時觸發。 佇列選單資料、工作階段建立資料
SessionEnded 在即時通訊或通話工作階段結束時觸發。 佇列選單資料、工作階段建立資料、工作階段結束資料
SdkTerminated SDK 關閉時觸發,包括意外關閉時。 SDK 終止資料
ContentCardClicked 在使用者點選內容資訊卡時觸發。 內容資訊卡點擊資料
ContentCardButtonClicked 在使用者點選內容資訊卡按鈕時觸發。 點選內容資訊卡按鈕的資料
QuickReplyClicked 點選快速回覆時觸發。 快速回覆點擊資料
MessageLinkClicked 在使用者點選連結時觸發。 已點選郵件連結資料

佇列選單資料

類型 說明
event_name 字串 包含事件名稱。例如「已點選電子郵件」。
application 字串 包含應用程式名稱。例如「Android」。
app_id 字串 包含應用程式 ID,與 Context.getPackageName() 相同。
app_version 字串 包含應用程式版本名稱和版本代碼。例如「0.32.0 (123)」。
sdk_version 字串 包含 SDK 版本。例如「0.32.0」。
timestamp 字串 包含世界標準時間的時間戳記 (格式為 yyyy-MM-dd'T'HH:mm:ss'Z')。
device_model 字串 包含使用者裝置型號。例如「Google Pixel」。
device_version 字串 包含使用者裝置版本。例如「10、Q、SDK 29」。
company 字串 包含公司名稱。例如「公司」。
menu_name 字串 包含葉節點的名稱 (使用者最後選取的選單)。例如「子選單」。
menu_id 字串 包含葉節點的 ID (使用者上次選取的選單)。例如「123」。
menu_path 字串 包含使用者選取的所有選單順序。例如「Parent / Child / Sub Menu」。
menu_key 字串 包含 DAP 金鑰,為選用項目。例如「special_user_menu」。

電子郵件提交資料

類型 說明
has_attachments 布林值 如果電子郵件有任何附件,則傳回 True,否則傳回 False。

工作階段資料

類型 說明
event_name 字串 包含事件名稱。例如「已點選電子郵件」。
type 字串 包含工作階段類型。例如「chat」或「call」。
timestamp 字串 包含世界標準時間的時間戳記 (格式為 yyyy-MM-dd'T'HH:mm:ss'Z')。

工作階段建立日期

類型 說明
session_id 字串 包含工作階段 ID。例如「100」。
type 字串 包含工作階段類型。例如「chat」或「call」。
end_user_identifier 字串 包含使用者 ID。例如「John」。
messages_end_user 字串 包含使用者訊息計數,且僅適用於即時通訊工作階段。例如「3」。
messages_agent 字串 包含服務專員訊息計數,且僅適用於即時通訊工作階段。例如「3」。

工作階段結束資料

類型 說明
agent_name 字串 包含代理程式名稱。例如「John」。
ended_by 字串 包含結束工作階段的詳細資料。可能的值包括「agent」(專員結束工作階段時)、「end_user」(使用者結束工作階段時)、「timeout」(對話逾時時) 或「dismissed」(對話遭關閉時)。
duration 字串 包含工作階段時間長度 (以秒為單位),且僅適用於通話工作階段。例如「30 秒」。

SDK 終止資料

類型 說明
event_name 字串 包含事件名稱。例如「已點選電子郵件」。

點選內容資訊卡資料

類型 說明
title 字串 資訊卡標題。
title 字串 資訊卡標題。
subtitle 字串 資訊卡副標題。
body 字串 內容資訊卡的說明。
link 字串 網頁連結或深層連結。SDK 會使用 OS 功能開啟。
event_params dictionary 包含點擊事件額外資訊的字典。SDK 會使用這項資訊。

點選內容資訊卡按鈕的資料

類型 說明
title 字串 資訊卡標題。
title 字串 資訊卡標題。
link 字串 網頁連結或深層連結。SDK 會使用 OS 功能開啟。
event_params dictionary 包含點擊事件額外資訊的字典。SDK 會使用這項資訊。

快速回覆點擊資料

類型 說明
title 字串 資訊卡標題。
title 字串 資訊卡標題。
link 字串 網頁連結或深層連結。SDK 會使用 OS 功能開啟。
event_params dictionary 包含點擊事件額外資訊的字典。SDK 會使用這項資訊。

已點選郵件連結資料

類型 說明
event_name 字串 包含事件名稱,例如「訊息連結點擊次數」。
link 字串 網頁連結或深層連結。SDK 會使用 OS 功能開啟。

來電行為變更

Android 10 裝置起,當主機應用程式在背景執行時,使用者不會直接收到來電。我們會改用通知功能提醒使用者有來電 (即使手機已鎖定),並提供接聽或拒絕來電的選項。

當主機應用程式在背景執行,且螢幕在來電前處於鎖定狀態時,系統會顯示相同的通知。這項行為變更是為了遵守 Google 最近的限制,也就是應用程式在背景時啟動活動的限制。如果主機應用程式在前台執行,或是在 Android 10 以下版本的裝置上執行,行為不會受到影響。

自訂 SDK 工作階段

本節說明如何進一步自訂 SDK。

檢查現有工作階段

開始工作階段前,請使用上述方法檢查是否有任何現有或進行中的工作階段。如果存在,您可以提示使用者繼續或取消。

如果使用者有所變更,這點就特別重要。

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

中斷工作階段

如要中斷任何進行中的工作階段,請參閱這個方法。

使用這個方法前,請務必先使用 Ujet.getStatus() 檢查是否有這類工作階段。如要在 SDK 中斷工作階段連線後執行一或多項動作(例如顯示訊息或關閉應用程式),可以使用下一節說明的 onFinished() 回呼,否則請將回呼設為空值。

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

清除快取中的使用者資料

當應用程式中與使用者相關的資料更新或變更時,您有責任清除快取。舉例來說,如果使用者已登出,請呼叫方法移除該使用者的快取,以便在下次啟動 SDK 時,為新使用者啟動新工作階段。

Ujet.clearUserData();

隱藏 SDK

您可以使用 Ujet.hideSDK() 方法隱藏 SDK。舉例來說,如果 SDK 干擾應用程式使用者介面,這項功能就十分實用。呼叫這個方法前,請先使用 Ujet.init() 初始化 SDK。如果 SDK 成功隱藏,Ujet.init() 會傳回 true,否則會傳回 false。隱藏 SDK 後,您可以使用 Ujet.start() 方法再次啟動。

以下範例會隱藏 SDK:

Ujet.hideSDK();

語言偏好設定

Android SDK 會依下列優先順序決定語言。

  1. 在應用程式的啟動畫面中選取的語言。

  2. 使用 UjetOptions 選取的預設語言。您可以在 UjetOptions 中使用 setDefaultLanguage("en") 設定預設語言。詳情請參閱「SDK 設定」部分的「預設語言」。

  3. 如果應用程式支援,系統會使用你在裝置上選取的裝置語言 (依序點選「設定」>「一般」>「語言」)。

  4. 如果應用程式不支援裝置語言,但支援最接近的父項方言,就會使用最接近的裝置語言方言。舉例來說,如果使用者在裝置中選取古巴西班牙文做為語言,但應用程式不支援古巴西班牙文,卻支援母方言西班牙文,系統就會使用西班牙文。

  5. 如果應用程式不支援裝置語言,系統會預設使用英文。

設定外部轉向連結圖示

如要自訂「外部轉移連結」管道中的圖示,請將圖示上傳至應用程式的可繪製資料夾,並確保在 CCAI Platform 入口網站中建立外部轉移連結時,使用相同的圖示名稱 (依序前往「設定」>「即時通訊」>「外部轉移連結」>「查看連結」>「新增轉移連結」)

如果 CCAI Platform 入口網站中的圖示名稱與上傳至應用程式的圖示不符,Android SDK 會使用預設圖示。

設定問卷調查的「感謝您」圖示

如要自訂或覆寫問卷調查感謝頁面中的圖示,請將圖示上傳至應用程式的可繪項目資料夾,並使用檔案名稱 ujet_survey_thank_you_icon 做為圖示名稱。

自訂 (選用)

本節說明如何自訂 SDK 中的特定值。

字串

您可以覆寫 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>

問卷調查設定

自訂文字大小

如要自訂應用程式中使用的標題、說明和選擇器文字大小,請在 dimens.xml 中覆寫下列鍵。

可自訂的文字大小如下:

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

主題

按照下列步驟自訂主題和背景。步驟 1 是設定主題,步驟 2 則是設定背景。

  1. 如要自訂主題,請在 style.xml 中覆寫每個樣式項目的鍵。例如,假設使用者要求系統 將文字從英文翻譯成法文

    <!--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. 如要自訂應用程式的背景顏色,請覆寫 style.xml 中每個樣式項目的鍵。螢幕截圖顯示可自訂的背景顏色。

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

自訂即時通訊標題

您可以自訂使用者介面中聊天室的聊天室標題文字。

你可以使用下列選項自訂即時通訊標題文字:

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

您可以使用下列選項,在即時通訊 UI 中自訂虛擬服務專員的快速回覆:

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

內容資訊卡

除了自訂對話,您也可以自訂內容資訊卡。您可以透過 JSON 檔案 (請參閱 app/src/main/assets/json/ujet_styles.json 檔案中的 content_card property) 或 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",
            )
        )
    )
)

網頁表單主題

您可以自訂網頁表單資訊卡和即時通訊。您可以使用 JSON 檔案 (請參閱 app/src/main/assets/json/ujet_styles.json 檔案中的 form_card 屬性),或使用 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,
        ),
    )
)

問卷調查

如要變更問卷調查感謝頁面上的圖示,請將圖示上傳至應用程式的可繪製資料夾。

請務必使用 ujet_survey_thank_you_icon 做為圖示名稱。

疑難排解

發起新對話的時間超過 30 秒

檢查您是否正在回應自訂資料的委派方法。您應在收到要求時傳回有效的自訂資料,或只透過回呼傳回空值。請參考下列程式碼。

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

政策聲明說明

如果您在 Google Play 管理中心收到通知,要求聲明 Android SDK 使用的服務或權限政策,請參考下列說明。

聲明 Android SDK 使用的前景服務

Google 在 Android 14 中導入前景服務類型,並強制要求在啟動前景服務時指定類型,詳情請參閱 https://developer.android.com/about/versions/14/changes/fgs-types-required#remote-messaging。Contact Center AI 平台 (CCAI 平台) Android SDK 會使用前景服務啟動即時通訊和通話,因此我們針對即時通訊使用 FOREGROUND_SERVICE_REMOTE_MESSAGING 服務類型,因為我們處理的是文字訊息,而針對通話使用 FOREGROUND_SERVICE_MICROPHONE 服務類型。如果沒有這些服務類型,從 Android 14 裝置啟動即時通訊或通話時,SDK 會當機。

聲明 Android SDK 使用的全螢幕意圖權限

裝置鎖定時,必須有 USE_FULL_SCREEN_INTENT 權限,才能顯示來電推播通知。這項功能會向使用者發出警示,並以全螢幕顯示來電通知 (內建電話應用程式就是以這種方式通知使用者來電)。

支援 Android 15

如要支援 Android 15,請按照下列步驟操作:

  1. build.gradle(:app) 中設定 compileSdkVersion = 35targetSdkVersion = 35

  2. 確認專案的 Android Gradle 外掛程式 (AGP) 版本為 8.5.1 以上。詳情請參閱「更新共用程式庫的封裝」。

  3. 安裝 Java 開發套件 (JDK) 17 以上版本,使用 AGP 8.0 以上版本建構 Android 專案。詳情請參閱「若要執行 AGP 8.0,須使用 JDK 17」。