2014年4月19日土曜日

[コラム] Google Glass XE16 サンプルコードから見る変更点



ついに来ました。やっと来ました。XE16が公開されました。
以前から言われていましたがベースをICS4.0.3から、Kitkat4.4へ変更されています。
追加機能や、変更機能は、すでに他のサイトで紹介されていますので、どのように変わったのか古いバージョンのサンプルソースを利用して調べてみました。


■スクリーン録画って使えるの?

いきなり開発とは関係ない話になります。
スクリーン録画は、Android Kitkat4.4から追加された機能で、その名の通り動作中の動画撮れる機能です。
Google GlassもKitkat 4.4になったんだし、この機能も使えるんじゃないの?って事で試してみました。

実際に録画した動画がこちらになります。


どうでしょう?いい感じではないでしょうか?

Google Glassは内容を人に伝えづらい端末です。
録画した動画を見て頂くことで、Google Glassでの動きも伝えやすくなると思います。


■XE12からの変更点

では、本題です。
XE12から何が変わったのかを探っていきます。

まずは、GDKから。GoogleGlass XE16用のGDKは、アップデート前から配信されています。



実は、サンプルコードも配信される前からXE16用になってます。

※今回は、よく参考に使われるstopwatchを利用しています。


これらをもとに古いバージョンのサンプルを最新のGDKでビルドしてみました。
結果はこんな感じです。



・LiveCardの生成方法

StopwatchService.javaでエラーが発生している箇所を見てみると、LiveCardの生成するためのTimelineManagerクラスが削除されました。

[StopwatchService.java]

XE16以前の記述方法
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (mLiveCard == null) {
            Log.d(TAG, "Publishing LiveCard");
            mLiveCard = mTimelineManager.createLiveCard(LIVE_CARD_TAG);

            // Keep track of the callback to remove it before unpublishing.
            mCallback = new ChronometerDrawer(this);
            mLiveCard.setDirectRenderingEnabled(true).getSurfaceHolder().addCallback(mCallback);

            Intent menuIntent = new Intent(this, MenuActivity.class);
            menuIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            mLiveCard.setAction(PendingIntent.getActivity(this, 0, menuIntent, 0));

            mLiveCard.publish(PublishMode.REVEAL);
            Log.d(TAG, "Done publishing LiveCard");
        } else {
            // TODO(alainv): Jump to the LiveCard when API is available.
        }

        return START_STICKY;
    }

こちらが新しいバージョンの記述方法です。
   @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (mLiveCard == null) {
            mLiveCard = new LiveCard(this, LIVE_CARD_TAG);

            // Keep track of the callback to remove it before unpublishing.
            mCallback = new ChronometerDrawer(this);
            mLiveCard.setDirectRenderingEnabled(true).getSurfaceHolder().addCallback(mCallback);

            Intent menuIntent = new Intent(this, MenuActivity.class);
            menuIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            mLiveCard.setAction(PendingIntent.getActivity(this, 0, menuIntent, 0));
            mLiveCard.attach(this);
            mLiveCard.publish(PublishMode.REVEAL);
        } else {
            mLiveCard.navigate();
        }

        return START_STICKY;
    }


TimelineManagerからLiveCardを生成するのではなく、LiveCardを直接生成する方法に変わっています。

LiveCardの生成方法を変更することで、とりあえずはビルドが通る状態となりました。
では早速、Glassで動作確認をしてみます。


・音声で起動しない

インストールした後、「start a stopwatch」と話しても起動してくれません。
音声起動どころか、音声起動の一覧にすら表示されていません。

調べてみると音声起動の設定方法が変わっていました。
今回のバージョンより、決まった音声のみの起動可能となってます。

それだとテストも出来ないじゃないかということで、以下のuses permissionを利用することで今までと同じように音声での起動も可能となります。

<uses-permission android:name="com.google.android.glass.permission.DEVELOPMENT" />   


ただし、開発時のオプションのため、リリース時には、Googleの承認が必要となりそうです。
音声起動の部分は、今後公開するうえでネックになりそうに思います。



これで起動もできたので、ストップウォッチの動作を確認します。



動作も問題なしだったので終了したところ・・


まさかの異常終了。
エラーログを見るとこんな感じに。



・openOptionMenuの呼び出しタイミング

問題を調べてみると、openOptionMenuが呼び出されるタイミングが変わっていました。


[MenuActivity.java]

XE16以前の記述方法
@Override
    public void onResume() {
        super.onResume();
        openOptionsMenu();
    }

こちらが新しいバージョンの記述方法です。
@Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        openOptionsMenu();
    }


ここまで来ると以前と同じように動作するようになりました。





今回調査をしてみてLiveCard周りの変更が大きいと感じました。
説明できていませんが、追加されている部分も多くあります(attachやnavigateなど)
音声起動は、着々と一般販売に向けて制限しているのかなという感じです。

Bluetooth周りも大幅に変わったと聞きます。
以前のバージョンでは、かなり苦労したので今回のバージョンアップで、少しでも素直になってくれたらと期待しています。
LiveCardの追加分も含めて、別の機会で報告できればと思います。





㈱ブリリアントサービス 大阪開発部 開発課 田中雅也



140 180 Android , Google Glass

記載されている会社名、および商品名等は、各社の商標または登録商標です。

0 コメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...