ラベル Android Auto の投稿を表示しています。 すべての投稿を表示
ラベル Android Auto の投稿を表示しています。 すべての投稿を表示

2015年8月21日金曜日

[コラム]どうなった?Android Auto -アプリ公開編-

2015年7月16日木曜日

※Android Auto公式サイトより引用 https://www.android.com/intl/ja_jp/auto/

このブログでも何回か触れているAndroid Autoですが、その後どうなっているのでしょうか。
現在のAndroid Autoについてまとめました。

2015/3/20にAndroid Auto公式アプリがリリースされ、
Android Auto対応カーナビも続々発売されています。
しかし、現在利用可能な国はアメリカ、イギリス、オーストラリアだけです。
日本では、以下の日本語公式サイトが存在するものの、まだ利用できません。
https://www.android.com/intl/ja_jp/auto/

Android Autoに対応したアプリも配信されており、Google Playでもまとめられているようですが、
こちらも日本からはアクセスできません。
http://g.co/androidauto

日本でまだ利用できないのは残念ですが、
正式なサービスが始まっているため、いくつかの新情報もあります。
今回は、以下のURLで解説されているAndroid Autoの使用方法についてまとめました。
https://support.google.com/androidauto


■環境

・Android Autoの動作環境

  • Android Autoに対応したAndroid端末(Lollipop)
    車載カーナビとはUSBケーブルで接続します。
    また、カーナビとAndroid端末間ではBluetooth通信も使用します。
  • Android Auto公式アプリ(上記Android端末にインストール必須)
  • Android Autoに対応した車

・Android Autoで未対応の動作

おそらく安全面の理由から、以下の動作は未対応とされています。
  • Android Auto対応アプリ以外の端末操作(車載カーナビとUSBケーブル接続中)
  • テレビ、youtubeなどの動画再生
  • 文字入力キーボードの使用

・その他

  • Android Autoで使用するデータ通信は、Android端末上で発生する量と同等。
    外部と通信するのはあくまでAndroid端末のみ、ということになります。
  • Android Auto使用中、Android端末はUSBケーブルを通じて給電される。
    極端にバッテリーを消耗するAndroid Autoアプリがない限り、バッテリーの心配はなさそうです。
  • GPSが内蔵されている車であれば、Android端末は車側のGPS信号を使用できる。
    仕組みは不明ですが、Android端末側のGPS精度は気にしなくて良いようです。

■画面構成

・ホーム画面

Android Auto開始後、カーナビのディスプレイにはAndroid Autoのホーム画面が表示されます。ホーム画面の構成は以下のようになっています。

※Android Auto公式サイトより引用 https://support.google.com/androidauto
  1. ナビゲーション通知
  2. リマインダー
  3. 音声コマンド
    マイクアイコンをタッチすることで、音声入力が可能になり、以下の操作が行えます。
    ・音楽再生(曲名)
    ・地図のルート検索
    ・電話発信
    ・スケジュールの取得

・アプリ選択

ホーム画面の下部にはアプリカテゴリのアイコンがあり、選択するとAndroid端末内にインストールされているAndroid Auto対応アプリのリストが表示されます。

※Android Auto公式サイトより引用 https://support.google.com/androidauto
  1. ナビゲーション
  2. 電話
  3. ホーム画面
  4. 音楽再生
  5. 車アプリ

■Android Autoの使い方

Android Autoでは音声入力による操作が前提です。
音声入力やその他の操作で以下の機能を使用できます。

・電話

  • 発信(音声入力)
    「Call Cody White」「Call XXX-XXX-XXX」のように、「Call」の後に名前(電話帳に登録されている)や電話番号を言うだけで発信が可能です。

  • 発信(番号入力)
    ホーム画面下部の電話アイコンを押し、表示されるダイヤル画面から発信可能です。

  • 着信応答
    着信を受けると、ホーム画面上にNotificationが表示されます。それをタッチすることで、着信応答できます。

  • 不在着信応答
    不在着信情報は、ホーム画面上のNotificationとして表示されます。それをタッチすることで、不在着信に応答できます。

  • 留守電や通話履歴の参照
    ホーム画面下部の電話アイコンを押し、メニューから選択します。

・テキストメッセージの送信

  • テキスト送信
    「Text Cody White」「Text XXX-XXX-XXX」のように、「Text」の後に名前(電話帳に登録されている)や電話番号を言うだけでテキスト送信機能が起動します。
    アプリの音声ガイダンスに従ってテキスト本文を音声入力し、最終的に「send」で送信、「cancel」で取り止めます。

  • テキスト受信
    受信すると、ホーム画面上にNotificationが表示されます。それをタッチすることで、受信したテキストが音声で読み上げられます。
  • テキスト返信
    「reply」と話すことで、最後に受信したテキストに対する返信を開始します。
    アプリの音声ガイダンスに従ってテキスト本文を音声入力し、最終的に「send」で送信、「cancel」で取り止めます。

・リマインダーの設定

  • 時間ベースのリマインダー
    「Remind me to call John at 7pm.」
    「Remind me to pick up the cake this afternoon.」
    上記のように、正確またはおおよその時刻と合わせて音声入力することで、リマインダーが登録され、その時間になるとHome画面にNotificationが表示されます。
  • 場所ベースのリマインダー
    「Remind me to buy coffee beans when I get to Starbucks.」
    「Remind me to bring in the groceries when I get to my destination.」
    「Remind me to call mom when I get home.」
    上記のように、正確またはおおよその場所と合わせて音声入力することでリマインダーが登録され、その場所に到着するとHome画面にNotificationが表示されます。

・目的地ナビゲーションの取得

  • 音声によるナビ検索
    「Navigate to Union Square, San Francisco」
    「Directions to Philz Coffee.」
    「Directions to 1600 Amphitheatre Parkway, Mountain View.」
    上記のように目的地を音声入力するだけで、ナビが開始されます。

  • 手操作によるナビ検索
    ホーム画面下部のナビゲーションアイコンを押し、操作します。

  • 交通情報の取得
    交通情報に合わせた表示更新はリアルタイムに行われます。メニューの設定から交通情報表示をオフにすることも可能です。

・Google Mapからの目的地候補取得

  • 目的地候補の取得
    ホーム画面下部のナビゲーションアイコンから、人気のスポットや過去に行ったことのある目的地候補を取得できます。

  • カテゴリ検索
    ホーム画面下部のナビゲーションアイコンから、目的地のカテゴリ検索が可能です。

・音楽再生

「play music.」と言うだけで、"I'm feeling lucky"プレイリストがデフォルトで再生されます。
特定の曲やアーティストを指定する場合は、「play」の後に続けて音声入力します。



----------

以上が、Android Autoの使用方法になります。
音声入力によるカーナビ操作は、運転中でもかなり便利そうです。
ただし、それだけ音声入力が肝になるため、
日本語対応には時間がかかっているのかもしれません。
近い将来、日本でもAndroid Autoを使用できるのが待ち遠しいですね。

[コラム]どうなった?Android Auto -使用方法編-

※Android Auto公式サイトより引用 https://www.android.com/intl/ja_jp/auto/

このブログでも何回か触れているAndroid Autoですが、その後どうなっているのでしょうか。
現在のAndroid Autoについてまとめました。

2015/3/20にAndroid Auto公式アプリがリリースされ、
Android Auto対応カーナビも続々発売されています。
しかし、現在利用可能な国はアメリカ、イギリス、オーストラリアだけです。
日本では、以下の日本語公式サイトが存在するものの、まだ利用できません。
https://www.android.com/intl/ja_jp/auto/

Android Autoに対応したアプリも配信されており、Google Playでもまとめられているようですが、
こちらも日本からはアクセスできません。
http://g.co/androidauto

日本でまだ利用できないのは残念ですが、
正式なサービスが始まっているため、いくつかの新情報もあります。
今回は、以下のURLで解説されているAndroid Autoの使用方法についてまとめました。
https://support.google.com/androidauto


■環境

・Android Autoの動作環境

  • Android Autoに対応したAndroid端末(Lollipop)
    車載カーナビとはUSBケーブルで接続します。
    また、カーナビとAndroid端末間ではBluetooth通信も使用します。
  • Android Auto公式アプリ(上記Android端末にインストール必須)
  • Android Autoに対応した車

・Android Autoで未対応の動作

おそらく安全面の理由から、以下の動作は未対応とされています。
  • Android Auto対応アプリ以外の端末操作(車載カーナビとUSBケーブル接続中)
  • テレビ、youtubeなどの動画再生
  • 文字入力キーボードの使用

・その他

  • Android Autoで使用するデータ通信は、Android端末上で発生する量と同等。
    外部と通信するのはあくまでAndroid端末のみ、ということになります。
  • Android Auto使用中、Android端末はUSBケーブルを通じて給電される。
    極端にバッテリーを消耗するAndroid Autoアプリがない限り、バッテリーの心配はなさそうです。
  • GPSが内蔵されている車であれば、Android端末は車側のGPS信号を使用できる。
    仕組みは不明ですが、Android端末側のGPS精度は気にしなくて良いようです。

■画面構成

・ホーム画面

Android Auto開始後、カーナビのディスプレイにはAndroid Autoのホーム画面が表示されます。ホーム画面の構成は以下のようになっています。

※Android Auto公式サイトより引用 https://support.google.com/androidauto
  1. ナビゲーション通知
  2. リマインダー
  3. 音声コマンド
    マイクアイコンをタッチすることで、音声入力が可能になり、以下の操作が行えます。
    ・音楽再生(曲名)
    ・地図のルート検索
    ・電話発信
    ・スケジュールの取得

・アプリ選択

ホーム画面の下部にはアプリカテゴリのアイコンがあり、選択するとAndroid端末内にインストールされているAndroid Auto対応アプリのリストが表示されます。

※Android Auto公式サイトより引用 https://support.google.com/androidauto
  1. ナビゲーション
  2. 電話
  3. ホーム画面
  4. 音楽再生
  5. 車アプリ

■Android Autoの使い方

Android Autoでは音声入力による操作が前提です。
音声入力やその他の操作で以下の機能を使用できます。

・電話

  • 発信(音声入力)
    「Call Cody White」「Call XXX-XXX-XXX」のように、「Call」の後に名前(電話帳に登録されている)や電話番号を言うだけで発信が可能です。

  • 発信(番号入力)
    ホーム画面下部の電話アイコンを押し、表示されるダイヤル画面から発信可能です。

  • 着信応答
    着信を受けると、ホーム画面上にNotificationが表示されます。それをタッチすることで、着信応答できます。

  • 不在着信応答
    不在着信情報は、ホーム画面上のNotificationとして表示されます。それをタッチすることで、不在着信に応答できます。

  • 留守電や通話履歴の参照
    ホーム画面下部の電話アイコンを押し、メニューから選択します。

・テキストメッセージの送信

  • テキスト送信
    「Text Cody White」「Text XXX-XXX-XXX」のように、「Text」の後に名前(電話帳に登録されている)や電話番号を言うだけでテキスト送信機能が起動します。
    アプリの音声ガイダンスに従ってテキスト本文を音声入力し、最終的に「send」で送信、「cancel」で取り止めます。

  • テキスト受信
    受信すると、ホーム画面上にNotificationが表示されます。それをタッチすることで、受信したテキストが音声で読み上げられます。
  • テキスト返信
    「reply」と話すことで、最後に受信したテキストに対する返信を開始します。
    アプリの音声ガイダンスに従ってテキスト本文を音声入力し、最終的に「send」で送信、「cancel」で取り止めます。

・リマインダーの設定

  • 時間ベースのリマインダー
    「Remind me to call John at 7pm.」
    「Remind me to pick up the cake this afternoon.」
    上記のように、正確またはおおよその時刻と合わせて音声入力することで、リマインダーが登録され、その時間になるとHome画面にNotificationが表示されます。
  • 場所ベースのリマインダー
    「Remind me to buy coffee beans when I get to Starbucks.」
    「Remind me to bring in the groceries when I get to my destination.」
    「Remind me to call mom when I get home.」
    上記のように、正確またはおおよその場所と合わせて音声入力することでリマインダーが登録され、その場所に到着するとHome画面にNotificationが表示されます。

・目的地ナビゲーションの取得

  • 音声によるナビ検索
    「Navigate to Union Square, San Francisco」
    「Directions to Philz Coffee.」
    「Directions to 1600 Amphitheatre Parkway, Mountain View.」
    上記のように目的地を音声入力するだけで、ナビが開始されます。

  • 手操作によるナビ検索
    ホーム画面下部のナビゲーションアイコンを押し、操作します。

  • 交通情報の取得
    交通情報に合わせた表示更新はリアルタイムに行われます。メニューの設定から交通情報表示をオフにすることも可能です。

・Google Mapからの目的地候補取得

  • 目的地候補の取得
    ホーム画面下部のナビゲーションアイコンから、人気のスポットや過去に行ったことのある目的地候補を取得できます。

  • カテゴリ検索
    ホーム画面下部のナビゲーションアイコンから、目的地のカテゴリ検索が可能です。

・音楽再生

「play music.」と言うだけで、"I'm feeling lucky"プレイリストがデフォルトで再生されます。
特定の曲やアーティストを指定する場合は、「play」の後に続けて音声入力します。



----------

以上が、Android Autoの使用方法になります。
音声入力によるカーナビ操作は、運転中でもかなり便利そうです。
ただし、それだけ音声入力が肝になるため、
日本語対応には時間がかかっているのかもしれません。
近い将来、日本でもAndroid Autoを使用できるのが待ち遠しいですね。

2015年3月17日火曜日




はじめに


本記事は、Googleから発表されているAndroid Autoの特徴や機能に関してまとめた記事です。
Android Autoの現在使用可能な機能、将来的に使用出来る機能およびそのアプリケーションの構成に関して、大きく分けて以下のようにまとめています。(2015/03/13時点)

  • Android Autoとは
  • Android Autoの動作環境
  • Android Appについて
  • 今後の展望について

※本記事を記載するにあたって、以下のURLを参考にしております。

Android Autoとは?


1概要


1.1 Android Auto


Android Autoとは、Android端末とカーナビ等の車載器(テレマティクス)と連動するシステムです。

ユーザーは車載機の操作のみでAndroid端末と連携でき、サービス、メールの確認、

音楽の再生、目的地までのナビゲーションなどのサービスを受けることが出来ます。


図 1.1.1.1

1.2 特徴

Android Autoに関する公式な発表では、まだ一部しか公開されていませんが、
Googleから発表されている動画や実際にハンズオンしている動画を見ると、
以下のような特徴が見て取れます。

  • Android端末とAndroid Auto搭載の車載機をUSBケーブルでつなぐことで連携を開始します。
  • Android Autoはタッチパネルによる操作のみでなく、音声入力によるハンズフリー操作、そして対話型の操作が可能です。
Android端末との連携では、以下のような機能が想定されています。
 ※現在開発方法が公開されているのは、音楽再生、通知機能のみです。
  • 音声認識
    • メールや通知に対する返信の作成
    • 別アプリの起動および操作
  • 音声再生
    • メール・リマインダーやスケジュール通知の読み上げ
  • 音楽再生
    • スマートフォン内の音楽データの再生
  • 電話機能
    • スマートフォン内の電話帳から電話
    • ダイヤル入力による電話
  • 通知機能
    • 通知を選択すると、内容の音声読み上げ
    • 通知に対しての返信
  • Google Mapによるナビゲーション

Android Autoの動作環境

1 Android Auto動作環境の構成


現在公開されているAndroid Autoアプリの開発環境は以下のようになっています。



図 2.1.1

以下の表にAndroid Auto動作環境の構成に関しての用語をまとめておきます。
Android Auto
API Simulators
車載機側プラットフォームのシュミレータアプリ。
このアプリ上で、Android Autoアプリの動作が確認できる。
現在はオーディオ系とNotification系の2種類が存在する。
Android  Auto App
Android Auto向けに拡張したAndroidアプリ。

Android Auto APPについて

1 Android Autoでできること


Android Autoアプリの開発方法については、以下の2機能が公開されています。(2015/03/13時点)

1.1 AndroidAuto音楽再生


  1. 車載機上からのスマートフォン内の音楽データの再生
   再生、停止、送り、戻るなどの車載機上からの操作をコントロールできます。
   シミュレーターアプリと連携する前に聞いていた音楽を、
   シミュレーターアプリ上でも再生することが出来ます。

  1. スマートフォン内の音楽アプリと同等のプレイリストを取得、閲覧
   バックグラウンドに選択されたアプリと同様のプレイリストを取得し、
   シミュレーターアプリでも再生する音楽リストを閲覧、選択することが出来ます。

1.2 AndroidAutoNotification




  1. 車載機器へのNotification送信
   車載機器側でNotificationを選択すると、内容を音声で読み上げてくれます。

   Notificationを車載機器側(現在はシミュレーターアプリ上)に通知できます。


  1. 車載機器からの既読通知を受信
   車載機器側でNotificationが選択される(=音声読み上げ)と、

   既読になったことをIntent通知で受け取ることができます。


  1. 車載機器からの返信を受信
   車載機器側でNotificationに対する返信操作が行われると、
   その内容をIntent通知で受け取ることができます。

※動作確認の方法やシミュレーター、アプリの作成方法に関してはこちらの記事を参考にしてください。

今後の展望について


1アプリケーションについて


1.1 Googleが想定しているアプリケーションの構成

Googleが発表している動画で、音楽再生アプリを例に以下のアプリ構成図にて解説を行なっています。
Android Auto アプリケーションの構成に関しての説明をしているもので、2章で記載していたものとは構成が異なります。
このような構成にすることによって、既存のアプリケーションを1から作り直すことなく、Android Autoに対応させることが出来るため、将来的にはほとんどのアプリがこのような構成になるものではないかと予想されます。


図 4.1.1.1


以下の表にAndroid Auto Appを構成に関しての用語をまとめておきます。

My Audio App
スマートフォン上で動く MusicPlayer アプリケーション
Android Auto App
“Auto enable car”上で車載器用に設計されたUIを表示し、操作を“My Audio App”へ中継するアプリケーション
Auto enable car
Android Auto 機能対応車載機。”Android Auto App” を表示する。

上記のように、My Android App(既存の一般的なアプリケーション)をAndroid Auto Appという中継アプリとの連携させることで、Auto enabled car(車載機)上からMy Android Appを操作することが可能になるという構成になっています。

つまり、Android Auto App自体はただのコントローラーであり、実際に処理が行われているのはスマートフォン上にあるMy Audio Appであるという仕組みです。


1.2 想定されるアプリケーションの使用例


上記のような構成から将来的には、
以下のような使用方法が出来るのではないかと予想されます。
※例として、既存の
アプリケーション(スケジュール管理や音声で別アプリを起動出来る物)がAndroid Auto Appに拡張されたとします。

 乗車前:スマートフォン内のアプリにスケジュールなどを登録しておく
 車載器とスマートフォンを接続
 乗車後 1:車載器から、スケジュールの通知がされる。
 乗車後 2:続けて車載マイクからに向けて、入力を行う。
  例) メールの作成、別アプリ起動、SNS投稿

イメージは以下の通りです。

図 4.1.2.1 
乗車前:スマートフォン内のアプリにスケジュールなどを登録しておく

図 4.1.2.2 車載器とスマートフォンを接続

図 4.1.2.3 乗車後 1:車載器から、スケジュールの通知がされる

図 4.1.2.4 乗車後 2:続けて車載マイクから、入力を行う 1
                                            
 
図 4.1.2.5 乗車後 2:続けて車載マイクから、入力を行う 2

2 懸念点


Android Autoに関して、以下のような懸念点があります。(2015/03/13時点)

  • Android Auto(車載器側)が非公開であること
Android Auto搭載ナビがまだ発売されておらず(※1)
APIおよびプラットフォームに関する情報が非公開になっています。
ナビOS上にAndroid AutoのVMまたはアプリケーションが起動されるのか、
どのようにアプリケーションが起動され、制御されるか不明な状態です。

  • Android Autoのすべての機能が公開されていないこと
現在、公式PV等などではGoogle Mapや音声認識等がデモで行われていますが、
音楽再生機能とメッセージ通知機能のみが一般的に公開されています。
Googleの狙いとしては、既存のアプリケーションやサービスを多少の変更のみでAndroid Auto Appとして拡張出来ることをコンセプトとしているようですが、その実現方法などは未だに非公開です。

  • アプリ審査・公開の問題
UIなどの観点からすべてのアプリが公開されるのは難しいと予想されます。
Android Auto Appは安全審査を行うとありますが、
運転中に使用しても問題ないUIの設計を遵守されているか、
運転を阻害する機能が備わっていないか等の、
アプリケーション機能のすべてを網羅出来るか。
又、Googleの審査を通ったとしても、
日本の基準に公開されたアプリケーションが適しているか等の問題点もあります。(※2)
命に関わる問題なので、とても容易ではない事が予想出来ます。


※1: パイオニア株式会社の連結子会社であるPioneer Electronics (USA) Inc.から3月に北米、西欧で発売予定(日本国内での販売は今のところ無し)
※2:Android Auto公式ページでも、「運転中に便利な機能」には「音楽(日本国内対応未定)」と記載されています。

免責事項

本資料に掲載された情報は、より多くの方々にAndroid Autoを知っていただき、技術に触れ、役立てて頂くことを目的としたものです。
本資料に掲載された情報の利用にあたっては各自の判断に基づき行うものとし、それによって生じた一切の損害について弊社および情報提供者は一切の責任を負いません。



[コラム] Android Autoの機能と今後について




はじめに


本記事は、Googleから発表されているAndroid Autoの特徴や機能に関してまとめた記事です。
Android Autoの現在使用可能な機能、将来的に使用出来る機能およびそのアプリケーションの構成に関して、大きく分けて以下のようにまとめています。(2015/03/13時点)

  • Android Autoとは
  • Android Autoの動作環境
  • Android Appについて
  • 今後の展望について

※本記事を記載するにあたって、以下のURLを参考にしております。

Android Autoとは?


1概要


1.1 Android Auto


Android Autoとは、Android端末とカーナビ等の車載器(テレマティクス)と連動するシステムです。

ユーザーは車載機の操作のみでAndroid端末と連携でき、サービス、メールの確認、

音楽の再生、目的地までのナビゲーションなどのサービスを受けることが出来ます。


図 1.1.1.1

1.2 特徴

Android Autoに関する公式な発表では、まだ一部しか公開されていませんが、
Googleから発表されている動画や実際にハンズオンしている動画を見ると、
以下のような特徴が見て取れます。

  • Android端末とAndroid Auto搭載の車載機をUSBケーブルでつなぐことで連携を開始します。
  • Android Autoはタッチパネルによる操作のみでなく、音声入力によるハンズフリー操作、そして対話型の操作が可能です。
Android端末との連携では、以下のような機能が想定されています。
 ※現在開発方法が公開されているのは、音楽再生、通知機能のみです。
  • 音声認識
    • メールや通知に対する返信の作成
    • 別アプリの起動および操作
  • 音声再生
    • メール・リマインダーやスケジュール通知の読み上げ
  • 音楽再生
    • スマートフォン内の音楽データの再生
  • 電話機能
    • スマートフォン内の電話帳から電話
    • ダイヤル入力による電話
  • 通知機能
    • 通知を選択すると、内容の音声読み上げ
    • 通知に対しての返信
  • Google Mapによるナビゲーション

Android Autoの動作環境

1 Android Auto動作環境の構成


現在公開されているAndroid Autoアプリの開発環境は以下のようになっています。



図 2.1.1

以下の表にAndroid Auto動作環境の構成に関しての用語をまとめておきます。
Android Auto
API Simulators
車載機側プラットフォームのシュミレータアプリ。
このアプリ上で、Android Autoアプリの動作が確認できる。
現在はオーディオ系とNotification系の2種類が存在する。
Android  Auto App
Android Auto向けに拡張したAndroidアプリ。

Android Auto APPについて

1 Android Autoでできること


Android Autoアプリの開発方法については、以下の2機能が公開されています。(2015/03/13時点)

1.1 AndroidAuto音楽再生


  1. 車載機上からのスマートフォン内の音楽データの再生
   再生、停止、送り、戻るなどの車載機上からの操作をコントロールできます。
   シミュレーターアプリと連携する前に聞いていた音楽を、
   シミュレーターアプリ上でも再生することが出来ます。

  1. スマートフォン内の音楽アプリと同等のプレイリストを取得、閲覧
   バックグラウンドに選択されたアプリと同様のプレイリストを取得し、
   シミュレーターアプリでも再生する音楽リストを閲覧、選択することが出来ます。

1.2 AndroidAutoNotification




  1. 車載機器へのNotification送信
   車載機器側でNotificationを選択すると、内容を音声で読み上げてくれます。

   Notificationを車載機器側(現在はシミュレーターアプリ上)に通知できます。


  1. 車載機器からの既読通知を受信
   車載機器側でNotificationが選択される(=音声読み上げ)と、

   既読になったことをIntent通知で受け取ることができます。


  1. 車載機器からの返信を受信
   車載機器側でNotificationに対する返信操作が行われると、
   その内容をIntent通知で受け取ることができます。

※動作確認の方法やシミュレーター、アプリの作成方法に関してはこちらの記事を参考にしてください。

今後の展望について


1アプリケーションについて


1.1 Googleが想定しているアプリケーションの構成

Googleが発表している動画で、音楽再生アプリを例に以下のアプリ構成図にて解説を行なっています。
Android Auto アプリケーションの構成に関しての説明をしているもので、2章で記載していたものとは構成が異なります。
このような構成にすることによって、既存のアプリケーションを1から作り直すことなく、Android Autoに対応させることが出来るため、将来的にはほとんどのアプリがこのような構成になるものではないかと予想されます。


図 4.1.1.1


以下の表にAndroid Auto Appを構成に関しての用語をまとめておきます。

My Audio App
スマートフォン上で動く MusicPlayer アプリケーション
Android Auto App
“Auto enable car”上で車載器用に設計されたUIを表示し、操作を“My Audio App”へ中継するアプリケーション
Auto enable car
Android Auto 機能対応車載機。”Android Auto App” を表示する。

上記のように、My Android App(既存の一般的なアプリケーション)をAndroid Auto Appという中継アプリとの連携させることで、Auto enabled car(車載機)上からMy Android Appを操作することが可能になるという構成になっています。

つまり、Android Auto App自体はただのコントローラーであり、実際に処理が行われているのはスマートフォン上にあるMy Audio Appであるという仕組みです。


1.2 想定されるアプリケーションの使用例


上記のような構成から将来的には、
以下のような使用方法が出来るのではないかと予想されます。
※例として、既存の
アプリケーション(スケジュール管理や音声で別アプリを起動出来る物)がAndroid Auto Appに拡張されたとします。

 乗車前:スマートフォン内のアプリにスケジュールなどを登録しておく
 車載器とスマートフォンを接続
 乗車後 1:車載器から、スケジュールの通知がされる。
 乗車後 2:続けて車載マイクからに向けて、入力を行う。
  例) メールの作成、別アプリ起動、SNS投稿

イメージは以下の通りです。

図 4.1.2.1 
乗車前:スマートフォン内のアプリにスケジュールなどを登録しておく

図 4.1.2.2 車載器とスマートフォンを接続

図 4.1.2.3 乗車後 1:車載器から、スケジュールの通知がされる

図 4.1.2.4 乗車後 2:続けて車載マイクから、入力を行う 1
                                            
 
図 4.1.2.5 乗車後 2:続けて車載マイクから、入力を行う 2

2 懸念点


Android Autoに関して、以下のような懸念点があります。(2015/03/13時点)

  • Android Auto(車載器側)が非公開であること
Android Auto搭載ナビがまだ発売されておらず(※1)
APIおよびプラットフォームに関する情報が非公開になっています。
ナビOS上にAndroid AutoのVMまたはアプリケーションが起動されるのか、
どのようにアプリケーションが起動され、制御されるか不明な状態です。

  • Android Autoのすべての機能が公開されていないこと
現在、公式PV等などではGoogle Mapや音声認識等がデモで行われていますが、
音楽再生機能とメッセージ通知機能のみが一般的に公開されています。
Googleの狙いとしては、既存のアプリケーションやサービスを多少の変更のみでAndroid Auto Appとして拡張出来ることをコンセプトとしているようですが、その実現方法などは未だに非公開です。

  • アプリ審査・公開の問題
UIなどの観点からすべてのアプリが公開されるのは難しいと予想されます。
Android Auto Appは安全審査を行うとありますが、
運転中に使用しても問題ないUIの設計を遵守されているか、
運転を阻害する機能が備わっていないか等の、
アプリケーション機能のすべてを網羅出来るか。
又、Googleの審査を通ったとしても、
日本の基準に公開されたアプリケーションが適しているか等の問題点もあります。(※2)
命に関わる問題なので、とても容易ではない事が予想出来ます。


※1: パイオニア株式会社の連結子会社であるPioneer Electronics (USA) Inc.から3月に北米、西欧で発売予定(日本国内での販売は今のところ無し)
※2:Android Auto公式ページでも、「運転中に便利な機能」には「音楽(日本国内対応未定)」と記載されています。

免責事項

本資料に掲載された情報は、より多くの方々にAndroid Autoを知っていただき、技術に触れ、役立てて頂くことを目的としたものです。
本資料に掲載された情報の利用にあたっては各自の判断に基づき行うものとし、それによって生じた一切の損害について弊社および情報提供者は一切の責任を負いません。



2014年12月4日木曜日


Android Auto用の音楽再生アプリを作ってみました。まずは再生、曲送りと曲戻しのみ行う簡単なものから挑戦しました。再生操作にはMediaSessionクラスを使用します。

■通常の音楽再生アプリと違う点

Android Auto用の音楽再生アプリは車載デバイスのためのオーディオサービスを提供します。このサービスによって、車載デバイスはメディアデータの一覧を参照し、カーステレオなどから音楽を再生することができます。

■専用リソースファイルのメタデータ定義

AndoridManifestファイルにはapplicationタグ内に以下のように定義し、
<meta-data
    android:name="com.google.android.gms.car.application"
    android:resource="@xml/automotive_app_desc" />
別途、専用リソースファイル\res\xml\automotive_app_desc.xmlを用意します。

■専用リソースファイルの定義

AndroidManifestファイルで定義した専用リソースファイルautomotive_app_desc.xmlには以下のように記載します。音楽を再生するためのクラスを使用する場合は"media"を定義します。メッセージアプリを使用する場合は"notification"と定義します。
<automotiveapp/>
    <uses name="media"/>
</automotiveapp/>

■サービスの実装

AndroidManifestファイルで定義したMediaBrowserService継承サービスを実装します。onGetRoot()とonLoadChildren()の実装が必須です。

■MediaSessionクラスについて

音楽再生操作を行うため、MediaSessionクラスを使用しています。MediaSessionクラスは、一連のメディア再生処理を「セッション」とし、他のクラス(MediaControllerクラス、MediaController.TransportControlsクラスなど)と紐づいて再生操作を一括して管理することができます。 関連クラスを含め、具体的に下記のことができます。

  • 再生、一時停止や曲送りなどの再生操作
  • 再生情報の表示
  • 音量変更
  • 再生状態の変更やメディアボタンのイベントをコールバックで取得
なお、再生処理そのものはMediaPlayerクラスなどで行います。

■クラス変数とonCreate()の実装

MediaBrowserService継承サービス、AndroidAutoMediaServiceクラスを定義しました。再生操作にMediaSessionクラス、再生処理にMediaPlayerクラスを使用しています。他に再生データをリスト管理するmPlayingQueue、現在の再生インデックスを保持するmCurrentQueueIndexを定義しています。onCreate()ではMediaSessionクラスの生成およびコールバックの設定などを行っています。
public class AndroidAutoMediaService extends MediaBrowserService implements 
       OnPreparedListener, OnCompletionListener, OnErrorListener{
    private MediaSession mMediaSession;                 // MediaSessionクラス
    private MediaPlayer  mMediaPlayer;                  // MediaPlayerクラス
    private List<MediaSession.QueueItem> mPlayingQueue; // 再生キューリスト
    private int mCurrentQueueIndex;                     // 再生キューのインデックス
    private static final String MEDIA_ID_ROOT = "__ROOT__";

    @Override
    public void onCreate() {
        super.onCreate();

        // 再生リストのオブジェクトを作る
        mPlayingQueue = new ArrayList<MediaSession.QueueItem>();

        // MediaSessionを生成
        mMediaSession = new MediaSession(this, "MyMediaSession");
        setSessionToken(mMediaSession.getSessionToken());
        
        // コールバックを設定
        mMediaSession.setCallback(new MyMediaSessionCallback());

        // 再生キューの位置を初期化
        mCurrentQueueIndex = 0;
    }

■onGetRoot()とonLoadChildren()の実装

onGetRoot()とonLoadChildren()の実装をします。onGetRoot()について今回はROOTを固定で返していますが、引数のclientPackageNameおよびclientUidでクライアントを判断してnullを返すことで、特定のクライアント以外からの参照を許可しないようにすることもできます。onLoadChildren()はメディア項目に関する情報を返すメソッドで、引数のresultにデータを設定します。

MediaItemの種類としてFLAG_PLAYABLEとFLAG_BROWSABLEがあります。リスト選択によって再生を開始したい場合はFLAG_PLAYABLEを、リストの表示のみを行いたい場合はFLAG_BROWSABLEを設定してください。FLAG_PLAYABLE設定時にリスト選択をすると後述のMediaSessionクラスのコールバックメソッドonPlayFromMediaId()がコールされますので、そのタイミングで再生処理を行います。
    @Override
    public BrowserRoot onGetRoot(String clientPackageName, int clientUid,
        Bundle rootHints) {
        return new BrowserRoot(MEDIA_ID_ROOT, null);
    }

    @Override
    public void onLoadChildren(String parentId, Result <List<MediaItem>> result) {
        List<MediaBrowser.MediaItem> mediaItems = new ArrayList<MediaBrowser.MediaItem>();

        // 再生データ情報の設定
        MediaDescription.Builder mdb1 = new MediaDescription.Builder();
        
        // 再生データ1
        final Bundle mediaBundle1 = new Bundle();
        mediaBundle1.putString("Path", "mnt/sdcard/M01.mp3"); // データパス
        mediaBundle1.putInt("Index", 0);                      // 曲のインデックス
        mdb1.setMediaId("MediaID01");                         // メディアID
        mdb1.setTitle("Title01");                             // タイトル
        mdb1.setSubtitle("SubTitle01");                       // サブタイトル
        mdb1.setExtras(mediaBundle1);

        // 再生データ2
        MediaDescription.Builder mdb2 = new MediaDescription.Builder();
        final Bundle mediaBundle2 = new Bundle();
        mediaBundle2.putString("Path", "mnt/sdcard/M02.mp3"); // データパス
        mediaBundle2.putInt("Index", 1);                      // 曲のインデックス
        mdb2.setMediaId("MediaID02");                         // メディアID
        mdb2.setTitle("Title02");                             // タイトル
        mdb2.setSubtitle("SubTitle02");                       // サブタイトル
        mdb2.setExtras(mediaBundle2);
        
        mediaItems.add(new MediaBrowser.MediaItem(mdb1.build(),
                MediaBrowser.MediaItem.FLAG_PLAYABLE));        
        mediaItems.add(new MediaBrowser.MediaItem(mdb2.build(),
                MediaBrowser.MediaItem.FLAG_PLAYABLE));

        // sendResult()をコールする前にdetach()のコールが必要
        result.detach();
        result.sendResult(mediaItems);

        // 再生キューをセッションに設定
        mPlayingQueue.add(new MediaSession.QueueItem(mdb1.build(), 0));
        mPlayingQueue.add(new MediaSession.QueueItem(mdb2.build(), 1));
        mMediaSession.setQueue(mPlayingQueue);
    }

■再生処理を実装

MediaPlayerクラスによる再生処理を行うメソッドを実装します。基本的なMediaPlayerの実装手順で問題ありません。再生データのパスはMediaSession.QueueItemで管理させています。
    private void playMusic() {
        // プレイヤー生成と準備(生成済みの場合はリセット)
        if (mMediaPlayer == null) {
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setOnPreparedListener(this);
            mMediaPlayer.setOnCompletionListener(this);
            mMediaPlayer.setOnErrorListener(this);
        } else {
            mMediaPlayer.reset();
        }

        // 現在のキュー位置を元に再生データのパスを取得する
        MediaSession.QueueItem queueItem = mPlayingQueue.get(mCurrentQueueIndex);
        String path = queueItem.getDescription().getExtras().getString("Path");

        // MediaPlayerのデータ設定と準備(非同期)
        try {
            mMediaPlayer.setDataSource(path);
            mMediaPlayer.prepareAsync();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        // 再生準備完了通知を受け、再生を行う
        if(mMediaPlayer != null) {
            mMediaPlayer.start();
        }
    }

■MediaSessionクラスのコールバック

MediaSessionのコールバックを下記のように実装します。リストを選択するとonPlayFromMediaId()、曲送りを選択するとonSkipToNext()、曲戻しを選択するとonSkipToPrevious()がコールされます。



    private final class MyMediaSessionCallback extends MediaSession.Callback {
        @Override
        public void onPlay() {
            playMusic();
        }

        // リスト選択時にコールされる
        @Override
        public void onPlayFromMediaId(String mediaId, Bundle extras) {
            // MediaIDを元に曲のインデックス番号を検索し、設定する。
            for(int i = 0; i < mPlayingQueue.size(); i++) {
                MediaSession.QueueItem queueItem = mPlayingQueue.get(i);
                MediaDescription md = queueItem.getDescription();
                if(mediaId.equals(md.getMediaId())) {
                    mCurrentQueueIndex = md.getExtras().getInt("Index");
                }
            }
            playMusic();
        }

        @Override
        public void onSkipToNext() {
            // 再生キューの位置を次へ
            mCurrentQueueIndex++;
            if (mCurrentQueueIndex >= mPlayingQueue.size()) {
                mCurrentQueueIndex = 0;
            }
            playMusic();
        }

        @Override
        public void onSkipToPrevious() {
            // 再生キューの位置を前へ
            mCurrentQueueIndex--;
            if (mCurrentQueueIndex < 0) {
                mCurrentQueueIndex = 0;
            }
            playMusic();
        }

■onDestroy()の実装

終了処理を実装します。
    @Override
    public void onDestroy() {
        super.onDestroy();
        // MediaSessionの終了処理
        mMediaSession.setCallback(null);
        mMediaSession.release();
        
        // MediaPlayerの終了処理
        if(mMediaPlayer != null) {
            mMediaPlayer.setOnPreparedListener(null);
            mMediaPlayer.setOnCompletionListener(null);
            mMediaPlayer.setOnErrorListener(null);
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }
今回は割愛しましたが、MediaSessionクラスを正確に動作させるためには、setPlaybackState()にて再生状態や停止状態などを操作に合わせて設定する必要があります。

MediaSessioinおよびその関連クラスについては下記を参照してください。
http://developer.android.com/reference/android/media/session/package-summary.html

Android Auto用音楽再生アプリの作り方


Android Auto用の音楽再生アプリを作ってみました。まずは再生、曲送りと曲戻しのみ行う簡単なものから挑戦しました。再生操作にはMediaSessionクラスを使用します。

■通常の音楽再生アプリと違う点

Android Auto用の音楽再生アプリは車載デバイスのためのオーディオサービスを提供します。このサービスによって、車載デバイスはメディアデータの一覧を参照し、カーステレオなどから音楽を再生することができます。

■専用リソースファイルのメタデータ定義

AndoridManifestファイルにはapplicationタグ内に以下のように定義し、
<meta-data
    android:name="com.google.android.gms.car.application"
    android:resource="@xml/automotive_app_desc" />
別途、専用リソースファイル\res\xml\automotive_app_desc.xmlを用意します。

■専用リソースファイルの定義

AndroidManifestファイルで定義した専用リソースファイルautomotive_app_desc.xmlには以下のように記載します。音楽を再生するためのクラスを使用する場合は"media"を定義します。メッセージアプリを使用する場合は"notification"と定義します。
<automotiveapp/>
    <uses name="media"/>
</automotiveapp/>

■サービスの実装

AndroidManifestファイルで定義したMediaBrowserService継承サービスを実装します。onGetRoot()とonLoadChildren()の実装が必須です。

■MediaSessionクラスについて

音楽再生操作を行うため、MediaSessionクラスを使用しています。MediaSessionクラスは、一連のメディア再生処理を「セッション」とし、他のクラス(MediaControllerクラス、MediaController.TransportControlsクラスなど)と紐づいて再生操作を一括して管理することができます。 関連クラスを含め、具体的に下記のことができます。

  • 再生、一時停止や曲送りなどの再生操作
  • 再生情報の表示
  • 音量変更
  • 再生状態の変更やメディアボタンのイベントをコールバックで取得
なお、再生処理そのものはMediaPlayerクラスなどで行います。

■クラス変数とonCreate()の実装

MediaBrowserService継承サービス、AndroidAutoMediaServiceクラスを定義しました。再生操作にMediaSessionクラス、再生処理にMediaPlayerクラスを使用しています。他に再生データをリスト管理するmPlayingQueue、現在の再生インデックスを保持するmCurrentQueueIndexを定義しています。onCreate()ではMediaSessionクラスの生成およびコールバックの設定などを行っています。
public class AndroidAutoMediaService extends MediaBrowserService implements 
       OnPreparedListener, OnCompletionListener, OnErrorListener{
    private MediaSession mMediaSession;                 // MediaSessionクラス
    private MediaPlayer  mMediaPlayer;                  // MediaPlayerクラス
    private List<MediaSession.QueueItem> mPlayingQueue; // 再生キューリスト
    private int mCurrentQueueIndex;                     // 再生キューのインデックス
    private static final String MEDIA_ID_ROOT = "__ROOT__";

    @Override
    public void onCreate() {
        super.onCreate();

        // 再生リストのオブジェクトを作る
        mPlayingQueue = new ArrayList<MediaSession.QueueItem>();

        // MediaSessionを生成
        mMediaSession = new MediaSession(this, "MyMediaSession");
        setSessionToken(mMediaSession.getSessionToken());
        
        // コールバックを設定
        mMediaSession.setCallback(new MyMediaSessionCallback());

        // 再生キューの位置を初期化
        mCurrentQueueIndex = 0;
    }

■onGetRoot()とonLoadChildren()の実装

onGetRoot()とonLoadChildren()の実装をします。onGetRoot()について今回はROOTを固定で返していますが、引数のclientPackageNameおよびclientUidでクライアントを判断してnullを返すことで、特定のクライアント以外からの参照を許可しないようにすることもできます。onLoadChildren()はメディア項目に関する情報を返すメソッドで、引数のresultにデータを設定します。

MediaItemの種類としてFLAG_PLAYABLEとFLAG_BROWSABLEがあります。リスト選択によって再生を開始したい場合はFLAG_PLAYABLEを、リストの表示のみを行いたい場合はFLAG_BROWSABLEを設定してください。FLAG_PLAYABLE設定時にリスト選択をすると後述のMediaSessionクラスのコールバックメソッドonPlayFromMediaId()がコールされますので、そのタイミングで再生処理を行います。
    @Override
    public BrowserRoot onGetRoot(String clientPackageName, int clientUid,
        Bundle rootHints) {
        return new BrowserRoot(MEDIA_ID_ROOT, null);
    }

    @Override
    public void onLoadChildren(String parentId, Result <List<MediaItem>> result) {
        List<MediaBrowser.MediaItem> mediaItems = new ArrayList<MediaBrowser.MediaItem>();

        // 再生データ情報の設定
        MediaDescription.Builder mdb1 = new MediaDescription.Builder();
        
        // 再生データ1
        final Bundle mediaBundle1 = new Bundle();
        mediaBundle1.putString("Path", "mnt/sdcard/M01.mp3"); // データパス
        mediaBundle1.putInt("Index", 0);                      // 曲のインデックス
        mdb1.setMediaId("MediaID01");                         // メディアID
        mdb1.setTitle("Title01");                             // タイトル
        mdb1.setSubtitle("SubTitle01");                       // サブタイトル
        mdb1.setExtras(mediaBundle1);

        // 再生データ2
        MediaDescription.Builder mdb2 = new MediaDescription.Builder();
        final Bundle mediaBundle2 = new Bundle();
        mediaBundle2.putString("Path", "mnt/sdcard/M02.mp3"); // データパス
        mediaBundle2.putInt("Index", 1);                      // 曲のインデックス
        mdb2.setMediaId("MediaID02");                         // メディアID
        mdb2.setTitle("Title02");                             // タイトル
        mdb2.setSubtitle("SubTitle02");                       // サブタイトル
        mdb2.setExtras(mediaBundle2);
        
        mediaItems.add(new MediaBrowser.MediaItem(mdb1.build(),
                MediaBrowser.MediaItem.FLAG_PLAYABLE));        
        mediaItems.add(new MediaBrowser.MediaItem(mdb2.build(),
                MediaBrowser.MediaItem.FLAG_PLAYABLE));

        // sendResult()をコールする前にdetach()のコールが必要
        result.detach();
        result.sendResult(mediaItems);

        // 再生キューをセッションに設定
        mPlayingQueue.add(new MediaSession.QueueItem(mdb1.build(), 0));
        mPlayingQueue.add(new MediaSession.QueueItem(mdb2.build(), 1));
        mMediaSession.setQueue(mPlayingQueue);
    }

■再生処理を実装

MediaPlayerクラスによる再生処理を行うメソッドを実装します。基本的なMediaPlayerの実装手順で問題ありません。再生データのパスはMediaSession.QueueItemで管理させています。
    private void playMusic() {
        // プレイヤー生成と準備(生成済みの場合はリセット)
        if (mMediaPlayer == null) {
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setOnPreparedListener(this);
            mMediaPlayer.setOnCompletionListener(this);
            mMediaPlayer.setOnErrorListener(this);
        } else {
            mMediaPlayer.reset();
        }

        // 現在のキュー位置を元に再生データのパスを取得する
        MediaSession.QueueItem queueItem = mPlayingQueue.get(mCurrentQueueIndex);
        String path = queueItem.getDescription().getExtras().getString("Path");

        // MediaPlayerのデータ設定と準備(非同期)
        try {
            mMediaPlayer.setDataSource(path);
            mMediaPlayer.prepareAsync();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        // 再生準備完了通知を受け、再生を行う
        if(mMediaPlayer != null) {
            mMediaPlayer.start();
        }
    }

■MediaSessionクラスのコールバック

MediaSessionのコールバックを下記のように実装します。リストを選択するとonPlayFromMediaId()、曲送りを選択するとonSkipToNext()、曲戻しを選択するとonSkipToPrevious()がコールされます。



    private final class MyMediaSessionCallback extends MediaSession.Callback {
        @Override
        public void onPlay() {
            playMusic();
        }

        // リスト選択時にコールされる
        @Override
        public void onPlayFromMediaId(String mediaId, Bundle extras) {
            // MediaIDを元に曲のインデックス番号を検索し、設定する。
            for(int i = 0; i < mPlayingQueue.size(); i++) {
                MediaSession.QueueItem queueItem = mPlayingQueue.get(i);
                MediaDescription md = queueItem.getDescription();
                if(mediaId.equals(md.getMediaId())) {
                    mCurrentQueueIndex = md.getExtras().getInt("Index");
                }
            }
            playMusic();
        }

        @Override
        public void onSkipToNext() {
            // 再生キューの位置を次へ
            mCurrentQueueIndex++;
            if (mCurrentQueueIndex >= mPlayingQueue.size()) {
                mCurrentQueueIndex = 0;
            }
            playMusic();
        }

        @Override
        public void onSkipToPrevious() {
            // 再生キューの位置を前へ
            mCurrentQueueIndex--;
            if (mCurrentQueueIndex < 0) {
                mCurrentQueueIndex = 0;
            }
            playMusic();
        }

■onDestroy()の実装

終了処理を実装します。
    @Override
    public void onDestroy() {
        super.onDestroy();
        // MediaSessionの終了処理
        mMediaSession.setCallback(null);
        mMediaSession.release();
        
        // MediaPlayerの終了処理
        if(mMediaPlayer != null) {
            mMediaPlayer.setOnPreparedListener(null);
            mMediaPlayer.setOnCompletionListener(null);
            mMediaPlayer.setOnErrorListener(null);
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }
今回は割愛しましたが、MediaSessionクラスを正確に動作させるためには、setPlaybackState()にて再生状態や停止状態などを操作に合わせて設定する必要があります。

MediaSessioinおよびその関連クラスについては下記を参照してください。
http://developer.android.com/reference/android/media/session/package-summary.html

2014年11月27日木曜日


公式サイトではAndroid Autoに対応したサンプルアプリが公開されていますが、若干凝った作りの為、分かりづらい部分があります。そこでサンプルアプリを元に、簡単なメッセージアプリを作ってみました。

※公式サイトのサンプルアプリは、以下のURLからダウンロード可能です。
http://github.com/googlesamples/android-MessagingService

Android Auto用メッセージアプリでは、以下のことができます。
  • 車載機器へのNotification送信
    Android Auto用のAPIを使用して、Notificationを車載機器側(現在はシミュレーションアプリ上)に通知できます。車載機器側でNotificationを選択すると、内容を音声で読み上げてくれます。
  • 車載機器からの既読通知を受信
    車載機器側でNotificationが選択される(=音声読み上げ)と、既読になったことをIntent通知で受け取ることができます。
  • 車載機器からの返信を受信
    車載機器側でNotificationに対する返信操作が行われると、その内容をIntent通知で受け取ることができます。

それでは実際のアプリの作り方を見ていきましょう。

■AndroidManifestファイルの記載

・BroadcastReceiverの登録

既読通知と返信通知のIntent通知を受けるために、BroadcastReceiverを登録します。
    <receiver android:name=".MyMessageReadReceiver" >
        <intent-filter>
            <action android:name="com.example.androidautonotificationtest.ACTION_MESSAGE_READ" />
        </intent-filter>
    </receiver>
    <receiver android:name=".MyMessageReplyReceiver" >
        <intent-filter>
            <action android:name="com.example.androidautonotificationtest.ACTION_MESSAGE_REPLY" />
        </intent-filter>
    </receiver>

・専用リソースファイルのメタデータ定義

AndoridManifestファイルには以下のように定義し、
    <meta-data
        android:name="com.google.android.gms.car.application"
        android:resource="@xml/automotive_app_desc" />
別途、専用リソースファイルを用意します。
(プロジェクトフォルダ)\res\xml\automotive_app_desc.xml

・専用リソースファイルの定義

AndroidManifestファイルで定義した専用リソースファイルには、以下のように記載します。
    <automotiveapp>
        <uses name="notification"/>
    </automotiveapp>

■既読通知用のIntent設定

車載機器からNotificationの既読通知を受けるために、PendingIntentを生成します。
  • AndroidManifestファイルでBroadcastReceiverのIntent-filterに登録したアクションを、Intent#setAction()で設定する。
  • Notification管理用の固有IDを、IntentのExtraに設定する。
    ※今回は固定値TEST_IDを使用しています。
    int TEST_ID = 1;
    String REPLY_ID = "conversation_id";
    String READ_ACTION =
            "com.example.androidautonotificationtest.ACTION_MESSAGE_READ";

    Intent readIntent = new Intent()
                        .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
                        .setAction(READ_ACTION)
                        .putExtra(REPLY_ID, TEST_ID);

    PendingIntent readPendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
            TEST_ID,
            readIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

■返信通知用のIntent設定

車載機器からNotificationの返信通知を受けるために、PendingIntentを生成します。
  • AndroidManifestファイルでBroadcastReceiverのIntent-filterに登録したアクションを、Intent#setAction()で設定する。
  • Notification管理用の固有IDを、IntentのExtraに設定する。
  • 返信内容のStringを受け取るためのキー(EXTRA_VOICE_REPLY)を登録する。
    String REPLY_ACTION =
            "com.example.androidautonotificationtest.ACTION_MESSAGE_REPLY";
    String EXTRA_VOICE_REPLY = "extra_voice_reply";

    Intent replyIntent = new Intent()
                    .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
                    .setAction(REPLY_ACTION)
                    .putExtra(REPLY_ID, TEST_ID);

    RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
                                    .setLabel(getApplicationContext().getString(R.string.app_name))
                                    .build();

    PendingIntent replyPendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
            TEST_ID,
            replyIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

■メッセージオブジェクトの生成

UnreadConversation.Builderオブジェクトを生成します。
  • Notification送信者の設定(TEST_NAME)
  • 既読通知用/返信通知用Intentの登録
  • Notification本文の登録(TEST_MESSAGE)
    String TEST_NAME = "BRIL TARO";
    String TEST_MESSAGE = "Hello Android Auto!";

    UnreadConversation.Builder unreadConvBuilder =
            new UnreadConversation.Builder(TEST_NAME)
                .setReadPendingIntent(readPendingIntent)
                .setReplyAction(replyPendingIntent, remoteInput);

    unreadConvBuilder.addMessage(TEST_MESSAGE);

■Notificationオブジェクトの生成と送信

NotificationCompat.Builderクラスを使用して、Notificationオブジェクトを生成、送信します。
    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(getApplicationContext())
                .setSmallIcon(R.drawable.ic_launcher)
                .extend(new CarExtender()
                            .setUnreadConversation(unreadConvBuilder.build()));

    NotificationManagerCompat mNotificationManager = NotificationManagerCompat.from(getApplicationContext());
    mNotificationManager.notify(TEST_ID, notificationBuilder.build());

■既読通知用のBroadcastReceiver

既読通知用のBroadcastReceiverでは、Notification送信時に設定した管理用の固有IDを取得できます。
public class MyMessageReadReceiver  extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        int conversationId = intent.getIntExtra(MainActivity.REPLY_ID, -1);
    }
}

■返信通知用のBroadcastReceiver

返信通知用のBroadcastReceiverでは、Notification送信時に設定した管理用の固有IDと、車載機器側が設定した返信内容を取得できます。
public class MyMessageReplyReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        int conversationId = intent.getIntExtra(MainActivity.REPLY_ID, -1);

        CharSequence reply;
        Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
        if (remoteInput != null) {
            reply = remoteInput.getCharSequence(MainActivity.EXTRA_VOICE_REPLY);
        }
    }
}

■Notificationの確認方法

上記処理を全て実装したアプリを作成して、以下の手順を行ってください。
  1. メッセージアプリ用のシミュレーションアプリ(messaging-simulator.apk )をインストール。
    ※詳細は前回記事「Android AutoのAPIが公開されました」をご参照ください。
  2. テストアプリを起動し、Notificationを送信
    ※その後、ステータスバーに表示されるNotificationは開かないでください。
  3. シミュレーションアプリを起動
成功すると、以下の画面が表示されます。
メッセージ部分をタップすると、
「New message from BRIL TARO,Hello Android Auto」
と音声で読み上げてくれます。




読み終わった後に既読通知のIntentがBroadcast送信され、以下の画面に遷移します。
ここで返信ボタンを押すと、返信通知用のIntentがBroadcast送信されます。
現在のシミュレーションアプリ上では返信内容を作成できず、アプリ側には"This is a reply"の固定文言のみが返ってきますが、将来的には音声入力などにも対応すると思われます。



実際に作ってみると、意外と簡単にNotificationを表示することができました。
現状ではまだ未完成の部分もありますが、これからどうUpdateされていくのか楽しみですね。

Android Auto用メッセージアプリの作り方


公式サイトではAndroid Autoに対応したサンプルアプリが公開されていますが、若干凝った作りの為、分かりづらい部分があります。そこでサンプルアプリを元に、簡単なメッセージアプリを作ってみました。

※公式サイトのサンプルアプリは、以下のURLからダウンロード可能です。
http://github.com/googlesamples/android-MessagingService

Android Auto用メッセージアプリでは、以下のことができます。
  • 車載機器へのNotification送信
    Android Auto用のAPIを使用して、Notificationを車載機器側(現在はシミュレーションアプリ上)に通知できます。車載機器側でNotificationを選択すると、内容を音声で読み上げてくれます。
  • 車載機器からの既読通知を受信
    車載機器側でNotificationが選択される(=音声読み上げ)と、既読になったことをIntent通知で受け取ることができます。
  • 車載機器からの返信を受信
    車載機器側でNotificationに対する返信操作が行われると、その内容をIntent通知で受け取ることができます。

それでは実際のアプリの作り方を見ていきましょう。

■AndroidManifestファイルの記載

・BroadcastReceiverの登録

既読通知と返信通知のIntent通知を受けるために、BroadcastReceiverを登録します。
    <receiver android:name=".MyMessageReadReceiver" >
        <intent-filter>
            <action android:name="com.example.androidautonotificationtest.ACTION_MESSAGE_READ" />
        </intent-filter>
    </receiver>
    <receiver android:name=".MyMessageReplyReceiver" >
        <intent-filter>
            <action android:name="com.example.androidautonotificationtest.ACTION_MESSAGE_REPLY" />
        </intent-filter>
    </receiver>

・専用リソースファイルのメタデータ定義

AndoridManifestファイルには以下のように定義し、
    <meta-data
        android:name="com.google.android.gms.car.application"
        android:resource="@xml/automotive_app_desc" />
別途、専用リソースファイルを用意します。
(プロジェクトフォルダ)\res\xml\automotive_app_desc.xml

・専用リソースファイルの定義

AndroidManifestファイルで定義した専用リソースファイルには、以下のように記載します。
    <automotiveapp>
        <uses name="notification"/>
    </automotiveapp>

■既読通知用のIntent設定

車載機器からNotificationの既読通知を受けるために、PendingIntentを生成します。
  • AndroidManifestファイルでBroadcastReceiverのIntent-filterに登録したアクションを、Intent#setAction()で設定する。
  • Notification管理用の固有IDを、IntentのExtraに設定する。
    ※今回は固定値TEST_IDを使用しています。
    int TEST_ID = 1;
    String REPLY_ID = "conversation_id";
    String READ_ACTION =
            "com.example.androidautonotificationtest.ACTION_MESSAGE_READ";

    Intent readIntent = new Intent()
                        .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
                        .setAction(READ_ACTION)
                        .putExtra(REPLY_ID, TEST_ID);

    PendingIntent readPendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
            TEST_ID,
            readIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

■返信通知用のIntent設定

車載機器からNotificationの返信通知を受けるために、PendingIntentを生成します。
  • AndroidManifestファイルでBroadcastReceiverのIntent-filterに登録したアクションを、Intent#setAction()で設定する。
  • Notification管理用の固有IDを、IntentのExtraに設定する。
  • 返信内容のStringを受け取るためのキー(EXTRA_VOICE_REPLY)を登録する。
    String REPLY_ACTION =
            "com.example.androidautonotificationtest.ACTION_MESSAGE_REPLY";
    String EXTRA_VOICE_REPLY = "extra_voice_reply";

    Intent replyIntent = new Intent()
                    .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
                    .setAction(REPLY_ACTION)
                    .putExtra(REPLY_ID, TEST_ID);

    RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
                                    .setLabel(getApplicationContext().getString(R.string.app_name))
                                    .build();

    PendingIntent replyPendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
            TEST_ID,
            replyIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

■メッセージオブジェクトの生成

UnreadConversation.Builderオブジェクトを生成します。
  • Notification送信者の設定(TEST_NAME)
  • 既読通知用/返信通知用Intentの登録
  • Notification本文の登録(TEST_MESSAGE)
    String TEST_NAME = "BRIL TARO";
    String TEST_MESSAGE = "Hello Android Auto!";

    UnreadConversation.Builder unreadConvBuilder =
            new UnreadConversation.Builder(TEST_NAME)
                .setReadPendingIntent(readPendingIntent)
                .setReplyAction(replyPendingIntent, remoteInput);

    unreadConvBuilder.addMessage(TEST_MESSAGE);

■Notificationオブジェクトの生成と送信

NotificationCompat.Builderクラスを使用して、Notificationオブジェクトを生成、送信します。
    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(getApplicationContext())
                .setSmallIcon(R.drawable.ic_launcher)
                .extend(new CarExtender()
                            .setUnreadConversation(unreadConvBuilder.build()));

    NotificationManagerCompat mNotificationManager = NotificationManagerCompat.from(getApplicationContext());
    mNotificationManager.notify(TEST_ID, notificationBuilder.build());

■既読通知用のBroadcastReceiver

既読通知用のBroadcastReceiverでは、Notification送信時に設定した管理用の固有IDを取得できます。
public class MyMessageReadReceiver  extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        int conversationId = intent.getIntExtra(MainActivity.REPLY_ID, -1);
    }
}

■返信通知用のBroadcastReceiver

返信通知用のBroadcastReceiverでは、Notification送信時に設定した管理用の固有IDと、車載機器側が設定した返信内容を取得できます。
public class MyMessageReplyReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        int conversationId = intent.getIntExtra(MainActivity.REPLY_ID, -1);

        CharSequence reply;
        Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
        if (remoteInput != null) {
            reply = remoteInput.getCharSequence(MainActivity.EXTRA_VOICE_REPLY);
        }
    }
}

■Notificationの確認方法

上記処理を全て実装したアプリを作成して、以下の手順を行ってください。
  1. メッセージアプリ用のシミュレーションアプリ(messaging-simulator.apk )をインストール。
    ※詳細は前回記事「Android AutoのAPIが公開されました」をご参照ください。
  2. テストアプリを起動し、Notificationを送信
    ※その後、ステータスバーに表示されるNotificationは開かないでください。
  3. シミュレーションアプリを起動
成功すると、以下の画面が表示されます。
メッセージ部分をタップすると、
「New message from BRIL TARO,Hello Android Auto」
と音声で読み上げてくれます。




読み終わった後に既読通知のIntentがBroadcast送信され、以下の画面に遷移します。
ここで返信ボタンを押すと、返信通知用のIntentがBroadcast送信されます。
現在のシミュレーションアプリ上では返信内容を作成できず、アプリ側には"This is a reply"の固定文言のみが返ってきますが、将来的には音声入力などにも対応すると思われます。



実際に作ってみると、意外と簡単にNotificationを表示することができました。
現状ではまだ未完成の部分もありますが、これからどうUpdateされていくのか楽しみですね。

2014年11月19日水曜日

※Android Auto公式サイトより引用 http://www.android.com/auto/

本日、ついにAndroid AutoのAPIが公開されました。
Android Autoとは、車のカーナビのような車載デバイスとAndroid端末を連動するシステムです。Android Autoアプリを作るための環境構築方法についてまとめました。

Android Autoに対応したアプリをAndroid端末に入れて、車載デバイスと接続することで、車載デバイス側でアプリの画面を表示したり、操作することができます。

APIは以下の公式サイトで説明されています。
http://developer.android.com/training/auto/start/index.html

現状では、以下の2種類のアプリに対応しています。
オーディオ系アプリ・・・車の中でオーディオコンテンツを再生することができます。
メッセージ系アプリ・・・メールを受信するとメッセージを音声出力し、音声入力から返信メールを送信できます。

今回は、AndroidAuto向けのオーディオ系アプリを作成するまでの環境構築について、以下の流れで紹介します。

・AndroidManifestファイルの記載
・専用リソースファイルの記載
・サービスの実装
・シミュレーションアプリのインストール
・アプリの実行

AndroidManifestファイルの記載

ポイントは3つあります。

targetSdkVersion

AndroidAutoに対応するアプリは、targetSdkVersionが21以上でなければいけません。

MediaBrowserService継承サービス定義 

以下のように定義します。
    <service android:exported="true" android:name=".AndroidAutoMediaService">
        <intent-filter>
            <action android:name="android.media.browse.MediaBrowserService">
            </action>
        </intent-filter>
    </service>

専用リソースファイルのメタデータ定義

以下のように定義します。
    <meta-data
        android:name="com.google.android.gms.car.application"
        android:resource="@xml/automotive_app_desc" />

上記のように、『android:resource="@xml/automotive_app_desc"』とした場合は、以下の専用リソースファイルを用意する必要があります。
(プロジェクトフォルダ)\res\xml\automotive_app_desc.xml

 専用リソースファイルの定義

AndroidManifestファイルで定義した専用リソースファイルには、以下のように記載します。"uses name="には、オーディオ系アプリの場合は"media"、メッセージ系アプリの場合は"notification"を設定します。
今回の場合は前者です。
    <automotiveapp>
        <uses name="media"/>
    </automotiveapp>

サービスの実装

AndroidManifestファイルで定義したMediaBrowserService継承サービスを実際に実装します。
以下の2つのメソッドが実装必須ですが、今回は空のメソッドにしておきます。
public class AndroidAutoMediaService extends MediaBrowserService{

@Override
public BrowserRoot onGetRoot(String clientPackageName, int clientUid,
    Bundle rootHints) {
    return null;
}

@Override
public void onLoadChildren(String parentId, Result <List<MediaItem>> result) {
}

シミュレーションアプリのインストール

AndroidAuto向けアプリの動作をAndroid端末上で確認できる、シミュレーションアプリが提供されています。
アプリはSDK Managerの「Android Auto API Simulators」からダウンロードできます。


ダウンロードが完了すると、以下のapkファイル2個が格納されます。
オーディオ系アプリ向けとメッセージ系アプリ向けに、2種類のシミュレーションアプリが用意されています。
(Android SDKフォルダ以下)\extras\google\simulators
media-browser-simulator.apk・・・オーディオ系アプリ
messaging-simulator.apk ・・・メッセージ系アプリ

今回はオーディオ系アプリを取り扱うので、media-browser-simulator.apkの方をインストールします。

それぞれのapkを起動すると、以下の画面が表示されます。

オーディオ系のシミュレーションアプリ


メッセージ系のシミュレーションアプリ



※11/25修正
なお、これらのシミュレーションアプリのサンプルコードは、以下のURLからダウンロード可能です。
http://github.com/googlesamples/android-MediaBrowserService
http://github.com/googlesamples/android-MessagingService

アプリの実行

作成したアプリをあらかじめインストールしておき、
シミュレーションアプリの「Media Sim」を起動します。
メニューボタンを押すと、作成したアプリの名前が表示されれば成功です。



今回作成したアプリでは必要最低限の実装しか行っていないため、これ以上は動作できませんが、ちゃんと実装したアプリであれば、ここから動作が確認できるはずです。

次回からは、実際に動作するAndroid Autoアプリの開発方法について、説明していきます。

Android AutoのAPIが公開されました

※Android Auto公式サイトより引用 http://www.android.com/auto/

本日、ついにAndroid AutoのAPIが公開されました。
Android Autoとは、車のカーナビのような車載デバイスとAndroid端末を連動するシステムです。Android Autoアプリを作るための環境構築方法についてまとめました。

Android Autoに対応したアプリをAndroid端末に入れて、車載デバイスと接続することで、車載デバイス側でアプリの画面を表示したり、操作することができます。

APIは以下の公式サイトで説明されています。
http://developer.android.com/training/auto/start/index.html

現状では、以下の2種類のアプリに対応しています。
オーディオ系アプリ・・・車の中でオーディオコンテンツを再生することができます。
メッセージ系アプリ・・・メールを受信するとメッセージを音声出力し、音声入力から返信メールを送信できます。

今回は、AndroidAuto向けのオーディオ系アプリを作成するまでの環境構築について、以下の流れで紹介します。

・AndroidManifestファイルの記載
・専用リソースファイルの記載
・サービスの実装
・シミュレーションアプリのインストール
・アプリの実行

AndroidManifestファイルの記載

ポイントは3つあります。

targetSdkVersion

AndroidAutoに対応するアプリは、targetSdkVersionが21以上でなければいけません。

MediaBrowserService継承サービス定義 

以下のように定義します。
    <service android:exported="true" android:name=".AndroidAutoMediaService">
        <intent-filter>
            <action android:name="android.media.browse.MediaBrowserService">
            </action>
        </intent-filter>
    </service>

専用リソースファイルのメタデータ定義

以下のように定義します。
    <meta-data
        android:name="com.google.android.gms.car.application"
        android:resource="@xml/automotive_app_desc" />

上記のように、『android:resource="@xml/automotive_app_desc"』とした場合は、以下の専用リソースファイルを用意する必要があります。
(プロジェクトフォルダ)\res\xml\automotive_app_desc.xml

 専用リソースファイルの定義

AndroidManifestファイルで定義した専用リソースファイルには、以下のように記載します。"uses name="には、オーディオ系アプリの場合は"media"、メッセージ系アプリの場合は"notification"を設定します。
今回の場合は前者です。
    <automotiveapp>
        <uses name="media"/>
    </automotiveapp>

サービスの実装

AndroidManifestファイルで定義したMediaBrowserService継承サービスを実際に実装します。
以下の2つのメソッドが実装必須ですが、今回は空のメソッドにしておきます。
public class AndroidAutoMediaService extends MediaBrowserService{

@Override
public BrowserRoot onGetRoot(String clientPackageName, int clientUid,
    Bundle rootHints) {
    return null;
}

@Override
public void onLoadChildren(String parentId, Result <List<MediaItem>> result) {
}

シミュレーションアプリのインストール

AndroidAuto向けアプリの動作をAndroid端末上で確認できる、シミュレーションアプリが提供されています。
アプリはSDK Managerの「Android Auto API Simulators」からダウンロードできます。


ダウンロードが完了すると、以下のapkファイル2個が格納されます。
オーディオ系アプリ向けとメッセージ系アプリ向けに、2種類のシミュレーションアプリが用意されています。
(Android SDKフォルダ以下)\extras\google\simulators
media-browser-simulator.apk・・・オーディオ系アプリ
messaging-simulator.apk ・・・メッセージ系アプリ

今回はオーディオ系アプリを取り扱うので、media-browser-simulator.apkの方をインストールします。

それぞれのapkを起動すると、以下の画面が表示されます。

オーディオ系のシミュレーションアプリ


メッセージ系のシミュレーションアプリ



※11/25修正
なお、これらのシミュレーションアプリのサンプルコードは、以下のURLからダウンロード可能です。
http://github.com/googlesamples/android-MediaBrowserService
http://github.com/googlesamples/android-MessagingService

アプリの実行

作成したアプリをあらかじめインストールしておき、
シミュレーションアプリの「Media Sim」を起動します。
メニューボタンを押すと、作成したアプリの名前が表示されれば成功です。



今回作成したアプリでは必要最低限の実装しか行っていないため、これ以上は動作できませんが、ちゃんと実装したアプリであれば、ここから動作が確認できるはずです。

次回からは、実際に動作するAndroid Autoアプリの開発方法について、説明していきます。
Related Posts Plugin for WordPress, Blogger...