korechi’s diary

とあるVR/ARエンジニアのブログ

SmartEyeGlass用アプリを1から作る

  1. Android Studioで適当な名前のプロジェクトを作成

  2. Target DeviceをGlassにする f:id:korechi:20160325134524p:plain

  3. あとはNextを選択してFinishでサンプルプロジェクトが立ち上がる

  4. Android Manifestをインクルード
    AndroidManifest.xmlをプロジェクトにインクルードする。
    すでにAndroidManifest.xmlがある場合は、サンプルプロジェクト内のapp/manifesestsにこのファイルが入っているのが確認できるのでそれを真似する

  5. File/New/Import Moduleを選択
    SmartExtensionAPIとSmartExtensionUtilsとSmartEyeGlassAPIをプロジェクトにインポートする

  6. build.gradleの一番下に以下を記述

dependencies {
    compile project(':SmartExtensionAPI')
    compile project(':SmartExtensionUtils')
    compile project(':SmartEyeglassAPI')
}

これを記述しないとimportができないので注意

ここまででひと段落。
次はjavaクラスを追加していきます

その際に最低限必要なクラスは
Constants
BroadcastReseiver
ExtensionService
RegistrationInformation
ControlExtension
PreferenceActivity

あると便利なクラスとして
ScreenSize
があります。これらを

  1. 基本となるクラスを継承する Constantsクラスはそのままjavaフォルダ下にコピー
    BroadcastReseiver、ExtensionService、RegistrationInformation、ScreenSizeはそれぞれを継承したクラスがあるはずなので、それらをうまい名前に変えてコピー

これらは基本的に中身はそんなに変えなくていいはず
2. ControlExtensionとPreferenceActivityを継承したjavaクラスを作る

public class SampleControlExtension extends ControlExtension {}
public class MainActivity extends PreferenceActivity {}

ControlExtensionclassを継承することで、defineやディスプレイのレイアウト、イベントリスナーの作成、イベントハンドラーの定義、デバイスセンサーからのデータ取得を行える
(具体的にはSmartEyeglassControlUtilsを使えば大体の操作ができる)

もし、Android端末では何も行わないならばPreferenceActivityには何も記述しない
ここまで出来れば下の図のような配置になっているはず
f:id:korechi:20160325142850p:plain 3. layoutを作る
app/res/にlayout.xmlを作り、テキストなど適当に配置する
(ここはスルーしてもいい)
4. SampleControlExtensionを作る ここではグラスにHello Worldを表示するだけの機能を持たせたクラスとする

public class SampleControlExtension extends ControlExtension {

    private final SmartEyeglassControlUtils utils;
    private static final int SMARTEYEGLASS_API_VERSION = 1;

    public SampleControlExtension(Context context, String hostAppPackageName) {
        super(context, hostAppPackageName);

        // utilの初期化
        utils = new SmartEyeglassControlUtils(hostAppPackageName, null);
        utils.setRequiredApiVersion(SMARTEYEGLASS_API_VERSION);
        utils.activate(context);
        updateLayout();
    }

    @Override
    public void onResume() {
        updateLayout();
        super.onResume();
    }

    @Override
    public void onDestroy() {
        utils.deactivate();
    }

    @Override
    public void onTouch(final ControlTouchEvent event) {
        super.onTouch(event);
    }

    private void updateLayout() {
        showLayout(R.layout.layout, null);
        sendText(R.id.sample_text, "Hello World!");
    }
}

以上!これで動くものは作れます(はず)

+α

UIの作成

SmartEyeGlassで一番上のレイヤーはcard layerと呼ばれる層で、アプリケーションを選択することができる。
WidgetAPIを使うことで、アプリの最初のアイコンを作ることができる。
詳しくはここWidgets | Sony Developer Worldを見る。

例)HelloLayouts サンプル
XML Layout definitionで使うディスプレイのサイズを定義する。
data Bundle with run-time data を作成。
ControlExtensionを継承したクラス内でSmartEyeglassControlUtils.showLayout()を使うことでディスプレイに表示させている。

イベントハンドラの追加

次に、いつ表示するかを決めなければいけない。その方法は2つあり

・built-in event callbackをoverrideする  
・イベントリスナーを作成し、ハンドラーのコールバックを定義する  

があります。

built-in event callbackをoverride

onTap()onKey()などの基本操作は備わっており、たとえばメニュー画面からアプリがタップされたら起動します。
その動作を改造したい場合は、改造したい関数をoverrideすればよい。

イベントリスナーの作成

SmartEyeglassEventListenerを継承することで、独自のリスナーやハンドラを定義できる。
ここでいうリスナーとハンドラは、
イベントハンドラー: イベントに対して処理を定義したメソッド
イベントリスナー: イベントに対して処理を結びつける仕組み。
であると考えます。(自分は)
例としては

private final SmartEyeglassEventListener mSmartEyeglassEventListener = new MySmartEyeglassEventListener();
 
class MySmartEyeglassEventListener extends SmartEyeglassEventListener {
 
     @Override
     public void onCameraReceived(CameraEvent event) {
          }
 
     @Override
     public void onCameraErrorReceived(int error) {
          }
 
     @Override
     public void onCameraReceivedFile(String filePath) {
          }
 
     @Override
     public void onRecordingStatus(long timeInMs, long frames) {
          }
 
}

のように各イベントごとに処理をoverrideする。
3. テストする 実機でもエミュレータでもいいのでテストしてみる。
GooglePlayに公開する際には、説明に“SmartEyeglass”を記載する。

以上で簡単なプロジェクト作成に必要なものたちを紹介しました。