このページでは、Android SDK の使用方法について説明します。
サンプルアプリにアクセスする
Android のサンプルアプリをダウンロードするには、Android のサンプルアプリをクリックします。
Android モバイル SDK を使用してサンプルアプリを作成するには、次のものが必要です。
CCAI プラットフォーム ポータルの会社キーと会社シークレット。
Android 5.0(API レベル 21、Lollipop)以降。
プッシュ通知用の Firebase Cloud Messaging または Google Cloud Messaging。
アプリが 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'
また、Proguard ルールは Android SDK にすでに含まれており、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
}
}
カンパニー キーとカンパニー シークレットを取得する
管理者認証情報を使用して管理ポータルにログインします。
[Settings] > [Developer Settings] > [Company Key & Secret Code] に移動します。
会社キーと会社シークレット コードを取得します。
インストール
ルート プロジェクトの Gradle 設定に Android SDK リポジトリを追加します。
build.gradle(プロジェクト)
allprojects {
repositories {
google()
jcenter()
maven {
url "https://sdk.ujet.co/android/"
}
}
}
build.gradle(モジュール: 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 が含まれています。UJET_COMPANY_SECRET を mock/APIManager.java に配置する必要があります。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 アプリケーション クラスの 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 ポータルで、[設定 > デベロッパー設定] をクリックします。[設定] メニューが表示されない場合は、 [メニュー] をクリックします。
[モバイルアプリ] ペインに移動します。
アプリの横にある [編集] をクリックします。[モバイルアプリの編集] ダイアログが表示されます。
[サービス アカウント フィールド] にサービス アカウント キーを入力し、[保存] をクリックします。
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 Cloud Messaging クライアント アプリを設定するをご覧ください。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 を起動し、CRM に渡すこともできます。チャットまたは通話が接続されると、このチケット ID が開きます。
String ticketId = "TICKET_ID";
UjetStartOptions ujetStartOptions = new UjetStartOptions.Builder()
.setTicketId(ticketId)
.build();
Ujet.start(ujetStartOptions);
カスタムデータを CRM に送信する
カスタムデータはサポート エージェントに送信され、着信通話/チャットのサポート チケットに表示されます。
カスタムデータを送信する方法は 2 つあります。
署名付きメソッド: 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));
}
// ...
}
}
署名なしメソッドを使用してカスタムデータを送信する
アプリケーションでカスタムデータを送信するには、署名付きメソッドを使用することをおすすめします。詳しくは、署名付きメソッドを使用してカスタムデータを送信するをご覧ください。
署名なしのデータを送信するには、開始オプションを指定して 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: 文字列 [エージェントのアバターの URL、省略可]
transcript: 配列sender: 文字列 ["end_user" または "agent"]timestamp: 文字列(例: 「2021-03-15 12:00:00Z」)content: 配列type: 文字列 [text、media のいずれか]text: 文字列 [テキスト タイプの場合は必須]media: 辞書 [メディアタイプに必須]type: 文字列 [image、video のいずれか]url: 文字列 [メディア ファイルを指す公開 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
JWT を検証するために、JSON に iat と exp を含める必要があります。カスタム データのオブジェクトは、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"
}
}
}
キーはデータの一意の識別子です。型は値の型です。
string- JSON文字列
number- integer、float
date- 13 桁の UTC Unix タイムスタンプ形式。(ミリ秒を含む)
url- HTTP URL 形式
ラベルは 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 フォールバックを有効にする] 切り替えがオンになっている場合にのみ機能します。[Enable PSTN Fallback] 切り替えがオフの場合、PSTN にフォールバックしません。CCAI Platform は、ネットワーク接続の確認にデフォルトのネットワーク感度(0.85)を使用します。
| オプション | 説明 | 値 | デフォルト値 |
|---|---|---|---|
| ログレベル | Logcat に出力するログレベル。 | データ型は int です。Android ログのログレベルも同様です。(最小: 2、最大: 7) | 5(Log.Warn) |
| デフォルトの言語 | デフォルトの言語コード。 | 文字列。ISO 639 言語コード。(例: 英語の場合は en) | null |
| フォールバック電話番号 | この電話番号は、インターネットが利用できない場合や、管理ポータルに会社の代表電話番号が存在しない場合のフォールバックとして使用されます。 | 文字列。電話番号。 | null |
| キャッチされなかった例外ハンドラが有効 | 捕捉されなかった例外ハンドラを有効にします。true の場合、アプリは Thread.setDefaultUncaughtExceptionHandler を使用して、ランタイム時にキャッチされないすべての SDK 例外を処理します。ただし、同じ例外が 2 回発生すると、アプリはクラッシュします。 |
ブール値 | true |
| ネットワークの機密性 | ネットワークの状態を確認する際の感度。 | 0~1 の間の Double 値。0 は最も感度が低く、1 は最も感度が高い。値が 1 の場合、常に PSTN 通話にフォールバックします。使用する場合は、.97 の値から始めることをおすすめします。この値は、ポータルの [設定] > [デベロッパー設定] > [モバイルアプリ] > [フォールバック] 電話番号のしきい値でオーバーライドされます。 |
0.85 |
| ダークモードが有効 | ダークモードのテーマを有効にします。true の場合、ユーザーがダークモードをオンにすると、SDK はダークモードのテーマを適用し、それ以外の場合はアクションを無視します。 |
ブール値 | false |
| Single Channel Enabled(単一チャネルが有効) | 単一のチャンネルのチャンネル選択画面を表示するかバイパスするかを設定するオプション。true の場合、メニューキューで 1 つのチャンネルのみが有効になっている場合でも、SDK はチャンネルを自動的に選択するのではなく、1 つのチャンネル選択画面を表示します。 |
ブール値 | false |
| 通話ビューの自動最小化 | 最初の通話画面 UI をデフォルトで自動的に最小化するか、ユーザーが最小化するまで待機するかの設定オプション。 | ブール値 | false |
| エージェント アイコンの枠線を有効にする | エージェント アイコンの周囲に円形の枠線を表示または削除する構成オプション。 | ブール値 | false |
| ピッカー ビューの静的フォントサイズ | ピッカー アイテムのテキストサイズを自動的に調整または無効にするための設定オプション。 | ブール値 | false |
| チャットでメディア添付ファイルを非表示にする | チャット UI でメディア添付アイコンを表示または非表示にする設定オプション。 | ブール値 | false |
READ_PHONE_STATE 権限を無視する |
true に設定すると、SDK は READ_PHONE_STATE 権限をリクエストしません。アプリ内 IVR 通話を使用しない場合は、この権限のリクエストを回避するためにこのフラグを true に設定します。また、アプリケーションで CCAI Platform SDK の android.permission.READ_PHONE_STATE 権限を明示的に削除する必要があります。この権限はアプリ内 IVR 通話の動作に必要であるため、true に設定することはおすすめしません。 |
ブール値 | false |
| Cobrowse.io ライセンスキー(該当する場合) | Cobrowse.io ライブラリを設定する構成オプション。Cobrowse ライセンスキーは、https://cobrowse.io/dashboard/settings にログインして [License Key] セクションに移動すると確認できます。 |
文字列 | null |
| カスタム チャット ヘッダーのタイトル | チャット UI のチャット ヘッダー タイトル テキストをカスタマイズする構成オプション。 | 文字列 | null |
| チャット UI のクイック返信をカスタマイズする | チャット UI で仮想エージェントのクイック返信をカスタマイズするための構成オプション。仮想エージェントのクイック返信はデフォルトでグループ化されますが、個別に表示する場合は、この構成オプションを使用して QuickReplyButtonsStyle.INDIVIDUAL を設定できます。 | UjetStylesOptions | QuickReplyButtonsStyle.GROUPED |
| チャット UI のさまざまな属性をカスタマイズする | フォント、背景色、アイコンなどのさまざまな属性をカスタマイズするための設定オプション。 | UjetStylesOptions | null |
| ステータスバーを非表示にする | ステータスバーの表示 / 非表示を切り替える構成オプション。値が true の場合、SDK はステータス バーを非表示にします。 | ブール値 | false |
| 読み込み中アイコンのドローアブル リソースを設定する | アプリ全体で読み込みスピナー ビューをカスタマイズするための構成オプション。利用できない場合や null の場合は、デフォルトの読み込みビューを使用します。 | Integer | null |
| 横向きが無効になっている | 横向きを無効にします。値が true の場合、横向きは適用されません。 | ブール値 | false |
| チャットで新しい会話を開始するインライン ボタンを非表示にする | チャット UI で新しい会話を開始するインライン ボタンを表示または非表示にする設定オプション。 | ブール値 | false |
| CSAT のスキップ ボタンを表示する | CSAT ダイアログでスキップ ボタンを表示または非表示にする設定オプション | ブール値 | false |
| エンドユーザーによるチャットの終了をブロックする | チャット UI でチャット終了ボタンを表示または非表示にする構成オプション | ブール値 | false |
| チャットの記録をダウンロードするを非表示にする | チャット アクション メニューとチャット ユーザー インターフェースで、チャットの文字起こしをダウンロードするボタンを表示または非表示にします。ujet_common_hide 文字列にスペースを追加すると、Hide テキストが消え、戻る矢印のみが表示されます。 |
データ型は int です。値:
|
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 がエラーを処理します。
Android SDK は、[Enable PSTN Fallback] 切り替えが [設定] > [開発者向け設定] > [MMA] > [ポップアップを編集] で オンになっている場合にのみ、フォールバック番号を使用してユーザーをダイヤラーにリダイレクトします。それ以外の場合は 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.
また、管理ポータル([Settings] > [Operation Management] > [Enable Send SMS to Download App])で、このリンクまたはこのリンクにリダイレクトされる URL を設定する必要があります。
マニフェストにディープリンクを含むインテント フィルタを追加する必要があります。
<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 パラメータを使用すると、ユーザーを特定のチャネルに直接誘導できます。エンドユーザーはチャネル選択の手順をスキップし、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 |
文字列 | Context.getPackageName() と同じアプリ識別子が含まれます。 |
app_version |
文字列 | アプリのバージョン名とバージョン コードが含まれます。例: 「0.32.0 (123)」。 |
sdk_version |
文字列 | SDK バージョンが含まれます。例: 「0.32.0」。 |
timestamp |
文字列 | UTC のタイムスタンプ(yyyy-MM-dd'T'HH:mm:ss'Z' 形式)が含まれます。 |
device_model |
文字列 | ユーザーのデバイスモデルが含まれます。(「Google Pixel」など)。 |
device_version |
文字列 | ユーザー デバイスのバージョンが含まれます。例: 「10、Q、SDK 29」。 |
company |
文字列 | 会社名が含まれます。例: 「Company」。 |
menu_name |
文字列 | リーフノードの名前(ユーザーが最後に選択したメニュー)が含まれます。例: 「サブメニュー」。 |
menu_id |
文字列 | リーフノードの ID(ユーザーが最後に選択したメニュー)が含まれます。例: 「123」。 |
menu_path |
文字列 | ユーザーが選択したメニューの完全なシーケンスが含まれます。例: 「親 / 子 / サブメニュー」。 |
menu_key |
文字列 | DAP キーが含まれます。省略可能です。例: 「special_user_menu」。 |
メールで送信されたデータ
| キー | タイプ | 説明 |
|---|---|---|
has_attachments |
ブール値 | メールに添付ファイルがある場合は True、それ以外の場合は False を返します。 |
セッション データ
| キー | タイプ | 説明 |
|---|---|---|
event_name |
文字列 | イベント名が含まれます。例: 「メールがクリックされた」。 |
type |
文字列 | セッション タイプが含まれます。(例: 「チャット」、「通話」)。 |
timestamp |
文字列 | UTC のタイムスタンプ(yyyy-MM-dd'T'HH:mm:ss'Z' 形式)が含まれます。 |
セッション作成データ
| キー | タイプ | 説明 |
|---|---|---|
session_id |
文字列 | セッション ID が含まれます。例: 「100」。 |
type |
文字列 | セッション タイプが含まれます。(例: 「チャット」、「通話」)。 |
end_user_identifier |
文字列 | エンドユーザー識別子が含まれます。例: 「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() を使用できます。それ以外の場合は、コールバックを null に設定します。
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 はデフォルトのアイコンを使用します。
アンケートの [Thank You] アイコンを設定する
アンケートのサンキュー ページのアイコンをカスタマイズまたはオーバーライドするには、アプリの drawable フォルダにアイコンをアップロードし、アイコン名としてファイル名 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>
チャット ヘッダーのタイトルをカスタマイズする
UI のチャットでチャット ヘッダーのタイトル テキストをカスタマイズするオプションがあります。
次のオプションを使用して、チャット ヘッダーのタイトル テキストをカスタマイズできます。
<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,
),
)
)
アンケート
アンケートのサンキュー ページのアイコンは、アプリの drawable フォルダにアイコンをアップロードすることで変更できます。
アイコン名として ujet_survey_thank_you_icon を使用してください。
トラブルシューティング
新しいチャットの開始に 30 秒以上かかった
カスタムデータのデリゲート メソッドに応答しているかどうかを確認します。リクエストに応じて有効なカスタムデータを返すか、コールバックで null を返す必要があります。次のコードを参考にしてください。
@Override
public void onSignPayloadRequest(Map<String, Object> payload, UjetPayloadType ujetPayloadType, UjetTokenCallback tokenCallback) {
if (ujetPayloadType == UjetPayloadType.CustomData) {
tokenCallback.onToken(null);
}
}
ポリシーの申告の説明
Google Play Console で、Android SDK で使用されているサービスまたは権限のポリシーを申告するよう求める通知を受け取った場合は、次のいずれかの説明を使用してください。
Android SDK で使用されるフォアグラウンド サービスを宣言する
Google は Android 14 でフォアグラウンド サービスのタイプを導入し、https://developer.android.com/about/versions/14/changes/fgs-types-required#remote-messaging に記載されているように、フォアグラウンド サービスの開始時に指定することを義務付けました。Contact Center AI Platform(CCAI Platform)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 以降であることを確認します。詳しくは、共有ライブラリのパッケージを更新するをご覧ください。
AGP 8.0 以降を使用して Android プロジェクトをビルドするには、Java Development Kit(JDK)バージョン 17 以降をインストールします。詳細については、AGP 8.0 の実行に JDK 17 が必要をご覧ください。