メンバ募集!

ラストシューティングではいっしょにアプリ制作をするメンバを募集してます!
スキルアップを目的としたサークル活動の形です
各人のスキルを活かして、みなでアプリを創りストアに公開するまで行います
ご興味がある方はブログ横のFacebook・Google+のリンクやメールにて気軽にご連絡ください~ (・ω<)

ラベル

技術 (80) 開発 (77) ゲーム (67) アプリ (63) 福岡 (59) 趣味 (59) android (52) アニメ (22) レトロゲーム (21) 温故知新 (21) ガンダム (19) レポート (19) WEBサイト (17) 経済 (17) iOS (9) 麻雀 (7) グルメ (5) マンガ (4) Wear (1)

2014年11月23日日曜日

Android Wearアプリでコンテスト受賞報告

Shunです。

先日開催された、e-ZUKAスマートフォンアプリコンテスト2014にて
以前企画したアプリのプレゼンとデモンストレーションを行いました。

デモブース(まだ開始前の)

企画して作成したアプリは「bijin-wearable」というAndroid Wearアプリです。
「美人時計」で有名なBIJIN&Co.様のテーマ、
「全国の地元BIJINが活躍のチャンスを得ることができるアプリ」
に提出しました。

このアプリ、ブロードバンド推進協議会様から賞を頂きました。
ニコ動のインプレッション数が最も多かった賞とのことでした。



関係各位、ご協力頂いたみなさま、ありがとうございましたm(__)m


さて、ここでアプリの技術的な点をちょっと説明してみようかなと思います。




「bijin-wearable」は極めてシンプルな構成になってます。

当日のプレゼン資料
https://www.slideshare.net/secret/N5WBxvNYJfGNWg

展示中の写真。

※今回、BIJIN&Co.様からコンテストに係る開発目的の範囲内で
  bijin様のデータを使用させて頂きました。
  当ブログでは画像について修正を掛けておきます。

定期的にスマホとWearに同じ画像を表示させる、ということで
このアプリではData APIを使用してデータの同期を行わせています。

http://developer.android.com/training/wearables/data-layer/data-items.html

さらに画像の転送なのでAssetの転送を使っています。

http://developer.android.com/training/wearables/data-layer/assets.html

さて、ここで苦労した話を。
このAssetの転送、しばらく画像を同期させていると
Wear側のActivityが強制終了する現象が起きていました。

ログを分析すると、リクエストを1つ発行(スマホ側)するたびに、
リクエストを受けて(Wear側)は複数のリクエストを受ける現象。
はじめは1つのリクエストだが、次は2つ、その次は3つ、、、そして
処理できなくなって落ちるという。

うーん、なんだこれ?と切り分けたら
公式のサンプルソースにおかしな部分がありました。

  1. public Bitmap loadBitmapFromAsset(Asset asset) {
  2.     if (asset == null) {
  3.         throw new IllegalArgumentException("Asset must be non-null");
  4.     }
  5.     ConnectionResult result =
  6.            mGoogleApiClient.blockingConnect(TIMEOUT_MS, TimeUnit.MILLISECONDS);
  7.     if (!result.isSuccess()) {
  8.         return null;
  9.     }
  10.     // convert asset into a file descriptor and block until it's ready
  11.     InputStream assetInputStream = Wearable.DataApi.getFdForAsset(
  12.             mGoogleApiClient, asset).await().getInputStream();
  13. ☆ここ! mGoogleApiClient.disconnect();
  14.     if (assetInputStream == null) {
  15.         Log.w(TAG, "Requested an unknown Asset.");
  16.         return null;
  17.     }
  18.     // decode the stream into a bitmap
  19.     return BitmapFactory.decodeStream(assetInputStream);
  20. }

☆の1行は要らない。
なんでここでGoogleApiClient.をdisconnectなんてしちゃうんでしょうという感じです。
おそらく別の行に書くもののコピーミスかなにか。

とりあえず、この1行を消せばリクエストが大量に受けるように形は直りました。
(ただしくはdisconnectしていたので毎度つなぎにいって、
  複数のリクエスト受ける変なことになった?)

公式のサンプルがおかしいとかあるのか、マジ?と思ったり。


あ、ほんとうは別の話を書くつもりだったんですが長くなったのでこのへんで。
(今回、ウォッチフェイスアプリにしたかったけど
  ウォッチフェイスアプリだとタップやスライドのアクションができないので断念した話とか)