本頁說明如何使用 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
}
}
取得公司金鑰和公司密鑰
使用管理員憑證登入管理入口網站。
依序前往「設定」>「開發人員設定」>「公司金鑰和密碼」。
擷取「公司金鑰」和「公司密碼」。
安裝
在根專案的 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 專案。
如果您已有專案,可以使用自己的專案並略過這個程序。
在 Firebase 主控台中建立 Firebase 專案。
在 Firebase 控制台的「設定」>「一般」中,下載 google-services.json。

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

新增服務帳戶金鑰
您必須在行動應用程式中新增服務帳戶金鑰,才能接收推播通知。如要取得服務帳戶金鑰,請參閱「以服務帳戶進行驗證」。
如要在行動應用程式中新增服務帳戶金鑰,請按照下列步驟操作:
在 CCAI Platform 入口網站中,依序點選「Settings」>「Developer Settings」。 如果沒有看到「設定」選單,請按一下「選單」圖示 。
前往「行動應用程式」窗格。
按一下應用程式旁的「編輯」,系統會顯示「編輯行動應用程式」對話方塊。
在「服務帳戶」欄位中,輸入服務帳戶金鑰,然後按一下「儲存」。
設定 Android 用戶端
將
google-services.json複製到應用程式目錄,例如PROJECT_ROOT/app/google-services.json。使用下列程式碼取得
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); } }在 Application 類別中導入
UjetRequestListener.onRequestPushToken。UjetRequestListener.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 -> { }) } }處理推播通知。如要讓 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 平台入口網站中建立 (需具備管理員角色)。
依序前往「設定」>「佇列」。
從選單結構中選取任一佇列。
勾選「建立直接存取點」。
在文字表單中輸入金鑰。
按一下 [儲存]。

您也可以使用特定工單 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#setUnsignedCustomData 和 UjetTokenCallback 設定自訂資料,然後呼叫 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 屬性,可能會發生下列情況:
- 自訂資料會納入工作階段中繼資料檔案。
- 自訂資料不會納入 CRM 記錄。
詳情請參閱「在代理程式轉接程式中查看工作階段資料」。
保留資料屬性
工作階段開始時,您可以將預留的資料屬性以簽署的自訂資料形式,傳送至 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 |
| 網路靈敏度 | 檢查網路狀態的靈敏度。 | 介於 0 和 1 之間,其中 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
|
| 在全域層級關閉推播通知 | 將 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 會依下列優先順序決定語言。
在應用程式的啟動畫面中選取的語言。
使用
UjetOptions選取的預設語言。您可以在UjetOptions中使用setDefaultLanguage("en")設定預設語言。詳情請參閱「SDK 設定」部分的「預設語言」。如果應用程式支援,系統會使用你在裝置上選取的裝置語言 (依序點選「設定」>「一般」>「語言」)。
如果應用程式不支援裝置語言,但支援最接近的父項方言,就會使用最接近的裝置語言方言。舉例來說,如果使用者在裝置中選取古巴西班牙文做為語言,但應用程式不支援古巴西班牙文,卻支援母方言西班牙文,系統就會使用西班牙文。
如果應用程式不支援裝置語言,系統會預設使用英文。
設定外部轉向連結圖示
如要自訂「外部轉移連結」管道中的圖示,請將圖示上傳至應用程式的可繪製資料夾,並確保在 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 則是設定背景。
如要自訂主題,請在 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>如要自訂應用程式的背景顏色,請覆寫 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,請按照下列步驟操作:
在
build.gradle(:app)中設定compileSdkVersion = 35和targetSdkVersion = 35。確認專案的 Android Gradle 外掛程式 (AGP) 版本為 8.5.1 以上。詳情請參閱「更新共用程式庫的封裝」。
安裝 Java 開發套件 (JDK) 17 以上版本,使用 AGP 8.0 以上版本建構 Android 專案。詳情請參閱「若要執行 AGP 8.0,須使用 JDK 17」。