Android ThingsでGoogle Assistantのサンプルを動かすまで

# はじめに
この記事は[Android Things](https://developer.android.com/things/index.html)をRaspberryPi3 ModelBで動かしてみたときの覚書です。
Android Studio2.2以上とADBコマンドが利用できる環境で実行しています。

## 必要なもの
- Raspberry Pi 3 Model B
- RaspberryPiの電源
- MicroSD Card (8GB以上のもの)
- MicroSDカードリーダー
- HDMIディスプレイ
- LANケーブル
- WiFiルータ
- USBマイク（[こちら](https://www.adafruit.com/product/3367)が公式サポートのマイクです。Amazonでも買えます）
- スピーカー（USBでもステレオミニプラグでもOKです。公式は[こちら](https://www.adafruit.com/product/3369)）
- ブレッドボード
- 抵抗２個
- スイッチ１個
- LED１個
- ジャンパワイヤ必要分

## イメージの書き込み
[公式ページ](https://developer.android.com/things/hardware/raspberrypi.html)から最新のイメージをダウンロードして展開します。
4GBくらいあるので展開には少々時間がかかります。
MicroSDカードをカードリーダー等を使ってPCに接続します。ノートPCなどに付いているスロットでは認識しないこともあるそうです。その場合はカードリーダーを購入してください。
[こちら](https://www.raspberrypi.org/documentation/installation/installing-images/windows.md)の手順に従い、Win32DiskImagerをインストールしてイメージを書き込みます。

## スイッチとLEDの設定
[sample-button](https://github.com/androidthings/sample-button)のREADMEにある画像を見ながら回路を組み立ててください。
ただし、このままだとAssistantのサンプルが動かないのでLEDのワイヤ（画像中の青色の線）をBCM25（右上から11番目）に変更、スイッチのワイヤ（画像中の緑色の線）をBCM23（右上から8番目）に変更してください。

## 接続
RaspberryPiにSDカード、HDMIケーブル、LANケーブル、USBマイク、スピーカーを取り付けておきます。スイッチとLEDの回路を再度確認し、電源を入れてください。
AndroidThingsの起動画面が出たら成功です。
画面にIPアドレスが表示されていますので同じネットワーク上のPCから接続してみましょう。
コマンドプロンプトを起動し、以下のコードを入力してください。
`> adb connect [IPアドレス]`
Successなどの表示が出ると接続が完了したことになります。

### RaspberryPiのWiFi設定
ここでWiFiの設定もしておきます。せっかくのIoTデバイスなので、どうせなら無線で繋ぎたいですよね。
コマンドプロンプトでadb connectが成功している状態で、
`> adb shell am startservice -n com.google.wifisetup/.WifiSetupService -a WifiSetupService.Connect -e ssid <Network_SSID> -e passphrase <Network_Passcode>`

接続の確認は、以下のコマンドで行います。
`> adb shell logcat -d | grep Wifi`
色々出てきますが、以下のような結果が表示されていれば成功です。
`V WifiWatcher: Network state changed to CONNECTED
V WifiWatcher: SSID changed: ...
I WifiConfigurator: Successfully connected to ...`

## Google Assistantサンプルのクローン
Githubから以下のリポジトリをクローンしてきます。
[https://github.com/androidthings/sample-googleassistant](https://github.com/androidthings/sample-googleassistant)
次はReadMeに従ってGoogleConsoleの設定をしていきます。

## GoogleAPI Console Projectの作成
https://developers.google.com/assistant/sdk/prototype/getting-started-other-platforms/config-dev-project-and-account
このページに従ってGoogleAPIの設定をしていきます。

1. [こちら](https://console.developers.google.com/)から新しくプロジェクトを作成します。プロジェクト名を入力してOKを押します。
2. APIライブラリに移動してAssistantで検索します。Google Assistant APIを有効にします。
3. 認証情報に移動して認証情報を作成します。OAuth Client IDを作成します。Oauth同意画面にはユーザーに表示するサービス名のみ入力してください。アプリケーションの種類はその他にして名前を入力して保存をします。
4. ダイアログボックスが表示されますが閉じてください。
5. OAuth 2.0 クライアント ID一覧の右側にダウンロードボタン（↓）をクリックします。`client_secret_<client-id>.json`というファイル名のまま、Google Assistantをクローンしたディレクトリに保存します。

### アクティビティ管理の設定
Assistantを利用するため、以下からアクティビティの許可をします
https://myaccount.google.com/activitycontrols
以下の項目をONにします

- ウェブとアプリのアクティビティ
- ロケーション履歴
- 端末情報
- 音声アクティビティ

### google-auth-oauthlibをインストール
https://github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib
pip(pythonのパッケージ管理システム)を利用してgoogle-auth-oauthlibをインストールします。（もしPythonをインストールしていない場合はここでインストールしてください。2系でも3系でもOKです）
コマンドプロンプトを起動して以下のコマンドを入力します
`> pip install google-auth-oauthlib`

### Android Studioの起動
Android Studioを起動してGoogle Assistantをクローンしたディレクトリのプロジェクトをオープンしておきます。
また、このタイミングでAndroid Studio上でソースコードを1行変更しておきます。
app > java > AssistantActivity.javaの61行目の変数をfalseに設定します。
`private static final boolean AUDIO_USE_I2S_VOICEHAT_IF_AVAILABLE = false;`
変更後、ファイルを保存してください。

### コマンドプロンプト上での作業
コマンドプロンプトの作業ディレクトリをGoogle Assistantをクローンしたディレクトリにして以下のコマンドを入力します。`client_secret_NNNN.json`はGoogleAPI Console Projectの作成の５で保存したファイルを指定してください。

`google-oauthlib-tool --client-secrets client_secret_NNNN.json 
--credentials app/src/main/res/raw/credentials.json --scope https://www.googleapis.com/auth/assistant-sdk-prototype --save`

自動的にブラウザが立ち上がり、認証画面になるので許可を選択してください。画面が切り替わったらページを閉じて大丈夫です。

続けて以下のコマンドを入力します。
`> gradlew assembleDebug`
`> adb install -g app/build/outputs/apk/app-debug.apk`
RaspberryPi3が接続状態ならば成功するはずです。失敗した場合、`adb connect [IPアドレス]`で接続を確認してください。

最後にAndroid StudioでRun（▶）をします。アプリが配置され、起動します。
しばらく待った後でスイッチを押して英語で話しかけてみてください。応答が返ってきたら成功です。お疲れ様でした。

## まとめ
ゼロからサンプルを動かすまでにやったことをざっと書き出しました。
Android Thingsは日本語情報がまだまだ少ないですが、GoogleのAPIがIoT端末で使えるなど、魅力的なサービスだと思います。Assistantのレスポンスも早いし。
次のステップでは実際にアプリを作ってみることにします。
ここまで読んでいただきありがとうございました。