このページの本文へ

車とスマホがつながるSDLの世界 第7回

メニュー画面を表示してみよう

SDL対応アプリ開発環境の構築その3~Android版のSDLのAPIを使いこなす

2019年01月12日 11時00分更新

文● 柴田文彦 編集●アスキー編集部

  • この記事をはてなブックマークに追加
  • 本文印刷

ディスプレイのテンプレートを選択する

 はじめに、車載機側のディスプレイの基本的なレイアウトを決めるテンプレートを変更してみよう。このテンプレートは、車載機側に実装されているものなので、アプリ単独ではどのようなテンプレートが利用可能なのかさえ分からない。そこでアプリは、車載機に接続すると、どんなテンプレートが利用可能なのかを通信によって尋ね、その答えに含まれているものの中から1つを選んで指定することができる。

 ただし、今回はその問い合わせのプロセスを省き、おそらくほとんどの車載機に搭載されている(もちろんエミュレーターもサポートしている)シンプルなものを指定することにしよう。それは、「NON_MEDIA」と呼ばれるもので、アプリの画像1つと、最大4行の任意のテキスト、そして4つまでのソフトボタンを1画面に配置できるようになっている。

 テンプレートの選択に限らず、SDLアプリ側から車載機側へのリクエストは、基本的に次の3つのステップによって実現する。

1. リクエストの作成
2. レスポンスに対するリスナーの設定
3. RPCによるリクエストの送信

 1のリクエストの作成は、リクエストの種類ごとにリクエストオブジェクトを作成し、そこにパラメータを設定するという2段階の処理となる。このディスプレイレイアウトの設定の場合のコードは、次のようになる。

SetDisplayLayout setDisplayLayoutRequest = new SetDisplayLayout();
setDisplayLayoutRequest.setDisplayLayout(PredefinedLayout.NON_MEDIA.toString());

 作成するオブジェクトは、SetDisplayLayoutクラスで、そのsetDsiaplayLayoutメソッドを使って、PredefinedLayoutの中の「NON_MEDIA」という名前のテンプレートを指定している。

 次に2のレスポンスに対するリスナーの設定だが、これも1で作成したオブジェクトのsetOnRPCResponseListenerメソッドを使って設定する。これは、次に示すように、onReseponseという応答に対するイベント処理のメソッドを記述する形となっている。

setDisplayLayoutRequest.setOnRPCResponseListener(new OnRPCResponseListener() {
    @Override
    public void onResponse(int correlationId, RPCResponse response) {
        if(((SetDisplayLayoutResponse) response).getSuccess()){
            Log.i("SdlService", "Display layout set successfully.");
        }else{
            Log.i("SdlService", "Display layout request rejected.");
        }
    }
});

 この例では、レスポンスとしては特にアプリの動作に影響することは何も実行していない。リクエストが成功した場合には「Display layout set successfully.」、失敗した場合には「Display layout request rejected.」というメッセージをログに書き出しているだけだ。実際のアプリでは、このテンプレートの設定が成功したことを前提に実行する必要のあるコードがあれば、ここに記述すれば良いだろう。

 そして3のリクエストの送信には、すでにSdlMangerクラスから別途作成してあるsdlMangerオブジェクトのsendRPCメソッドを使う。

sdlManager.sendRPC(setDisplayLayoutRequest);

 ちなみに、ここに出てくるsdlManagerオブジェクトは、SdlServiceの先頭に近い部分で、以下のようにフィールドとして定義されている。

private SdlManager sdlManager = null;

 さて、残る問題は、このテンプレート設定のコードをSdlService内のどこに置けば良いかということだ。

 これには色々な可能性が考えられるが、アプリと車載機の通信が確立してからでなければうまくいかないのは確かだ。SdlServiceの中には、アプリから車載機の状態をチェックしている部分がある。車載機の状態は、アプリとの通信が確立してから何段階かのレベルで変化するが、最終的にはフル稼働状態(HMILevel.HMI_FULL)になる。アプリが起動してから、最初にこの状態になった時点で、3つのメソッドを続けて呼び出している部分がある。その3つのメソッド呼び出しは、以下のようになっている。

sendCommands();
performWelcomeSpeak();
performWelcomeShow();

 最初に呼び出されるsendCommands()の中では、1つだけメニューを設定している。次のperformWelcomeSpeak()では、車載機に対して「Welcome to Hello S D L」という文を音声で読み上げるようなコマンドを発行する。そして、performWelcomeShow()では、車載機側のアプリ画面に、「Hello Sdl」というアプリ名、「Welcome to HelloSDL」というメッセージをテキストとして表示し、さらにSDLロゴのグラフィックも表示している。

 これらの動作を考慮すると、ここではメッセージの表示の前のタイミングでテンプレートを選択しておくのが良さそうだ。そこで、performWelcomeShow()メソッドの中に、上記のテンプレート設定コードを追加することにしよう。このメソッドの先頭部分に上のコードを追加すればいい。まずは、最初のリクエスト作成の2行だ(図2)。

図2:最初からSdlSeervice.javaに含まれるperformWelcomeShow()メソッドの中に、車載機のUIのテンプレートを設定するためのコードを加えようとするとエラーが発生する

 すると、当然と言えば当然ながら、さっそくエラーが発生している。これらはSetDisplayLayoutクラスや、その中のメソッド、既定のテンプレートを定義しているPredefinedLayoutなどが未知だというもの。

 これらのエラーは、表示されるガイドに従って自動インポート機能によって該当するクラスやタイプをインポートすれば簡単に解決できる。この自動インポート機能は、今後も新たなクラスやタイプを利用するコードを追加するたびに活躍することになる。今後はいちいち示さないので、適宜活用してコードを入力していただきたい。

 続いて、同様にして、リクエストに対するレスポンスを受ける部分と、リクエストを送信するコードも記述しよう。その結果、performWelcomeShow()メソッドの先頭部分はこの図のようになる(図3)。

図3:performWelcomeShow()メソッドの先頭部分に、空白を除いて13行のコードを追加して、車載機ディスプレイのテンプレートを指定する

 ここまでの成果を確認するために、前回に示したのと同じ手順で、車載機エミュレーターを起動し、アプリを実行してみよう。最初のアプリ一覧画面でアプリアイコンをクリックすると、「Hello Sdl」というタイトルのアプリ画面に切り替わる(図4)。

図4:「NON_MEDIA」のテンプレートを指定したことで、車載機ディスプレイのレイアウトは、デフォルトとは異なるものとなった

 アプリ名、ウェルカムメッセージ、アプリのロゴと、表示している情報は前回に示したデフォルトのものと変わらないが、レイアウトが変化していることに気付かれるはずだ。これが「NON_MEDIA」にテンプレートによるレイアウトだ。さらにユーザーインターフェースをカスタマイズするためのプログラミングを続けて行こう。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

最新記事

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン