コンテンツ作成 > アプリ > SmartWatch2開発

SmartWatch2開発

コンテンツ


概要


公式リンク


開発環境の構築

  • ゼロから始めるSmartWatch向けアプリ開発 環境構築編を参照
  • 環境構築の流れ
    • 通常のAndroid開発環境(Eclipse)を用意
    • Android SDK ManagerにSony Add-on SDKを追加(Eclipseにではない)
    • Android Sample ProjectとしてSmartExtensionAPIとSmartExtensionUtilsを作成
    • SmartExtensionAPIとSmartExtensionUtilsをライブラリに設定
    • SmartExtensionUtilsからSmartExtensionAPIをライブラリとして参照する設定に変更
  • 新規プロジェクトの作成
    • SDKバージョンは次の設定にする(SmartWatch2はAndroid 4.0以降のみのため)
      • 最小必須SDK:API 14 (Android 4.0)以上
      • ターゲットSDK:API 14 (Android 4.0)以上
      • 次でコンパイル:Sony Add-on SDK
    • 作成後にSmartExtensionUtilsをライブラリとして参照する設定に変更
  • 開発環境について
    • 最新のSony Add-on SDKはAPI 19で提供されている(2014/08/13現在)
    • エミュレータは存在するがSmartWatch2のウィジェットはテストできない
      • 実機テストのみとなるため注意して実装する必要あり

ハードウェア仕様

ディスプレイ

  • TFT液晶
  • 16ビットカラー(65536色)
  • 220ピクセル×176ピクセル
    • ただしウィジェットは最大215ピクセル×170ピクセル

インタフェース

  • Bluetooth
  • バイブレータ
  • バックキー(左)
  • ホームキー(中央)
    • ホームキーのみアプリからの制御はできない
  • アクションキー(右)

センサー

  • 加速度センサ
    • 最速計測間隔:25Hz
    • 最小遅延:1000ms
    • 範囲:-8g~8g
    • 解像度:0.016g
  • 光センサ
    • タイプ:Lux(ルクス)
    • 解像度:10

APIドキュメント関連

カラムのPRESENCEの違い

  • DB操作対象のカラムにはPRESENCE(プレゼンス)が設定されており、ContentValuesに設定する際の重要度が異なる
  • プレゼンスは3種類存在する(上から重要度が高い)
    • MANDATORY:強制
      • このカラムはContentValuesに設定する必要がある
      • 値は正当なものでなければならない(IDなど値が正しくないとDB操作ができないものが該当)
    • REQUIRED:必須
      • このカラムはContentValuesに設定する必要がある
      • 値は正当なものでなくてもよい(時刻など値が何であってもDB操作する上で問題がないものが該当)
    • OPTIONAL:任意
      • このカラムはContentValuesに設定してもしなくてもよい
      • 値は正当なものでなくてもよい(カラム自体が無くても問題がないものが該当)

エクステンション関連(Extension)

エクステンションとは

  • SmartWatch2などのアクセサリを拡張するアプリ
  • フォーマットは通常のAndroidアプリと同じ(APK)
    • 特殊なReceiverを定義することでエクステンションとして扱われる
    • Androidアプリとの共存や各種機能との連携も可能

APIの構成

  • ライブラリプロジェクトの構成
    • SmartExtensionAPI
      • パッケージ: com.sonyericsson.extras.liveware.aef
      • 各APIの基本クラスが定義されている
    • SmartExtensionUtils
      • パッケージ: com.sonyericsson.extras.liveware.extension.util
      • 各APIのユーティリティクラスが定義されている
  • インテント(Intent)ベースのAPIである
    • IntentとExtraは基本クラス側に定義されている
    • インテントベースではあるがユーティリティクラスを使うとインテントを直接扱う必要はほぼ無い
      • インテント送出が必要な処理はprotectedメソッドとして定義されており自クラスのメソッドのように呼び出し可能
      • インテント受信はpublicメソッド(on~)として定義されておりオーバーライドして好きに処理を実装可能

コントロール関連(Control API)

コントロールエクステンションとは


ノーティフィケーション関連(Notification API)

ノーティフィケーションエクステンションとは


ウィジェット関連(Widget API)

ウィジェットエクステンションとは

ウィジェットのサイズ

  • ウィジェットは画面を5x5に区切ったセルに配置する
    • 1セルは43x34ピクセル
  • ウィジェットはセル単位で任意の長方形サイズにできる
    • 1x1~5x5(画面全体を覆う)が可能
    • 実装上はピクセル単位で指定する
      • 2x2セルなら86x68ピクセル
    • セルからはみ出す場合は1セル余計に消費する
      • 幅44ピクセルの場合は1セル+1ピクセルなので実際は2セル使う
  • プレビュー画像はピクセル単位のサイズ×2が目安
    • 2x2セルなら86x68ピクセルなので172x136ピクセルにする
    • 特に規定は無いがプリインウィジェットと同じにするなら背景透明&白で描くと良い

ウィジェットのクラス構成

ウィジェットのレイアウト仕様

  • 単位はすべてpxに統一する
    • dpやspを使うとスマホ側の画面密度の影響を受けてしまう
  • 使用できるViewGroup/View
    • ViewGroup
      • AbsoluteLayout
      • FrameLayout
      • RelativeLayout
      • LinearLayout
      • TimeLayout - LinearLayoutを継承/Sony Add-on専用
    • View
      • View
      • ImageView
      • TextView
      • TimeView - TextViewを継承/Sony Add-on専用
    • 使用できる属性はEXTRA_DATA_XML_LAYOUTのリファレンスを参照
  • 省電力モードではモノクロ4色表示になる
    • カラー画像を使う場合はモノクロ表示も確認するかモノクロ用画像を用意すること
    • モノクログラデーションで試したところ真っ白になる範囲は他の3色に比べるとやや狭い
      • RGBが0~255のモノクロ色がどのモノクロ4色に対応するかの目安
      • 黒:0~67 濃灰:68~135 薄灰:136~203 白:204~255
    • 一般的な色のモノクロ4色への対応
      • 黒:黒(#000000)、青(#ff0000)
      • 濃灰:灰(#808080)、赤(#ff0000)、緑(#008000)、マゼンタ(#ff00ff)
      • 薄灰:橙(#ff8000)、黄緑(#00ff00)、シアン(#00ffff)
      • 白:白(#ffffff)、黄(#ffff00)

TimeLayoutクラスの仕様

  • TimeLayoutはLinearLayoutを継承したViewGroupの1種
    • OrientationはHORIZONTALで固定
    • TimeViewを縦に並べたい場合はTimeLayout-TimeViewのセットをOrientation=VERTICALなLinearLayoutに入れればいい
  • 子としてはTimeViewしか入れられない(それ以外を入れると例外発生)
    • 複数のTimeViewを入れることが可能
    • TimeViewはwidgets:timeType="constant"によってTextViewやImageViewとして利用できるのでそれほど大きい制約ではない
  • TimeLayout固有の属性
属性名 概要
widgets:timeOffset int 現在時刻とのオフセットを秒で指定。負の値も使用可能。
widgets:gravity int 中身の寄せ方向を指定。設定値はLinearLayoutとは別に定義されており、fill系、clip系、start、endは使用不可。

TimeViewクラスの仕様

  • TimeViewはTextViewを継承したViewの1種
    • 必ずTimeLayoutと組み合わせて使用する
  • TimeView固有の属性
属性名 概要
widgets:timeType enum 下記の「widgets:timeType属性の設定値」を参照
widgets:textSize dimension 文字のサイズをpx単位で指定。"match_parent"を指定することもでき、その場合は現在の表示領域に収まる最大サイズで表示されると思われる(未確認◆)。
widgets:fontPath string 文字を描画する際のカスタムフォントのパスを指定(未確認◇)。
widgets:textArray reference? 時刻の値に応じたカスタム文字表示用の文字列配列を指定(動作した試しがない■)。
widgets:template string 数字の表示フォーマットをDateFormat形式で指定。widgets:timeType="months"なら"MM"など。一部の組み合わせは動作しない。
◆ソースの実装によると「文字サイズ=領域の高さ」から開始して幅が収まるまで文字サイズを順次小さくしていくようになっている。
◇ソースの実装によるとTypeface.createFromAsset()を使用している。そのためassetsディレクトリのパスを指定する。
■ソースのコメントはstring-arrayを指定するように読めるが、ソースの実装ではinteger-arrayとして読み込んだ後にその値で文字列リソースを参照している。しかしAndroidのリソースシステムでは「リソースIDの配列」をinteger-arrayとして定義する仕組みが無いため実際は使用できない(TypedArrayならリソースIDの配列を定義できるが読み取り側がinteger-array決め打ちなので意味が無い)。さらにDeveloper guidelinesでは<level-list>には存在しないandroid:string属性を使って文字列リストを定義すると記載されている。あーあ もうめちゃくちゃだよ。
  • widgets:timeType属性の設定値
名称 状態数 状態範囲 概要
constant☆ 1 - 時刻によって変化しない固定の表示
timeType属性のデフォルト値
seconds 60 0~59
画像指定数が1の時は特殊動作★
seconds_digit2 6 0~5 秒の10の位
seconds_digit1 10 0~9 秒の1の位
minutes 60 0~59
画像指定数が1の時は特殊動作★
minutes_digit2 6 0~5 分の10の位
minutes_digit1 10 0~9 分の1の位
hours 24 0~23
hours_digit2 3 0~2 時の10の位
hours_digit1 10 0~9 時の1の位
days_of_week 7 月曜~日曜 曜日
days_of_month 31 1~31
days_of_month_digit2 4 0~3 日の10の位
画像指定で使うとバグる▲
days_of_month_digit1 10 0~9 日の1の位
画像指定で使うとバグる▲
days_of_year 366 1~366 年を通した日数
days_of_year_digit3 4 0~3 年を通した日数の100の位
days_of_year_digit2 10 0~9 年を通した日数の10の位
days_of_year_digit1 10 0~9 年を通した日数の1の位
months 12 1~12
months_digit2 2 0~1 月の10の位
months_digit1 10 0~9 月の1の位
years_digit4 10 0~9 年の1000の位
years_digit3 10 0~9 年の100の位
years_digit2 10 0~9 年の10の位
years_digit1 10 0~9 年の1の位
am_pm 2 午前,午後 午前/午後
24時間表記の場合は何も表示されない
hours_fine 60 - 12分ごとに切り替わる
12時間で1周するアナログ時計の時針用
画像指定数が1の時は特殊動作★
☆TimeLayoutにはTimeViewしか入れられない仕様だが、constantを使用するとTimeViewをTextViewやImageViewとして利用できる。
  「時:分」のような表示では「時」と「分」をそれぞれを別のTimeLayoutで囲む必要があるが、
  「:」をTimeViewで表示できるなら全体を1つのTimeLayoutで囲むだけで良い。
★指定したリソースが1つだけの場合、そのリソースを回転させたものが状態数分だけ自動生成され設定される。
  アナログ時計としての使用を想定した仕様。
▲画像を指定する場合はバグのため動作しない(SmartWatch2が再起動を繰り返す)。
  代わりに画像を31種類用意して"days_of_month"を使う必要がある。

セルフQ&Aコーナー

APKの作成に失敗する/APKをインストールしてエクステンション一覧を開くとエラー

  • Sony Add-on SDKがバグっている
    • ビルドしようとすると頻繁にDalvikフォーマットエラーを吐く
      • 同じ環境でも通常のAndroid向けにビルドする時はそのようなエラーは全く出ない
    • 正しくビルドできたように見えてもインストールするとエラーになること多々
  • リリースする前に必ず実機にインストールして試すこと

ウィジェットのサイズは正しいのに表示が1分ごとにずれる

  • 恐らくはスクリーンセーバーのような画面焼き付き防止のための仕様
    • 特定のウィジェットではなく画面全体がずれているはず
  • 画面が220×176pxに対して最大サイズのウィジェットは215×170px
    • 5×6=30パターンの描画開始位置(オフセット)をランダム(?)に使っていると思われる

オフラインでも動作するウィジェットを作るには?

  • レイアウトだけで描画が完結しプログラムから再描画が不要であればOK
    • 初回のonStartRefresh()でshowLayout()を呼んだ後は何もしてはいけない
      • showLayout()はレイアウトを3つ指定するバージョンを呼ばないとオフライン時に色が変わってしまう
    • レイアウトで可変表示になるのはTimeViewのみ
      • TimeViewには画像を使用しても問題ない(初回設置時にSmartWatchに画像が転送される)
      • 表示内容を変更しないTextViewやImageViewは問題なく使える

12時間表記のデジタル時計を作りたい

  • 方法1
    • TimeLayout+TimeViewで時間に"hours"か"hours_digit2"&"hours_digit1"を使う
    • 設定→日付と時刻で「24時間表示」のチェックを外す
      • 本体側の設定変更が必要だが12時間/24時間の両方に対応可能
  • 方法2
    • TimeLayout+TimeViewで時間に"hours_fine"を使う
      • "hours_fine"は12分に1回切り替わり12時間でループするので、同じ画像を5回ずつ並べることで12時間の時計にできる
      • 1~12時の画像リソースを作成しておき、level-listは12時の画像を5回→1時の画像を5回→2時の画像を5回……11時の画像を5回の順に並べる
    • 本体側の設定変更は不要(常に12時間表記になる)
      • "hours_fine"はアナログ時計用なので時間フォーマットの影響を受けない

作成したウィジェットを置いても何も表示されない

  • レイアウトファイルに誤りがある
    • 使用できないViewや属性を使用している
    • TimeLayout/TimeViewの属性におかしな値を設定している
  • プログラムの実装に誤りがある
    • showLayout()を呼び出していない
    • 処理で例外が発生している

作成したウィジェットを置いたらSmartWatch2(ホストアプリ)が落ちる

  • SmartWatch2(実機)の再起動が併発する場合がある
    • しばらく待つと再接続されるので原因のウィジェットを落ち着いて削除する
  • 画像を使ったTimeViewを使用するとよく発生する
    • 内部的に幅か高さが0のBitmapを生成しようとして例外を吐いている
      • 恐らくSmartWatchに転送するための画像を生成する処理
    • TimeViewやTimeLayoutの幅と高さを明示的にpx単位で指定すると直る(はず)

リソース

画像

リソース名 画像サイズ(実サイズ※1) 色数 透明 用途
HOSTAPP_ICON_URI xhdpi: 96x96(88x88)
hdpi: 72x72(66x66)
mdpi: 48x48(44x44)
ldpi: 36x36(34x34)
カラー ホストアプリのエクステンション一覧
EXTENSION_48PX_ICON_URI 48x48(46x46) カラー SmartWatch2 SW2のアプリ一覧
EXTENSION_ICON 36x36(34x34) カラー SmartWatch MN2のアプリ一覧
EXTENSION_ICON_URI_BLACK_WHITE 18x18(16x16) 白/黒 不可 SmartWatch MN2のアイコン?
ICON_URI_1 30x30(26x26) カラー SmartWatch MN2のウィジェットビュー
ICON_URI_2 18x18(14x14) カラー SmartWatch MN2のイベントビュー
ICON_URI_BLACK_WHITE 18x18 白/黒 不可 SmartWatch MN2のウィジェット/イベントビュー
※1 パディング(透明)を除いたサイズ。
 ・EXTENSION_ICON_URI_BLACK_WHITEのみパディングは黒。
 ・ICON_URI_BLACK_WHITEにパディングは無い。

技術的にできないこと

  • 設定画面に表示される設定の取得/変更
    • 壁紙、バイブ、Bluetooth、日付などあらゆる設定
  • SmartWatch2の状態の取得
    • 電池残量
  • プリインストールアプリの起動
  • 他のアプリの設定の取得
  • コントロールAPI以外からのバイブの制御
  • 地磁気センサの使用(API上は存在するが使えない)

未整理

  • ウィジェットの更新はshowLayout()にレイアウトとBundle[]を渡す
    • send系メソッドは差分更新に使用する
    • Bundle[]の設定内容はsend系メソッドのソースを見るのが早い
  • NotificationUtil.queryEvents()でeventIdを条件にする場合
    • NotificationUtil.EVENT_IDを使う(NotificationUtil.EVENT_ID + " = ?")
    • Notification.EventColumns._IDを使うと曖昧なSQLになり例外が投げられる
  • 通知項目の長押しと通知を開いている時のメニューキーでは同じメニューが出る

コメント

  • 標準のウィジェットで新規イベント(1x5)にWatchIT経由でメール送信者が表示できるのですが、送信者ではなく件名だけが表示されるウィジェットは可能でしょうか? -- 神アプリだね (2014-12-07 10:12:15)
  • 現在、Z1からZ5にスマホを切り替えたため、SW2が反応しなくなってしまいましたが、 -- 名無しさん (2015-12-02 14:34:16)
名前:
コメント: