初めての Android Auto 

# 概要

2014/11 に Android Auto API が公開されました。
Android Auto 触ってみたい！のモチベーションから、
1. Android Auto って何？
2. 環境構築
3. サンプルアプリビルド（Audio アプリと、 Messaging アプリの2つ）
4. 動作確認
までをやってみたのでまとめます。

一言でまとめると、
「Android Auto とはスマホの Android アプリを安全に車載用に最適化して表示・操作するための仕組み」
でした。

# Android Auto とは？

2014/6/E 開催 Google I/O 2014 にて発表された [Open Automotive Alliance (OAA)](http://www.openautoalliance.net/#about) が推進している「Android を車の中でも使おう」な仕組み。
※ Google I/O で、同時に TV 向けの Android TV, ウェアラブル端末向けの Android Wear も発表されていました。

Android Auto で使用する機器は、

* Android SmartPhone
* Android Auto 対応車載機

の2つです。2つが連携し、
「スマホの Android アプリを安全に車載用に最適化して表示・操作する」
を実現します。
構成は以下が一番分かりやすいです。

## 構成
![android_auto_block_diagram.png](https://qiita-image-store.s3.amazonaws.com/0/35514/df7323e5-1fd4-3f9b-3d4d-19e15c9312ee.png)
http://developer.android.com/training/auto/audio/index.html の VIDEO のリンク、[4m18s](https://www.youtube.com/watch?v=Q96Sw6v4ULg#t=4m18s) あたり。

構成図拡大
![android_auto.png](https://qiita-image-store.s3.amazonaws.com/0/35514/d926539d-da11-3507-c9ee-f9bf16a62f2a.png)


動画のお兄さんが、

```
Auto app on the phone, and how this then appears in the car.
Android Auto is actually just a client.
```

と説明してくれており、
「スマホアプリとしての MyAudioApp と、 Android Auto 実行環境としての Android Auto App、 の二つが共にスマホ上にあり、車載機上はそれらの実行結果を表示する」
という仕組みですね。

ここの概念大事＆この先の説明で使用するので表にまとめておきます。

|用語|意味|
|:---|:---|
|My Audio App|普通にスマホ上で動く MusicPlayer アプリ。音楽アプリは単なる例なので一つ抽象度を上げ、「一般的なスマホアプリ」と思ってください。|
|Android Auto App|「My Audio App(一般化なスマホアプリ)」を車載機上で表示、操作する中継アプリ。UI も車載機用に変換する。|
|MediaSession|「My Audio App(一般化なスマホアプリ)」と、「Android Auto App」 間を繋ぐ仕組み。プレイリストや音楽データを橋渡しする|
|Auto enabled car|Android Auto 機能対応車載機。Android Auto App を表示する。|


## ユーザ&アプリ開発者の利点、Android Auto が目指す世界
* これまでの SmartPhone 上の音楽アプリを、多少の変更で、車上でも車用の UI で使用できること
* Android Auto 用に膨大なテストをしなくてよい
* アプリ開発者は数ある車種毎に Android アプリケーションを作りこまなくてよい（差異は Android Auto App が吸収してくれる）
* 安全に動作するアプリケーションを作る

とのことです。

## Google さんの思惑
「膨大な SmartPhone 用のアプリケーションを、（多少の変更で）そのまま車載機でも使用できるようにしたい。これから作るアプリは車載機専用にしなくても車載機上で動くようにしたい。」
といったところでしょうか。
車載機上のアプリケーション実行環境の課題として「誰がそんなに車載機上で動くアプリを作るのか（数が増えるのか）」というものがありますが、この点については見事に解決しそうです。

## 発売予定
Android Auto 対応車は、 今後、
* [ヒュンダイ、同社として初となる 8インチタッチパネル Android Auto 搭載の自動車、2015年米国向けモデル「Sonata」発表](http://gpad.tv/develop/hyundai-sonata-android-auto/) 
* [「Android Auto」「CarPlay」両対応の市販カーナビが欧米で発売、日本は未定](http://monoist.atmarkit.co.jp/mn/articles/1501/08/news018.html)
この辺発売予定です。

## その他注意点
* 「まだ Android Auto 対応アプリケーションは公開出来ない。[Android Auto Developers Google+ community](https://plus.google.com/communities/116320632775523824083) でアップデートするから入ってね」とのこと。
* 「Google Play でアプリを公開するには品質確保してね。」とのこと。 (もしかしたら今後この記事に追記するかも)



# 環境構築

さて、前置きが長くなりました。ここから実際に動かします。

|環境|条件|コメント|
|:---|:---|:---|:--:|
|OS|Windows 7|Windows だっていいじゃない|
|Android Studio|1.0.1|Android Studio 初体験です。無駄処理、無駄手順あったらごめんなさい|
|Android |5.0.1|Android API level 21|
|Android Auto API Simulators|1||

※ Android SmartPhone は不要です。現時点では Android Auto は Emu でのみ動作します。
※ 全体的に、私の環境で動いたことのみ確認しているので、必要条件ではなく十分条件です。


## Android Studio インストール
Android Studio 自体のインストールは以下が分かりやすかったです。
[AndroidStudioのインストールをゼロからしてみる](http://www.slideshare.net/ueponx/android-38074699)

つまりやることは、

* インストール
 * jdk-7u71-windows-x64.exe
 * android-studio-bundle-135.1641136.exe
* PATH の追加 
 * C:\Program Files\WinMerge;C:\Users\<User>\AppData\Local\Android\sdk\platform-tools

です。

C:\Users\<User>\AppData\Local\Android\sdk
あたりが設定ファイルディレクトリ

SDK Manager から以下の package を入れる。

* Android 5.0.1(API level 21)
* Extras Android Auto API Simulators

![android_sdk_manager_.png](https://qiita-image-store.s3.amazonaws.com/0/35514/fe9b32a3-8407-b934-ff8e-232547779ce9.png)


# サンプルアプリをビルド

2種類の apk が必要です。

* My Audio App (一般的なスマホアプリ)
* Android Auto App (「一般化なスマホアプリ」を車載機上で表示、操作する中継アプリ)

の二つです。

Android Auto App(中継アプリ) はビルド不要です。Package で Android Auto API Simulators をインストールするのみでよく、それを Emu 環境に入れてあげればOKです。
My Audio App(一般的なスマホアプリ)  は作ります。github から持って来てビルドします。

## My Audio App(一般的なスマホアプリ) を Emu にインストール

New Project 
Application name: test

Select the form factors your app will run on
phone and Tablet にチェックを入れ、 API 21: Android 5.0 
を選択。

  ＃ TV と Wear は個別に項目立ってるのいいなー。。

Add an activity to Mobile
適当に Fullscreen Activity



## ソース

https://github.com/googlesamples/android-MediaBrowserService
android-MediaBrowserService-master
を import

大事なところ、Android Auto ならではのところを抜粋すると以下。

```automotive_app_desc.xml
<automotiveApp>
   <uses name="media" />
</automotiveApp>
```

```AndroidManifest.xml
<application>
    ...
    <service android:name=".MyMediaBrowserService"
                android:exported="true">
        <intent-filter>
            <action android:name=
                "android.media.browse.MediaBrowserService"/>
        </intent-filter>
    </service>
    ...
<application>
```

## ビルド

https://github.com/googlesamples/android-MediaBrowserService
android-MediaBrowserService-master
https://github.com/googlesamples/android-MessagingService
android-MessagingService-master
を 適当に落として、 Android Studio に import。
私は ZIP を落としました。

```
failed to find Build Tools revision 21.1.1
Install Build Tools 21.1.1 and sync project
```

と言われるので、２行目のリンクをクリックして Android SDK Build―Tools 21.1.1 をインストール。

gradlew でビルドする。
Android Studio の terminal 上から(Tools -> Open Terminal...)、

以下、 Audio アプリ、Messaging アプリ、やり方共通です。

```
>gradlew build

(略)

:Application:compileLint                 
:Application:lint                 
Ran lint on variant release: 10 issues found
Ran lint on variant debug: 10 issues found
Wrote HTML report to file:/C:/Users/<User>/AndroidStudioProjects/auto_from_google-automerger/android-MessagingService-master/Application/build/outputs/lint-results.html
Wrote XML report to C:\Users\<User>\AndroidStudioProjects\auto_from_google-automerger\android-MessagingService-master\Application\build\outputs\lint-results.xml
:Application:check                 
:Application:build                 
               
BUILD SUCCESSFUL
               
Total time: 15.738 secs
```

gradlew tasks でタスク一覧を見る

```
>gradlew tasks
:tasks                                                                                       
                      
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
                      
Android tasks         
-------------         
androidDependencies - Displays the Android dependencies of the project
signingReport - Displays the signing info for each variant

(略)

Help tasks            
----------            
components - Displays the components produced by root project 'android-MessagingService-master'. [incubating]
dependencies - Displays all dependencies declared in root project 'android-MessagingService-master'.
dependencyInsight - Displays the insight into a specific dependency in root project 'android-MessagingService-master'.
help - Displays a help message.
projects - Displays the sub-projects of root project 'android-MessagingService-master'.
properties - Displays the properties of root project 'android-MessagingService-master'.
tasks - Displays the tasks runnable from root project 'android-MessagingService-master' (some of the displayed tasks may belong to subprojects).

BUILD SUCCESSFUL
               
Total time: 7.422 secs
```


`gradlew clean build` で apk を作成。

```
C:\Users\<User>\AndroidStudioProjects\auto_from_google-automerger\android-MessagingService-master>gradlew clean build
:Application:clean                                                                           
:Application:preBuild                
:Application:compileDebugNdk                
:Application:preDebugBuild                
:Application:checkDebugManifest                
:Application:preReleaseBuild                
:Application:prepareComAndroidSupportCardviewV72102Library                 
:Application:prepareComAndroidSupportSupportV132102Library                 
:Application:prepareComAndroidSupportSupportV42102Library                 
:Application:prepareDebugDependencies                 
:Application:compileDebugAidl                 
:Application:compileDebugRenderscript                 
:Application:generateDebugBuildConfig                 
:Application:generateDebugAssets UP-TO-DATE      
:Application:mergeDebugAssets                 
:Application:generateDebugResValues UP-TO-DATE      
:Application:generateDebugResources                 
:Application:mergeDebugResources                 
C:\Users\<User>\AndroidStudioProjects\auto_from_google-automerger\android-MessagingService-master\Application\src\main\res\drawable-xxhdpi\android_contact.png: libpng warning: iCCP: Not recognizing kno
wn sRGB profile that has been edited
:Application:processDebugManifest                 
:Application:processDebugResources                 
:Application:generateDebugSources                 
:Application:compileDebugJava                 
:Application:preDexDebug                 
:Application:dexDebug                 
:Application:processDebugJavaRes UP-TO-DATE      
:Application:validateDebugSigning                 
:Application:packageDebug                 
:Application:zipalignDebug                 
:Application:assembleDebug                 
:Application:checkReleaseManifest                 
:Application:prepareReleaseDependencies                 
:Application:compileReleaseAidl                 
:Application:compileReleaseRenderscript                 
:Application:generateReleaseBuildConfig                 
:Application:generateReleaseAssets UP-TO-DATE      
:Application:mergeReleaseAssets                 
:Application:generateReleaseResValues UP-TO-DATE      
:Application:generateReleaseResources                 
:Application:mergeReleaseResources                 
C:\Users\<User>\AndroidStudioProjects\auto_from_google-automerger\android-MessagingService-master\Application\src\main\res\drawable-xxhdpi\android_contact.png: libpng warning: iCCP: Not recognizing kno
wn sRGB profile that has been edited
:Application:processReleaseManifest                 
:Application:processReleaseResources                 
:Application:generateReleaseSources                 
:Application:compileReleaseJava                 
:Application:lintVitalRelease SKIPPED         
:Application:compileReleaseNdk                 
:Application:preDexRelease                 
:Application:dexRelease                 
:Application:processReleaseJavaRes UP-TO-DATE      
:Application:packageRelease                 
:Application:assembleRelease                 
:Application:assemble                 
:Application:compileLint                 
:Application:lint                 
Ran lint on variant release: 10 issues found
Ran lint on variant debug: 10 issues found
Wrote HTML report to file:/C:/Users/<User>/AndroidStudioProjects/auto_from_google-automerger/android-MessagingService-master/Application/build/outputs/lint-results.html
Wrote XML report to C:\Users\<User>\AndroidStudioProjects\auto_from_google-automerger\android-MessagingService-master\Application\build\outputs\lint-results.xml
:Application:check                 
:Application:build                 
               
BUILD SUCCESSFUL
               
Total time: 22.32 secs
```

adb で apk を Emu にインストールする。Emu を起動させてから。

```
> adb install -r C:\Users\<User>\AndroidStudioProjects\auto_from_google-automerger\android-
MessagingService-master\Application\build\outputs\apk\Application-release-unsigned.apk
45 KB/s (401135 bytes in 8.602s)
        pkg: /data/local/tmp/Application-release-unsigned.apk
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]


C:\Users\<User>\AndroidStudioProjects\auto_from_google-automerger\android-MessagingService-master>adb install -r C:\Users\<User>\AndroidStudioProjects\auto_from_google-automerger\android-
MessagingService-master\Application\build\outputs\apk\Application-debug.apk           

        pkg: /data/local/tmp/Application-debug.apk
Success
```


Audio アプリの場合のログ。

```
C:\Users\<User>\AndroidStudioProjects\auto_from_google-automerger\android-MediaBrowserService-master>gradlew clean build
:Application:clean                                                                           
:Application:preBuild                
:Application:compileDebugNdk                
:Application:preDebugBuild                
:Application:checkDebugManifest                
:Application:preReleaseBuild                
:Application:prepareComAndroidSupportCardviewV72102Library                 
:Application:prepareComAndroidSupportSupportV132102Library                 
:Application:prepareComAndroidSupportSupportV42102Library                 
:Application:prepareDebugDependencies                 
:Application:compileDebugAidl                 
:Application:compileDebugRenderscript                 
:Application:generateDebugBuildConfig                 
:Application:generateDebugAssets UP-TO-DATE      
:Application:mergeDebugAssets                 
:Application:generateDebugResValues UP-TO-DATE      
:Application:generateDebugResources                 
:Application:mergeDebugResources                 
:Application:processDebugManifest                 
:Application:processDebugResources                 
:Application:generateDebugSources                 
:Application:compileDebugJava                 
注意:C:\Users\<User>\AndroidStudioProjects\auto_from_google-automerger\android-MediaBrowserService-master\Application\src\main\java\com\example\android\mediabrowserservice\model\MusicProvider.javaの操 
作は、未チェックまたは安全ではありません。                                                                                                                                                                             
注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。                                                                                                                                            
:Application:preDexDebug                      
:Application:dexDebug                 
:Application:processDebugJavaRes UP-TO-DATE      
:Application:validateDebugSigning                 
:Application:packageDebug                 
:Application:zipalignDebug                 
:Application:assembleDebug                 
:Application:checkReleaseManifest                 
:Application:prepareReleaseDependencies                 
:Application:compileReleaseAidl                 
:Application:compileReleaseRenderscript                 
:Application:generateReleaseBuildConfig                 
:Application:generateReleaseAssets UP-TO-DATE      
:Application:mergeReleaseAssets                 
:Application:generateReleaseResValues                 
:Application:generateReleaseResources                 
:Application:mergeReleaseResources                 
:Application:processReleaseManifest                 
:Application:processReleaseResources                 
:Application:generateReleaseSources                 
:Application:compileReleaseJava                 
注意:C:\Users\<User>\AndroidStudioProjects\auto_from_google-automerger\android-MediaBrowserService-master\Application\src\main\java\com\example\android\mediabrowserservice\model\MusicProvider.javaの操 
作は、未チェックまたは安全ではありません。                                                                                                                                                                             
注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。                                                                                                                                            
:Application:lintVitalRelease SKIPPED           
:Application:compileReleaseNdk                 
:Application:preDexRelease                 
:Application:dexRelease                 
:Application:processReleaseJavaRes UP-TO-DATE      
:Application:packageRelease                 
:Application:assembleRelease                 
:Application:assemble                 
:Application:compileLint                 
:Application:lint                 
Ran lint on variant debug: 19 issues found
Ran lint on variant release: 19 issues found
Wrote HTML report to file:/C:/Users/<User>/AndroidStudioProjects/auto_from_google-automerger/android-MediaBrowserService-master/Application/build/outputs/lint-results.html
Wrote XML report to C:\Users\<User>\AndroidStudioProjects\auto_from_google-automerger\android-MediaBrowserService-master\Application\build\outputs\lint-results.xml
:Application:check                 
:Application:build                 
               
BUILD SUCCESSFUL
               
Total time: 27.454 secs
C:\Users\<User>\AndroidStudioProjects\auto_from_google-automerger\android-MediaBrowserService-master>
```

Emu を起動させてから、 adb でインストール。

```
>adb install -r C:\Users\<User>\AndroidStudioProjects\auto_from_google-automerger\andro
id-MediaBrowserService-master\Application\build\outputs\apk\Application-debug.apk
26 KB/s (438882 bytes in 16.457s)
        pkg: /data/local/tmp/Application-debug.apk
Success

```



# 動作確認

## Audio
まずは普通に Emu を起動させる。
起動画面。
![android_emu_boot.png](https://qiita-image-store.s3.amazonaws.com/0/35514/6756b549-3036-ea8d-f528-5e49e62417c6.png)

アプリ一覧画面へ。
![media_browser_service_install.png](https://qiita-image-store.s3.amazonaws.com/0/35514/e17ec3e5-f021-8aab-178b-bd83136a8637.png)

My Audio App(一般的なスマホアプリ)である、 MediaBrowserService アプリを起動。
音楽が鳴る。選曲も可。
![media_browser_service_music.png](https://qiita-image-store.s3.amazonaws.com/0/35514/6aadfd64-e5de-4b8a-9dde-81153988d6e4.png)

アプリ一覧画面に戻り、Android Auto アプリである、MediaSim アプリを起動（本当はこのアプリは車載器上で表示されるもの）。
どの My Audio App アプリをバックエンドにするか指定する（MediaBrowserServiceSample を選ぶ）。
![media_browser_simulator_service_select.png](https://qiita-image-store.s3.amazonaws.com/0/35514/c9d3731c-0af6-3b60-4599-a82aa317de4f.png)

音楽再生！
さっき MediaBrowserService アプリで再生させていた音楽が流れる（ユーザ目線的には、スマホで聞いてた音楽を車の中でもそのまま再生出来る）。
![media_browser_simulator.png](https://qiita-image-store.s3.amazonaws.com/0/35514/54eb712d-28d7-95bd-18ca-77e452915a08.png)

その後、Android Auto アプリで曲を変え、My Audio App に戻ると、Android Auto アプリで変えた曲になっている（ユーザ目線的には、車の中で再生した曲が、車を降りてもスマホで続きを聞くことが出来る）

### 分かったこと

* UI 
 * スマホ用アプリ MediaBrowserService アプリでは、UI が細かい
 * Android Auto アプリである、MediaSim アプリは、 UI が大きくシンプル
* 連続性
 * 両者のアプリでプレイリストや再生情報を引き継げる


## Messaging

見た目の派手さがなく分かりずらいですが、以下2つのアプリが連携します。

* MessagingSample アプリ：メッセージ送信側。スマホアプリ
* MessagingSimulator アプリ：メッセージ受信側。Android Auto アプリ

アプリ一覧画面から、受信側 MessagingSimulator アプリを起動させる。
![messaging_sample_install.png](https://qiita-image-store.s3.amazonaws.com/0/35514/471b28b1-1e66-97d0-1910-a93e03950b2e.png)

何もメッセージが来てないことを確認する。
![messaging_simulator.png](https://qiita-image-store.s3.amazonaws.com/0/35514/3376129c-db75-fb92-38b0-24935a02c05c.png)

アプリ一覧画面に戻り、送信側 MessagingSample アプリを起動させる。
適当に SEND ボタンタップでメッセージを送信する。
![messaging_sample_send1.png](https://qiita-image-store.s3.amazonaws.com/0/35514/bca74f19-d587-6086-cec8-45fb09fc9970.png)

アプリ一覧画面に戻り、受信側 MessagingSimulator アプリに遷移する。
メッセージを受信していることを確認する。
通知領域（上部の白い部分）をタップすると通知が消える。
![messaging_simulator_notification.png](https://qiita-image-store.s3.amazonaws.com/0/35514/a04cfd5f-568f-ab07-01f7-cf6b3ab08fb1.png)


アプリ一覧画面に戻り、送信側 MessagingSample アプリに遷移する。
受信側アプリで開封された旨が表示されることを確認する。
![messaging_sample_read.png](https://qiita-image-store.s3.amazonaws.com/0/35514/7462bac0-c0f7-a6b1-6d7f-f225878ffb75.png)


# まとめ

Android Auto を動かしてみました。
Android Auto とは「スマホの Android アプリを安全に車載用に最適化して表示・操作する」ものでした。
現在では Emu 上での動作に留まっていますが、実物も試したいです。


# 詰まったところ

## Android アプリがエミュレータ上で実行出来ない。
* エラーメッセージ

```
C:\Users\<User>\AppData\Local\Android\sdk\tools\emulator.exe -avd Nexus_5_API_21_x86 -netspeed full -netdelay none
emulator: ERROR: x86 emulation currently requires hardware acceleration!
Please ensure Intel HAXM is properly installed and usable.
CPU acceleration status: HAX kernel module is not installed!
```

* 原因

`VT-x` が off られていたから。

* 解決方法

http://andro.hatenablog.com/entry/2014/11/19/183146
で解決。
C:\Users\<User>\AppData\Local\Android\sdk\extras\intel\Hardware_Accelerated_Execution_Manager
intelhaxm-android.exe
この辺から実行

## apk がインストール出来ない

* simulator apk どこ？

C:\Users\<User>\AppData\Local\Android\sdk\extras\google\simulators
media-browser-simulator.apk
messaging-simulator.apk
にある。

* どうやってインストールする？

適当に http server に配置したが、 Android Emu デフォルトブラウザはネットに繋がらず。

adb で実施。さくっと入った。

```
C:\Users\<User>\AppData\Local\Android\sdk\platform-tools>adb insta
ll -r C:\Users\<User>\AppData\Local\Android\sdk\extras\google\simu
lators\media-browser-simulator.apk
26 KB/s (1308922 bytes in 49.075s)
        pkg: /data/local/tmp/media-browser-simulator.apk
Success

C:\Users\<User>\AppData\Local\Android\sdk\platform-tools>adb insta
ll -r C:\Users\<User>\AppData\Local\Android\sdk\extras\google\simu
lators\messaging-simulator.apk
12 KB/s (1574331 bytes in 119.702s)
        pkg: /data/local/tmp/messaging-simulator.apk
Success
```

# 参考
Getting Started with Auto
https://developer.android.com/training/auto/index.html
ここが一番の情報源

Audio サンプルアプリ
https://github.com/googlesamples/android-MessagingService

Messaging サンプルアプリ
https://github.com/googlesamples/android-MediaBrowserService