機能

Oracle Android SDKで構成できる機能は次のとおりです。

絶対タイムスタンプおよび相対タイムスタンプ

機能フラグ: timestampType: TimestampMode.RELATIVE

チャット・メッセージについて絶対タイムスタンプまたは相対タイムスタンプを有効にできます。絶対タイムスタンプには、各メッセージの正確な時間が表示されます。相対タイムスタンプは最新のメッセージにのみ表示され、前のメッセージからの秒数、日数、時間数、月数または年数で表されます。絶対タイムスタンプによって得られる正確さはアーカイブ・タスクに最適です。しかしながら、チャット・セッションの限定的なコンテキスト内では、ユーザーがタイムスタンプを比較してメッセージ間の時間経過を求める必要があるため、正確さのためにユーザー・エクスペリエンスが損なわれます。相対タイムスタンプを使用すると、ユーザーは、すぐに理解できる「たった今」「少し前」のような言葉を使用して会話を簡単に進めることができます。相対タイムスタンプを使用すると、開発タスクが簡略化されるだけでなく、別の方法でユーザー・エクスペリエンスが向上します。相対タイムスタンプでは、メッセージからの経過時間が秒、日、時、月または年を単位としてマークされるため、タイムゾーンに合せて変換する必要がありません。

相対タイムスタンプの構成

相対タイムスタンプを追加するには:
  • タイムスタンプの有効化 – enableTimestamp: true
  • 相対タイムスタンプの有効化 – timestampType: 'relative'
タイムスタンプ(timestampType: 'relative')を構成すると、一日の最初のメッセージの前にヘッダーとして絶対タイムスタンプが表示されます。このヘッダーは、会話がクリアされておらず、履歴で古いメッセージをまだ確認できる場合に表示されます。
このタイムスタンプは、新しいメッセージが受信されるまで、次の一定間隔(秒数、分数など)で更新されます。
  • 最初の10秒間
  • 10秒-60秒
  • 1分-60分の毎分
  • 1時間-24時間の毎時
  • 1日-30日の毎日
  • 1月-12月の毎月
  • 1年目の後の毎年
新しいメッセージがチャットにロードされると、前のメッセージの相対タイムスタンプが削除され、新しいメッセージの新しいタイムスタンプ(前のメッセージに対する相対的な時間を示す)が表示されます。その時点から、次のメッセージが届くまで、この相対タイムスタンプが更新されます。

処理ボタン・レイアウト

機能フラグ: actionsLayout

actionsLayoutは、ローカル、グローバル、カードおよびフォーム・アクションのレイアウト方向を設定します。これをLayoutOrientation.HORIZONTALに設定すると、これらのボタンは横方向にレイアウトされ、コンテンツがオーバーフローすると折り返されます。

BotsConfiguration botsConfiguration = new BotsConfiguration.BotsConfigurationBuilder(<Server_URI>, false, getApplicationContext())
        .channelId(<CHANNEL_ID>)
        .userId(<USER_ID>)
        .actionsLayout(actionsLayout)
        .build();

添付フィルタリング

(必須) <ここに簡単な説明を入力します。>

機能フラグ: shareMenuItems

この機能を使用して、共有メニュー・ポップアップで使用可能なアイテム・タイプを制限またはフィルタし、アップロードのファイル・サイズ制限(次のスニペットの1024など)を設定し、メニューのアイコンおよびラベルをカスタマイズします。
ノート

shareMenuItemsを構成する前に、enableAttachmenttrueに設定する必要があります。
ArrayList<Object> customItems = new ArrayList<>();
        ShareMenuCustomItem shareMenuCustomItem1  = new ShareMenuCustomItem("pdf bin", "Label1", 1024, R.drawable.odaas_menuitem_share_file);
        ShareMenuCustomItem shareMenuCustomItem2  = new ShareMenuCustomItem("doc", "Label2", R.drawable.odaas_menuitem_share_file);
        ShareMenuCustomItem shareMenuCustomItem3  = new ShareMenuCustomItem("csv");
        ArrayList<Object> customItems = new ArrayList<>(Arrays.asList(shareMenuCustomItem1,shareMenuCustomItem2,shareMenuCustomItem3,ShareMenuItem.CAMERA));
        BotsConfiguration botsConfiguration = new BotsConfiguration.BotsConfigurationBuilder(sharedPreferences.getString(getString(R.string.pref_name_chat_server_host), Settings.CHAT_SERVER_URL), false, getApplicationContext())
        .channelId(<CHANNEL_ID>)
        .userId(<USER_ID>)
        .shareMenuItems(customItems)
        .enableAttachment(true)
        .build();
前述のスニペットのshareMenuCustomItem3 = ShareMenuCustomItem('csv')のように、ShareMenuCustomItemオブジェクトのラベルに値がないか、nullの場合、share_に接尾辞が付けられたtype文字列がラベルになります。shareMenuCustomItem3では、ラベルはshare_csvです。
ノート

ShareMenuCustomItemオブジェクトのtype*と設定すると、ユーザーがすべてのファイル・タイプをアップロードできるようになります。

public static void shareMenuItems(ArrayList<Object> shareMenuItems)

Bots.shareMenuItems(customItems); APIをコールして、共有メニュー・アイテム・ポップアップを動的に更新できます(customItemsObjectsArrayListです)。各オブジェクトの型は、ShareMenuItem列挙値またはShareMenuCustomItemのオブジェクトです。
ArrayList<Object> customItems = new ArrayList<>();
        ShareMenuCustomItem shareMenuCustomItem1  = new ShareMenuCustomItem("pdf bin", "Label1", 1024, R.drawable.odaas_menuitem_share_file);
        ShareMenuCustomItem shareMenuCustomItem2  = new ShareMenuCustomItem("doc", "Label2", R.drawable.odaas_menuitem_share_file);
        ShareMenuCustomItem shareMenuCustomItem3  = new ShareMenuCustomItem("csv");
        customItems.add(shareMenuCustomItem1);
        customItems.add(ShareMenuItem.CAMERA);
        customItems.add(ShareMenuItem.FILE);
        customItems.add(shareMenuCustomItem2);
        customItems.add(shareMenuCustomItem3);
        Bots.shareMenuItems(customItems);

public static void shareMenuItems()

Bots.shareMenuItems(); APIをコールして、共有メニュー・アイテム・リストを取得できます。
Bots.shareMenuItems()

フィールドの自動送信

フィールドのautoSubmitプロパティがtrueに設定されている場合、クライアントは、これまでに入力された有効なフィールド値を含むsubmittedFieldマップを含むFormSubmissionMessagePayloadを送信します。まだ設定されていないフィールド(必須かどうかに関係なく)、またはクライアント側の検証に違反するフィールドは、submittedFieldマップに含まれません。自動送信フィールド自体に無効な値が含まれている場合、送信メッセージは送信されず、その特定のフィールドに対するクライアント・エラー・メッセージが表示されます。自動発行が成功すると、フォーム送信メッセージのpartialSubmitFieldは、autoSubmitフィールドのidに設定されます。

前の入力フォームの置換

エンド・ユーザーがフォームを送信すると、フィールドのautosubmittrueに設定されているため、スキルは新しいEditFormMessagePayloadを送信できます。このメッセージは、前の入力フォーム・メッセージを置き換える必要があります。replaceMessageチャネル拡張プロパティをtrueに設定すると、SDKで以前の入力フォーム・メッセージを現在の入力フォーム・メッセージに置き換えることができます。

接続および切断方法

スキルは、public void disconnect()およびpublic void connect()メソッドを使用して接続および切断できます。WebSocketは、ダイレクト・メソッドのコール後に閉じられます。
Bots.disconnect();
スキルが切断状態の場合、次のメソッドをコールすると、WebSocket接続が再確立されます:
Bots.connect();
新しいbotsconfigurationオブジェクトでpublic void connect(Botsconfiguration botsconfiguration)がコールされると、既存のWebSocket接続がクローズされ、新しいbotsconfigurationオブジェクトを使用して新しい接続が確立されます。
BotsConfiguration botsConfiguration = new BotsConfiguration.BotsConfigurationBuilder(<SERVER_URI>, false, getApplicationContext()) // Configuration to initialize the SDK
        .channelId(<CHANNEL_ID>)
        .userId(<USER_ID>)
        .build();

        Bots.connect(botsConfiguration);

デフォルトのクライアント・レスポンス

機能フラグ: enableDefaultClientResponse: true (デフォルト: false)

enableDefaultClientResponse: trueを使用して、スキル・レスポンスが遅延したとき、またはスキル・レスポンスがまったくない場合、入力インジケータを伴うデフォルトのクライアント側レスポンスを指定します。ユーザーが最初のメッセージ/問合せを送信したが、スキルがodaas_default_greeting_timeoutフラグで設定された秒数で応答しない場合、スキルはodaas_default_greeting_message翻訳文字列を使用して構成されたグリーティング・メッセージを表示できます。次に、クライアントはスキルのレスポンスを再度チェックします。スキルのレスポンスを受信した場合、クライアントはスキルのレスポンスを表示しますが、受信されていない場合は、odaas_default_wait_message_intervalフラグで設定された間隔で待機メッセージ(odaas_default_wait_message変換文字列で構成)を表示します。スキル・レスポンスの待機がtypingIndicatorTimeoutフラグで設定されたしきい値を超えると、クライアントはユーザーへのsorryレスポンスを表示し、入力インジケータを停止します。odaas_default_sorry_message変換文字列を使用して、sorryレスポンスを構成できます。

委任

機能構成: messageModifierDelegate

委任機能を使用すると、会話で特定のイベントの前にコールバックを受信するようにデリゲートを設定できます。デリゲートを設定するには、クラスは interface MessageModifierDelegateを実装し、そのインスタンスをmessageModifierDelegateプロパティに渡す必要があります。
private MessageDelegate implements MessageModifierDelegate {
    @Override
    public Message beforeSend(Message message) {
        // Handle before send delegate here
    }

    @Override
    public Message beforeDisplay(Message message) {
        if (message != null && message.getPayload() != null && message.getPayload().getType() == MessagePayload.MessageType.CARD) {
            ((CardMessagePayload)message.getPayload()).setLayout(CardLayout.VERTICAL);
        }
        return message;
    }

    @Override
    public Message beforeNotification(Message message) {
        // Handle before notification delegate here
    }
}
    @Override
    public void beforeEndConversation(CompletionHandler completionHandler) {
        // Handle before end conversation end delegate here
        // Trigger completionHandler.onSuccess() callback after successful execution of the task.
        // Trigger completionHandler.onFailure() callback when the task is unsucessful.
        }
        }

public Message beforeDisplay(Message message)

public Message beforeDisplay(Message message)デリゲートでは、スキルのメッセージが会話で表示される前に変更できるようになります。デリゲートから返された変更済メッセージが会話に表示されます。メソッドからnullが返された場合、メッセージは表示されません。

public Message beforeDisplay(Message message)

public Message beforeDisplay(Message message)デリゲートでは、ユーザー・メッセージがチャット・サーバーに送信される前に変更できるようになります。デリゲートから返されたメッセージはスキルに送信されます。nullが返された場合、メッセージは送信されません。

public Message beforeNotification(Message message)

public Message beforeNotification(Message message)デリゲートでは、通知がトリガーされる前にスキルのメッセージを変更できるようになります。nullが返された場合、通知はトリガーされません。

会話履歴の表示

ボット構成でdisplayPreviousMessagestrueまたはfalseに設定することで、SDKの再初期化後に、ユーザーのローカル会話履歴表示の有効または無効を切り替えることができます。falseに設定すると、SDKの再初期化後には、以前のメッセージがユーザーに表示されません。

チャット・セッションの終了

FeatureFlag: enableEndConversation: true

enableEndConversation: trueは、ユーザーが現在のチャット・セッションを明示的に終了できるようにするクローズ・ボタンをヘッダー・ビューに追加します。ユーザーがこのクローズ・ボタンをクリックすると確認プロンプト・ダイアログが開き、クローズ・アクションを確認すると、SDKはチャット・セッションの終了を示すイベント・メッセージをスキルに送信します。次に、SDKはインスタンスからスキルを切断し、チャット・ウィジェットを縮小して、現在のユーザーの会話履歴を消去します。SDKは、beforeEndConversation(CompletionHandler completionHandler)で委任をトリガーします。この委任を使用して、セッション・リクエストのクローズをサーバーに送信する前にタスクを実行できます。登録できるOnChatEnd()イベントも発生します。

その後、チャット・ウィジェットを開くと、新しいチャット・セッションが開始されます。

public static void endChat()

会話は、Bots.endChat() APIをコールして動的に終了することもできます。
Bots.endChat()

CompletionHandler

CompletionHandlerは、SDKに実装されるイベント・リスナーで、ホスト・アプリケーションのbeforeEndConversation(CompletionHandler completionHandler)デリゲートで実行されるタスクの完了をリスニングします。ODAおよびOMCのダウンロード・ページから入手できるSDKに付属のJavadocを参照してください。

ヘッドレスSDK

SDKは、そのUIがなくても使用できます。このモードで使用するには、プロジェクトへのOracle Android Client SDKの追加の説明に従って、プロジェクトにcom.oracle.bots.client.sdk.android.core-24.12.aarパッケージのみをインポートします。

SDKは、サーバーへの接続を維持し、メッセージの送信、メッセージの受信、およびネットワーク・ステータスやその他のサービスに関する更新の取得を行うAPIを提供します。APIを使用してSDKと対話し、UIを更新できます。

Botsクラスで使用可能なsend*() APIのいずれかを使用してメッセージを送信できます。たとえば、public static void sendMessage(String text)は、テキスト・メッセージをスキルまたはデジタル・アシスタントに送信します。

public静的void sendMessage(String text)

テキスト・メッセージをスキルに送信します。textパラメータは、テキスト・メッセージです。
Bots.sendMessage("I want to order a Pizza");
EventListener
接続ステータスの変更、スキルとの間で送受信されるメッセージおよびアタッチメントのアップロード・ステータス・イベントをリスニングする場合、クラスはEventListenerインタフェースを実装する必要があり、このインタフェースが次の機能を実装します:
  • void onStatusChange(ConnectionStatus connectionStatus) – このメソッドは、WebSocket接続のステータスが変更されたときにコールされます。connectionStatusパラメータは、接続の現在のステータスです。ConnectionStatus列挙の詳細は、SDK (ODAおよびOMCのダウンロード・ページから入手可能)に含まれるJavadocを参照してください。
  • void onMessageReceived(Message message) – このメソッドは、新しいメッセージがスキルから受信されたときにコールされます。messageパラメータは、スキルから受信されたメッセージです。Messageクラスの詳細は、SDK (ODAおよびOMCのダウンロード・ページから入手可能)に含まれるJavadocを参照してください。
  • void onMessageSent(Message message) - このメソッドは、メッセージがスキルに送信されたときにコールされます。messageパラメータは、スキルに送信されるメッセージです。Messageクラスの詳細は、SDK (ODAおよびOMCのダウンロード・ページから入手可能)に含まれるJavadocを参照してください。
  • void onAttachmentComplete() – このメソッドは、アタッチメントのアップロードが完了したときにコールされます。
public class BotsEventListener implements EventListener {
    @Override
    public void onStatusChange(ConnectionStatus connectionStatus) {
        // Handle the connection status change
    }
 
    @Override
    public void onMessageReceived(Message message) {
        // Handle the messages received from skill/DA
    }
 
 
    @Override
    public void onMessageSent(Message message) {
        // Handle the message sent to skill or Digital Assistant
    }
 
    @Override
    public void onAttachmentComplete() {
        // Handle the post attachment upload actions
        // Close the attachment upload progress popup if any etc.
    }
}
EventListenerタイプのインスタンスは、setEventListener(EventListener eventListener)に渡される必要があります。
public static void setEventListener(EventListener eventListener)
スキルから返されたレスポンスを受信して接続ステータスの変更に関する更新を取得したり、アタッチメントのアップロードの完了時に更新を受信したりするようにリスナーを設定します。eventListenerパラメータは、更新を受信するためのEventListenerタイプのインスタンスです。
Bots.setEventListener(new BotsEventListener());

ウィジェット内Webビュー

機能フラグ: linkHandler

ユーザーがチャット・ウィジェット内からWebページにアクセスできるように、チャット・メッセージのリンク動作を構成できます。チャット・ウィジェットがWebビュー内でリンクを開くため、ユーザーは、ページをタブまたは別のブラウザ・ウィンドウで表示するために会話から切り替える必要がなく、チャットにとどまることができます。

ウィジェット内Webビューの構成

機能フラグ: webViewConfig

Webビューのリンクの動作を構成するには、linkHandler関数にWebviewLinkHandlerType.WEBVIEWを設定します。webViewConfigクラス・オブジェクトを使用して、Webビュー自体のサイズと表示を設定できます:
BotsConfiguration botsConfiguration = new BotsConfiguration.BotsConfigurationBuilder(<SERVER_URI>, false, getApplicationContext()) // Configuration to initialize the SDK
    .channelId(<CHANNEL_ID>)
    .userId(<USER_ID>)
    .linkHandler(WebviewLinkHandlerType.WEBVIEW)
    .webViewConfig(new WebViewConfig()
                                .webViewSize(WebviewSizeWindow.FULL)
                                .webViewTitleColor(<COLOR_VALUE>)
                                .webviewHeaderColor(<COLOR_VALUE>)
                                .clearButtonLabel(<BUTTON_TEXT>)
                                .clearButtonLabelColor(<COLOR_VALUE>)
                                .clearButtonIcon(<IMAGE_ID>))
    .build();
このコード・スニペットに示すように、Webビューに次の属性を設定できます:
属性 設定
webViewSize ウィジェット内Webビュー・ウィンドウの画面サイズをWebviewSizeWindow列挙を使用して設定します。これには、PARTIAL (WebviewSizeWindow.PARTIAL)とFULL (WebviewSizeWindow.FULL)という2つの値があります。
clearButtonLabel Webビューの右上隅にあるクリア/クローズ・ボタンに使用するテキストを設定します。デフォルト・テキストはDONEです。
clearButtonIcon クリア・ボタンのアイコンを設定します。このアイコンは、ボタン内に左揃えで表示されます。
clearButtonLabelColor クリア・ボタン・ラベルのテキストの色を設定します。
clearButtonColor クリア・ボタンの背景色を設定します。
webviewHeaderColor Webビュー・ヘッダーの背景色を設定します。
webviewTitleColor ヘッダーのタイトルの色を設定します。タイトルは、開いているWebリンクのURLです。

複数言語チャット

機能フラグ: multiLangChat

Android SDKのネイティブ言語サポートにより、チャット・ウィジェットがユーザーの言語を検出できると同時に、ヘッダーのドロップダウン・メニューでユーザーが会話言語を選択できるようになります。ユーザーは、会話間でのみ言語を切り替えることができますが、新しい言語を選択すると会話がリセットされるため、会話中にはできません。

言語メニューの有効化

言語タグ(lang)とオプションの表示ラベル(label)で構成されるsupportedLanguage ArrayListを含むオブジェクトでmultiLangChatプロパティを定義することで、ユーザーがドロップダウン・メニューから優先言語を選択できるようにするメニューを有効にできます。この配列の外部で、primaryプロパティを使用してオプションでデフォルト言語を設定できます(次のスニペットではprimary("en"))。
ArrayList<SupportedLanguage> supportedLanguages = new ArrayList<>();
supportedLanguages.add(new SupportedLanguage("en"));
supportedLanguages.add(new SupportedLanguage("fr", "French"));
supportedLanguages.add(new SupportedLanguage("de", "German"));
MultiLangChat multiLangChat = new MultiLangChat().supportedLanguage(supportedLanguages).primary("en");
BotsConfiguration botsConfiguration = new BotsConfiguration.BotsConfigurationBuilder(<SERVER_URI>, false, getApplicationContext()) // Configuration to initialize the SDK
    .channelId(<CHANNEL_ID>)
    .userId(<USER_ID>)
    .multiLangChat(multiLangChat)
    .build();
渡されたサポート対象言語が、チャット・ウィジェットによって、ヘッダーにあるドロップダウン・メニューに表示されます。使用可能な言語に加えて、メニューには「言語の検出」オプションも含まれています。ユーザーがこのメニューから言語を選択すると、現在の会話がリセットされ、選択した言語で新しい会話が開始されます。ユーザーが選択した言語は、同じブラウザではセッションにまたがって継続されるため、チャット・ウィジェットを含むページからユーザーがスキルに再アクセスすると、以前の言語が自動的に選択されます。
複数言語サポートを構成する際には、次の点に注意してください:
  • ドロップダウン・メニューを表示するには、少なくとも2つの言語を定義する必要があります。
  • primaryキーを省略すると、ウィジェットがユーザー・プロファイルの言語を自動的に検出し、メニューの「言語の検出」オプションを選択します。

言語メニュー使用不可

バージョン21.12以降では、supportedLanguage ArrayListを使用せずに初期構成でprimaryを渡すことによって、言語選択ドロップダウン・メニューを構成せずにチャット言語を構成および更新することもできます。primary変数に渡される値は、会話のチャット言語として設定されます。

言語の検出

渡された言語の他に、チャット・ウィジェットでは、ドロップダウンに「言語の検出」オプションが表示されます。このオプションを選択すると、ユーザーのメッセージから会話の言語を自動的に検出し、可能な場合は同じ言語で応答することがスキルに指示されます。
ノート

primaryプロパティを省略すると、ウィジェットによってユーザー・プロファイルの言語が自動的に検出され、メニューの「言語の検出」オプションがアクティブ化されます。

setPrimaryChatLanguage(lang) APIをコールすると、選択した言語を動的に更新できます。渡されたlangがサポートされている言語のいずれかと一致すると、その言語が選択されます。一致するものが見つかりません。「言語の検出」がアクティブ化されます。Bots.setPrimaryChatLanguage('und') APIをコールして、「言語の検出」オプションをアクティブ化することもできます('und'は未確定を示します)。

ドロップダウン・メニューが構成されていない場合でも、setPrimaryChatLanguage(lang) APIを使用してチャット言語を動的に更新できます。

複数言語チャット・クイック・リファレンス

手順は次のとおりです... ...操作
言語選択ドロップダウンをエンド・ユーザーに表示します。 supportedLanguage ArrayListを含むオブジェクトでmultiLangChatプロパティを定義します。
言語選択ドロップダウン・メニューをエンド・ユーザーに表示せずに、チャット言語を設定します。 primaryのみを定義します。
デフォルト言語を設定します。 supportedLanguage配列リストを指定してprimaryを渡します。primary値は、配列に含まれるサポートされている言語のいずれかである必要があります。
言語検出機能の有効化 primaryundとして渡します。
チャット言語を動的に更新します。 setPrimaryChatLanguage(lang) APIをコールします。

「共有」メニュー

デフォルトでは、「共有」メニューには次のファイル・タイプのオプションが表示されます:
  • ビジュアル・メディア・ファイル(イメージおよびビデオ)
  • オーディオ・ファイル
  • ドキュメント、PDF、スプレッドシートなどの一般ファイル
  • ロケーション

オブジェクトのArrayListをshareMenuItems shareMenuItems(Arraylist<Object>)に渡すことで、メニューで選択できるアイテムのタイプを制限すなわちフィルタしたり、メニューのアイコンやラベルをカスタマイズしたり、アップロード・ファイル・サイズ(次のスニペットでは1024など)を制限したりできます。このようなオブジェクトとしては、shareMenuCustomItemオブジェクト、または共有メニュー・アイテムにマップされたShareMenuItem列挙値を使用できます。共有メニュー・アイテムには、カメラ・メニュー・アイテム(デバイスでサポートされている場合)用のShareMenuItem.CAMERA、イメージまたはビデオ・アイテムを共有するためのShareMenuItem.VISUAL、オーディオ・アイテムを共有するためのShareMenuItem.AUDIO、ファイル・アイテムを共有するためのShareMenuItem.FILEがあります。空の値またはnull値を渡すと、ShareMenuItem列挙値として渡すことができるすべてのメニュー・アイテムが表示されます。

次のスニペットのshareMenuCustomItem3 = ShareMenuCustomItem('csv')のように、ShareMenuCustomItemオブジェクトのラベルに値がないかnullの場合、タイプの文字列が接尾辞としてshare_に付加されたものがラベルになります。shareMenuCustomItem3では、ラベルはshare_csvです。ShareMenuCustomItemオブジェクトのタイプを*と設定すると、ユーザーがすべてのファイル・タイプをアップロードできるようになります。
ノート

この構成は、enableAttachmenttrueに設定されている場合にのみ適用されます。
ArrayList<Object> customItems = new ArrayList<>();
ShareMenuCustomItem shareMenuCustomItem1  = new ShareMenuCustomItem("pdf bin", "Label1", 1024, R.drawable.odaas_menuitem_share_file);
ShareMenuCustomItem shareMenuCustomItem2  = new ShareMenuCustomItem("doc", "Label2", R.drawable.odaas_menuitem_share_file);
ShareMenuCustomItem shareMenuCustomItem3  = new ShareMenuCustomItem("csv");
ArrayList<Object> customItems = new ArrayList<>(Arrays.asList(shareMenuCustomItem1,shareMenuCustomItem2,shareMenuCustomItem3,ShareMenuItem.CAMERA));
BotsConfiguration botsConfiguration = new BotsConfiguration.BotsConfigurationBuilder(sharedPreferences.getString(getString(R.string.pref_name_chat_server_host), Settings.CHAT_SERVER_URL), false, getApplicationContext())
         .channelId(<CHANNEL_ID>)
         .userId(<USER_ID>)
        .shareMenuItems(customItems)
        .enableAttachment(true)
        .build();

public静的void shareMenuItems()

Bots.shareMenuItems(); APIをコールして、共有メニュー・アイテム・リストを取得できます。
Bots.shareMenuItems()

public static void shareMenuItems(ArrayList<Object> shareMenuItems)

Bots.shareMenuItems(customItems); APIをコールして、共有メニュー・アイテムのポップアップを動的に更新できます(customItemsはオブジェクトのArrayListです)。各オブジェクトとして使用できるのは、ShareMenuItem列挙値型またはShareMenuCustomItemオブジェクトのいずれかです。
ArrayList<Object> customItems = new ArrayList<>();
ShareMenuCustomItem shareMenuCustomItem1  = new ShareMenuCustomItem("pdf bin", "Label1", 1024, R.drawable.odaas_menuitem_share_file);
ShareMenuCustomItem shareMenuCustomItem2  = new ShareMenuCustomItem("doc", "Label2", R.drawable.odaas_menuitem_share_file);
ShareMenuCustomItem shareMenuCustomItem3  = new ShareMenuCustomItem("csv");
customItems.add(shareMenuCustomItem1);
customItems.add(ShareMenuItem.CAMERA);
customItems.add(ShareMenuItem.FILE);
customItems.add(shareMenuCustomItem2);
customItems.add(shareMenuCustomItem3);
Bots.shareMenuItems(customItems);

音声認識

機能フラグ: enableSpeechRecognition

enableSpeechRecognition機能フラグをtrueに設定すると、ユーザー入力フィールドが空の場合に送信ボタンとともにマイクロフォン・ボタンが表示されます。

このプロパティをtrueに設定すると、enableSpeechRecognitionAutoSendプロパティによって有効になる機能もサポートされます。このプロパティをtrueに設定すると、ユーザーの音声レスポンスがチャット・サーバーに自動的に送信され、レスポンスが送信メッセージとしてチャット・ウィンドウに表示されます。enableSpeechRecognitionAutoSendfalseに設定すると、ユーザーは、発言したメッセージを手動で送信する前に編集(または削除)できるようになります。

public static void startRecording(IBotsSpeechListener listener)

ユーザーの音声メッセージの記録を開始します。listenerパラメータは、サーバーから返されたレスポンスを受信するためのIBotsSpeechListenerのインスタンスです。

public static void stopRecording()

ユーザーの音声メッセージの記録を停止します。

public static boolean isRecording()

音声記録が開始されているかどうかを確認します。記録が開始されている場合はtrueを返します。そうでない場合はfalseを返します。

IBotsSpeechListener

クラスは、インタフェースIBotsSpeechListenerを実装し、それに次のメソッドの機能を実装する必要があります:

void onError(String error)

このメソッドは、サーバーへの接続を確立している間にエラーが発生した場合、または入力がないか入力が多すぎる場合にコールされます。errorパラメータは、エラー・メッセージです。

void onSuccess(String utterance)

このメソッドは、最終的な結果がサーバーから受信されたときにコールされます。utteranceパラメータは、サーバーから受信された最終的な発話です。

ノート

このメソッドは、リリース20.8.1では非推奨です。

void onSuccess(BotsSpeechResult botsSpeechResult)

このメソッドは、最終的な結果がサーバーから受信されたときにコールされます。パラメータのbotsSpeechResultは、サーバーから受信される最終レスポンスです。

void onPartialResult(String utterance)

このメソッドは、部分的な結果がサーバーから受信されたときにコールされます。utteranceパラメータは、サーバーから受信された部分的な発話です。

void onClose(int code, String message)

このメソッドは、サーバーへの接続がクローズされるときにコールされます。

パラメータ:
  • code – ステータス・コード
  • message – 接続をクローズする理由

void onOpen()

このメソッドは、サーバーへの接続がオープンされるときにコールされます。

onActiveSpeechUpdate(byte[] speechData)

このメソッドは、ユーザーの音声メッセージに更新がある場合にコールされ、音声ビジュアライザの更新に使用できます。パラメータは、記録されたユーザーの音声のバイト配列であるspeechDataです。
public class BotsSpeechListener implements IBotsSpeechListener {
    @Override
    public void onError(String error) {
            // Handle errors
    }
 
    @Override
    public void onSuccess(String utterance) {
        // This method was deprecated in release 20.8.1.
        // Handle final result
    }
 
 
    @Override
    public void onSuccess(BotsSpeechResult botsSpeechResult) {
        // Handle final result
    }  
 
    @Override
    public void onPartialResult(String utterance) {
        // Handle partial result
    }
 
    @Override
    public void onClose(int code, String message) {
        // Handle the close event of connection to server
    }
 
    @Override
    public void onOpen() {
        // Handle the open event of connection to server
    }
 
 
    @Override
    public void onActiveSpeechUpdate(byte[] speechData) {
        // Handle the speech update event
    }
}
 
 
Bots.startRecording(new BotsSpeechListener()); // Start voice recording
 
if (Bots.isRecording()) {
    Bots.stopRecording(); // Stop voice recording
}

音声合成

  • 機能フラグ: enableSpeechSynthesis
  • 機能構成: speechSynthesisVoicePreferences
SDKは、スキルから新しいメッセージを受信した場合にスキルのメッセージを読み上げる音声合成と統合されています:
  • ユーザーは、チャット・ビューのヘッダーにあるボタンを使用して、スキルのオーディオ・レスポンスをミュートまたはミュート解除できます。この機能を有効にするには、enableSpeechSynthesis機能フラグをtrueに設定します。
  • speechSynthesisVoicePreferencesプロパティを使用して、スキルのメッセージを読み上げる優先言語を設定できます。言語および音声を設定するこのパラメータは、SpeechSynthesisSettingインスタンスのリストです(ODAおよびOMCのダウンロード・ページからダウンロードしたSDKのJavadocを参照)。このプロパティにより、デバイスが優先言語または優先音声をサポートしていない場合にフォールバックが有効になります。デバイスで優先音声がサポートされない場合は、かわりに優先言語のデフォルト音声が使用されます。優先音声も優先言語もサポートされない場合は、デフォルトの音声と言語が使用されます。

public static void initSpeechSynthesisService()

音声合成サービスを初期化します。このメソッドは、アクティビティのonCreate()メソッドでコールして、音声合成サービスを初期化する必要があります。音声合成サービスの初期化は、enableSpeechSynthesis機能フラグがtrueに設定されている場合にのみ、SDKライブラリの初期化時に実行されます。
public class ConversationActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bots.initSpeechSynthesisService();
    }
}

public静的void startBotAudioResponse(String text)

スキルのレスポンスの読上げを開始します。textパラメータは、読み上げられるスキルのメッセージのテキストです。
Bots.startBotAudioResponse("What kind of crust do you want?");
ノート

このメソッドは、リリース21.08で非推奨になりました。

public static void stopBotAudioResponse()

スキルのレスポンスの読上げを停止します。
Bots.stopBotAudioResponse()

public static boolean isSpeaking()

スキルのレスポンスが現在読み上げられているかどうかを確認します。

スキルのレスポンスが現在読み上げられている場合、trueを返します。そうでない場合はfalseを返します。
if (Bots.isSpeaking()) {
    Bots.stopBotAudioResponse();
}

public static void shutdownBotAudioResponse()

SDKで使用されているリソースを解放します。

このメソッドは、ConversationActivityonDestroy()メソッドでコールされます。
public class ConversationActivity extends AppCompatActivity {
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Bots.shutdownBotAudioResponse();
    }
}

音声サービス注入

機能フラグ: ttsService

speechSynthesisService機能フラグを使用すると、任意のテキスト読み上げ(TTS)サービス(独自のサービス、またはサードパーティ・ベンダーが提供するサービス)をSDKに注入できます。TTSサービスを注入するには、最初にenableSpeechSynthesis機能フラグをtrueに設定してから、SpeechSynthesisServiceインタフェースのインスタンスをspeechSynthesisServiceフラグに渡す必要があります。

SpeechSynthesisServiceインタフェース

SpeechSynthesisServiceインタフェースの実装であるクラスのインスタンスを作成します。次のメソッドを実装します。
  • initTextToSpeechService(@NonNull Application application, @NonNull BotsConfiguration botsConfiguration): 新しいTTSサービスを初期化します。
    パラメータ 説明
    application アプリケーション。これはnullにできません。
    botsConfiguration ライブラリの機能の制御に使用されるBotsConfigurationオブジェクト。これはnullにできません。
  • speak(String phrase): 発話キューに発話されるフレーズを追加します。 phraseパラメータは、話すテキストです。
  • isSpeaking(): オーディオ・レスポンスが話されているかどうかを確認します。進行中のオーディオ・レスポンスがない場合、falseを返します。
    ノート

    このメソッドは、リリース21.08で非推奨になりました。
  • stopTextToSpeech(): 進行中の音声合成を停止します。
    ノート

    このメソッドは、リリース21.08で非推奨になりました。
  • shutdownTextToSpeech(): TextToSpeechエンジンによって使用されるリソースを解放します。
  • getSpeechSynthesisVoicePreferences(): 音声合成に使用される使用可能な音声の最適な一致の選択に使用される音声プリファレンス配列を返します。
  • setSpeechSynthesisVoicePreferences(ArrayList<SpeechSynthesisSetting> speechSynthesisVoicePreferences): 音声合成に最適な音声一致を選択するために使用する音声プリファレンス配列を設定します。speechSynthesisVoicePreferencesパラメータは、音声合成の音声プリファレンス配列です。
  • onSpeechSynthesisVoicePreferencesChange(ArrayList<SpeechSynthesisSetting> speechSynthesisVoicePreferences): 音声合成音声を最適な音声一致に設定します。
    ノート

    このメソッドは、リリース21.08で非推奨になりました。
    このメソッドは、音声プリファレンスArrayListを設定した後、setSpeechSynthesisVoicePreferencesメソッド内でコールすることをお薦めします。speechSynthesisVoicePreferencesパラメータは、音声合成の音声プリファレンス配列です。
  • onSpeechRecognitionLocaleChange(Locale speechLocale: このメソッドは、音声認識言語が変更されたときに起動されます。このメソッドをオーバーライドすることで、音声合成言語を音声認識言語と同じ言語に設定できます。speechLocaleパラメータは、音声認識に設定されたロケールです。
   private class TextToSpeechServiceInjection implements SpeechSynthesisService {

        @Override
        public void initTextToSpeechService(@NonNull Application application, @NonNull BotsConfiguration botsConfiguration) {
            // Initialisation of Text to Speech Service.
        }

        @Override
        public void speak(String phrase) {
            // Adds a phrase to the utterance queue to be spoken
        }

        @Override
        public boolean isSpeaking() {
            // Checks whether the bot audio response is being spoken or not.
            return false;
        }

        @Override
        public void stopTextToSpeech() {
            // Stops any ongoing speech synthesis
        }

        @Override
        public void shutdownTextToSpeech() {
            // Releases the resources used by the TextToSpeech engine.
        }

        @Override
        public ArrayList<SpeechSynthesisSetting> getSpeechSynthesisVoicePreferences() {
            // The voice preferences array which is used to choose the best match available voice for speech synthesis.
            return null;
        }

        @Override
        public void setSpeechSynthesisVoicePreferences(ArrayList<SpeechSynthesisSetting> speechSynthesisVoicePreferences) {
            // Sets the voice preferences array which can be used to choose the best match available voice for speech synthesis.
        }

        @Override
        public SpeechSynthesisSetting onSpeechSynthesisVoicePreferencesChange(ArrayList<SpeechSynthesisSetting> speechSynthesisVoicePreferences) {
            // Sets the speech synthesis voice to the best voice match available.
            return null;
        }

        @Override
        public void onSpeechRecognitionLocaleChange(Locale speechLocale) {
            // If the speech recognition language is changed, the speech synthesis language can also be changed to the same language.
        }
    }
ノート

SpeechSynthesisService#setSpeechSynthesisVoicePreferencesonSpeechSynthesisVoicePreferencesChange(ArrayList<SpeechSynthesisSetting>)およびSpeechSynthesisService#onSpeechSynthesisVoicePreferencesChange(ArrayList<SpeechSynthesisSetting>)は、このリリースでは非推奨であり、SpeechSynthesisService#setTTSVoice(ArrayList<SpeechSynthesisSetting>)およびSpeechSynthesisService#getTTSVoice()に置き換えられました。以前は、 SpeechSynthesisService#setSpeechSynthesisVoicePreferencesonSpeechSynthesisVoicePreferencesChangeは音声合成音声プリファレンス配列を設定し、SpeechSynthesisService#onSpeechSynthesisVoicePreferencesChangeは音声合成に使用できる最適な音声を設定し、選択した音声を返しました。これで、音声合成音声プリファレンス配列と音声合成に最適な音声の両方を設定する新しいメソッドSpeechSynthesisService#setTTSVoice(ArrayList<SpeechSynthesisSetting> TTSVoices)と、音声合成用に選択した音声を返すSpeechSynthesisService#getTTSVoice()によって、同じ機能が実現されました。

ユーザーエージェント会話のインジケータの入力

機能フラグ: enableSendTypingStatus

有効にすると、SDKは、ユーザーが現在入力しているテキストとともにRESPONDING入力イベントをに送信します。これは、エージェント・コンソールの入力インジケータを示しています。ユーザーが入力を完了すると、SDKはLISTENINGイベントをOracle B2C ServiceまたはOracle Fusion Serviceに送信します。これにより、エージェント・コンソールの入力インジケータが非表示になります。

同様に、エージェントが入力中の場合、SDKはサービスからRESPONDINGイベントを受信します。このイベントを受信すると、SDKはユーザーに入力インジケータを表示します。エージェントがアイドル状態になると、SDKはサービスからLISTENINGイベントを受信します。このイベントを受信すると、SDKによって、ユーザーに表示される入力インジケータが非表示になります。

sendUserTypingStatus APIは、ヘッドレス・モードでも同じ動作を有効にします。
public void sendUserTypingStatus(TypingStatus status, String text)
  • エージェント・コンソールに入力インジケータを表示するには:
    Bots.sendUserTypingStatus("RESPONDING", "<Message_Being_Typed>");
  • エージェント・コンソールで入力インジケータを非表示にするには:
    Bots.sendUserTypingStatus("LISTENING", "");
  • ユーザー側の入力インジケータを制御するには、onReceiveMessage(Message message)イベントを使用します。例:
    public void onReceiveMessage(Message message) {
         if (message != null) {
           MessagePayload messagePayload = message.getPayload();
           if (messagePayload instanceof StatusMessagePayload) {
             StatusMessagePayload statusMessagePayload = (StatusMessagePayload) messagePayload;
             String status = statusMessagePayload.getStatus();
    
             if (status.equalsIgnoreCase(String.valueOf(TypingStatus.RESPONDING))) {
               // show typing indicator
             } else if (status.equalsIgnoreCase(String.valueOf(TypingStatus.LISTENING))
               // hide typing indicator
             }
           }
         }
追加の制御を提供する設定がさらに2つあります。
  • typingStatusInterval– デフォルトでは、SDKはRESPONDING入力イベントを3秒ごとにサービスに送信します。このフラグを使用して、このイベントを抑制します。設定できる最小値は3秒です。
  • enableAgentSneakPreview - Oracle B2C Serviceでは、入力中のユーザー・テキストの表示がサポートされています。このフラグがtrue (デフォルトはfalse)に設定されている場合、SDKは実際のテキストを送信します。ユーザー・プライバシを保護するために、フラグがfalseに設定されている場合、SDKは実際のテキストのかわりに...をOracle B2C Serviceに送信します。
    ノート

    この機能は、SDKとOracle B2C Serviceチャット構成の両方で有効にする必要があります。

ユーザー・アバターの更新

実行時にユーザー・アバターの動的更新を有効にできます。

パブリックvoid updatePersonAvatar

すべてのメッセージ(前のメッセージを含む)のユーザー・アバターを設定します。
ConversationActivity.setUserPerson(Object);

エージェント詳細の公開

これらのAPIを使用して、エージェント名、テキストの色、アバター、エージェント名のイニシャル、テキストの色およびアバターの背景を変更します。

パブリックAgentDetails getAgentDetails()

エージェントの詳細を含むオブジェクトを返します。
Bots.getAgentDetails(AgentDetails);
AgentDetailsクラスの詳細は、Javadocを参照してください。

public void setAgentDetails(AgentDetails)

サーバーから受信したエージェントの詳細をオーバーライドします。
Bots.setAgentDetails(AgentDetails);

パブリックAgentDetails getAgentDetails()

エージェントの詳細を含むオブジェクトを返します。
Bots.getAgentDetails(AgentDetails);
AgentDetailsクラスの詳細は、Javadocを参照してください。

音声ビジュアライザ

音声サポートが有効になっている場合(enableSpeechRecognition(true))、チャット・ウィジェットのフッターに音声ビジュアライザ(音声入力の頻度レベルを示す動的ビジュアライザ・グラフ)が表示されます。ビジュアライザは、ユーザーが話しているのが小さすぎるか大きすぎるかを示して、ユーザーの音声の変調に反応します。このビジュアライザは、ユーザーが話しているときに記録されたバイト・ストリームを使用して作成され、ヘッドレス・モードで使用するためにIBotsSpeechListener#onActiveSpeechUpdate(byte[])メソッドでも公開されます。

チャット・ウィジェットには、ユーザーが音声アイコンをクリックすると音声ビジュアライザが表示されます。これは、SDKがユーザーの音声をキャプチャするのに、オーディオ・レベルが十分な高さであるかどうかを示すインジケータです。ユーザーのメッセージは、テキストとして認識されるため、ビジュアライザの下に表示されます。
ノート

キーボード・アイコンが表示されると、音声モードが示されます。

enableSpeechRecognitionAutoSend(true)の場合、ユーザーがメッセージの口述を終了すると、認識されたテキストがスキルに自動的に送信されます。その後、モードはテキスト入力に戻ります。enableSpeechRecognitionAutoSend(false)の場合も、モードはテキスト入力に戻りますが、この場合、ユーザーはスキルにメッセージを送信する前に認識されたテキストを変更できます。