ディスプレイのテンプレートを選択する
はじめに、車載機側のディスプレイの基本的なレイアウトを決めるテンプレートを変更してみよう。このテンプレートは、車載機側に実装されているものなので、アプリ単独ではどのようなテンプレートが利用可能なのかさえ分からない。そこでアプリは、車載機に接続すると、どんなテンプレートが利用可能なのかを通信によって尋ね、その答えに含まれているものの中から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)。
すると、当然と言えば当然ながら、さっそくエラーが発生している。これらはSetDisplayLayoutクラスや、その中のメソッド、既定のテンプレートを定義しているPredefinedLayoutなどが未知だというもの。
これらのエラーは、表示されるガイドに従って自動インポート機能によって該当するクラスやタイプをインポートすれば簡単に解決できる。この自動インポート機能は、今後も新たなクラスやタイプを利用するコードを追加するたびに活躍することになる。今後はいちいち示さないので、適宜活用してコードを入力していただきたい。
続いて、同様にして、リクエストに対するレスポンスを受ける部分と、リクエストを送信するコードも記述しよう。その結果、performWelcomeShow()メソッドの先頭部分はこの図のようになる(図3)。
ここまでの成果を確認するために、前回に示したのと同じ手順で、車載機エミュレーターを起動し、アプリを実行してみよう。最初のアプリ一覧画面でアプリアイコンをクリックすると、「Hello Sdl」というタイトルのアプリ画面に切り替わる(図4)。
アプリ名、ウェルカムメッセージ、アプリのロゴと、表示している情報は前回に示したデフォルトのものと変わらないが、レイアウトが変化していることに気付かれるはずだ。これが「NON_MEDIA」にテンプレートによるレイアウトだ。さらにユーザーインターフェースをカスタマイズするためのプログラミングを続けて行こう。
この連載の記事
-
第10回
スマホ
未来の車とバイクを楽しく安全にするアイデアが集結 -
第9回
sponsored
車両情報+ニュース読み上げアプリを作ってみた! -
第8回
sponsored
SDL対応アプリ開発環境の構築その4~白紙のiOSプロジェクトから作るSDLアプリ -
第6回
sponsored
SDL対応アプリ開発環境の構築その2~アプリ開発環境を整える -
第5回
sponsored
クルマがしゃべる未来って? ロボホンとクルマをつないでみた -
第4回
sponsored
SDL対応アプリ開発環境の構築その1~車載機エミュレーターを作成する -
第3回
sponsored
トヨタ・スズキ・LINEのキーマンが語る、SDLとスマホが作る車・バイクの未来 -
第2回
sponsored
スマホアプリをカーナビで動かすと、こんな世界が待っている! -
第1回
sponsored
車・バイクとスマホを連携させるSDL規格の基礎知識 -
sponsored
車とスマホがつながるSDLの世界 - この連載の一覧へ