先日、アンドロイド上で動くゲームのアルテミスをNexus Qで動作させるようにしました。

他にも同じような事を考える方がいると思うので(きっといる!)三回に分けてブログ記事をアップします。

概要

Nexus Q は、他のAndroid端末を使って、音楽や映像をストリーミング再生できる機器です。

1-1-min.jpg

2012年の Google I/O で無料配布されたものと、Google Play で予約受付をしていた人に、発売延期の発表時に無料提供されたものだけで、現在は、既に持っている人から譲り受ける以外に入手方法はありません。
仕様などの詳しいことはガイドライン (英語) に記載されています。
周辺機器との接続方法などは、日本語の解説サイトがいくつかありましたので、そちらをご覧ください。

開発

まず、開発を行うためには、Nexus Q と PC を adb 接続する必要があります。
初期状態の Nexus Q を PC と USB ケーブルで接続しただけではだめで、通常の Android 端末と同様に Nexus Q をデバッグモードにする必要があります。
しかしながら、Nexus Q には、ボリュームコントロールしかないので、コマンドラインから設定アプリを起動しても操作できません。
デバックモードを ON にするためには、Nexus Q の最初のセットアップに使った Nexus Q 専用アプリが必要です。
この専用アプリを使うと、同一ネットワーク上にある Nexus Q を Bluetooth 接続で設定できます。
デバッグモードに設定する手順は次のとおりです。

  1. Nexus Q の所有者端末をデバッグモードにする。
  2. Nexus Q アプリが動いている端末でデバッグモードが OFF になっていると、Nexus Q アプリ上にデバッグモードにする項目が現れないので注意してください。
  3. Nexus Q アプリの詳細設定にデバッグモードを ON にする項目が追加されるので、ON にする。

1-2-min.png

1-3-min.png

これで接続ができたので、adb コマンドを使ったアプリのインストールや、Eclipse からのデバッグができます。

所有者以外の端末だと設定を変更できないのでダイアログが表示されます。

1-4-min.jpg

最初に Nexsus Q をセットアップする時に使用したアンドロイド端末 (Google account?) が Nexsus Q の所有者となっているので、別のアンドロイド端末で操作をしたい時は
Nexus Q を工場出荷状態に戻す必要があります。

    ファクトリーリセットの手順

  1. Nexus Q 電源コードを繋げて、Nexus Q の中心が青く光ったら、すぐにミュート部分を押しっぱなしにする。
  2. ミュート部分を押しっぱなしにしたまま電源コードを繋げても何も起こらないので注意してください。
  3. しばらく押しっぱなしにすると、Nexus Q の発光色が赤に変わる。
  4. さらに、押しっぱなしにしていると、また色が変わるので、そこで手を離してしばらく待つと Welcom 画面が表示される。
  5. ここで工場出荷状態になります。
  6. Welcom 画面が表示された後は、 Nexus Q アプリから、Bluetooth で Nexus Q の Wi-fi 設定を行う。

以下のスクリーンショットは、4番からの操作を撮ったものです。

1-5-min.png

1-6-min.png

1-7-min.png

1-8-min.png

1-9-min.png

所有者端末と Nexus Q が同一ネットワークに接続されると、Nexus Q アプリからデバッグモードなどの設定ができるようになります。
リセットについては、Jetstream で詳しく解説されています。

また、開発時に役に立ちそうな adb コマンドを記載しておきます。

  • アプリインストール
  • $adb install [apkファイル]

  • デバイス一覧
  • $adb devices

  • シェル起動
  • $adb -s [デバイスID] shell

  • アプリ起動
  • am start -a android.intent.action.MAIN -n [package名]/[起動Activity名]

例えば、設定アプリを起動するにはシェルで次のように入力します。


am start -a android.intent.action.MAIN -n com.android.settings/.Settings

Nexus Q で次のコマンドからランチャーを起動しようとしてみると


am start -a android.intent.action.MAIN -c android.intent.category.HOME

このように起動後の画面になります。(Nexsus Qではランチャーアプリは、このぐるぐる画面になってます)

1-10-min.jpg

Nexus Q の特徴

Nexus Q には、ディスプレイ、メニューボタン、ホームボタン、バックボタンもなく、電源ボタンもありません(停止時はコードをぶっこぬきます)。
通常の使用方法では、左に回すとボリュームダウン、右に回すとボリュームアップ、中心をタップするとミュートしかありません。

1-11-min.jpg

1-12-min.jpg

イベントの取得

2012年9月25日時点で、Google Play に公開されている “Nexus Q” 検索できたゲームは、今のところ Qarkanoid だけでした。

1-13-launcher.png

1-13-min.jpg

Nexus Q がどのようなイベントを取れるか興味がありましたが、運良く、この作者さんとは、Bar Android でお話できる機会があり、取得できるイベントはボリューム関係だけということを仰っていたので、その情報に基いて調べたところ、確かに、Nexus Q 単体ではそれしか取得できませんでした。
イベントも含めて、取得した基本的なパラメータの一覧は次のとおりです。

  • スペック
  • API Level 15
    Build.MODEL Nexus Q
    Build.CPU_ABI armeabi-v7a
    Build.CPU_ABI2 armeabi
    Screen Orientation Landscape
    Screen Size (w x h) 1920 x 1080 (Pixels)
    254.0 x 254.0 (Dpi)
    Density 2.0
    Density DPI 320

  • イベント
  • KeyEvent KEYCODE_VOLUME_UP
    KEYCODE_VOLUME_DOWN
    KEYCODE_VOLUME_MUTE

1-14-min.jpg

上のスクリーンショットは、パラメータ取得を兼ねて適当に作ったアプリですが、Nexus Q では、アプリのテーマを FullScreen にしなくても、上のスクリーンショットのように、ステータスバーは表示されないようです。
もちろん、システムバーも表示されていません。

Nexus Q の判定

NexusQはなんだか面白そうな匂いがするのですが、目的もなくいじっても面白くないので、
タオのゲームアルテミスをNexusQで動かすのを目的としました。

まず考えたのが、Artemisを、通常の Android と Nexus Q 版を同じ APK とするか?でした。
判断材料を箇条書すると、次のようになります。

  • Nexus Q はバリエーションがない
  • プロジェクトファイルが同じになるので管理が容易
  • Nexus Q 専用のイベント処理ロジックが実装されるので、保守性が下がりますが、一度作れば変更される可能性が低い
  • コードの可読性は、Android/Nexus Q/iPhone という分け方になっているのでほとんど変わらない

通常の Android 版とNexus Q 版を同一にする場合、内部的に Nexus Q かを判定する必要があります。
判定に使うのは、次のコードです。

Android 側


import com.unity3d.player.UnityPlayerActivity;
public class NexusQActivity extends UnityPlayerActivity {
private static final boolean IS_NEXUS_Q;
static {
IS_NEXUS_Q = Build.MODEL.equals("Nexus Q");
}
public static boolean isNexusQ() {
return IS_NEXUS_Q;
}
}

Plugins フォルダ内の C# コード


public class AndroidObserver : MonoBehaviour {
public static bool isNexusQ() {
if (nexusQActivity == null)
nexusQActivity = new AndroidJavaClass("jp.co.taosoftware.android.artemis.NexusQActivity");
return nexusQActivity.CallStati<bool>("isNexusQ");
}
}

Scripts フォルダ内の JS コード

if (AndroidObserver.isNexusQ()) {
// Nexus Q の処理
} else {
// 通常のAndroidの処理
}

その他

第一回をアップしましたが、結構大作ですね。(書いたのは私じゃありません)
書いてもらって、アップするのをわすれてました。ごめんなさい。

今週末行われる、ABC東北では、このアルテミスforNexusQをブースに展示します。

こられた方は是非触ってみてください。

ブログ内の関連する記事