Processingで無理やりAndroidWearのWatchFaceをつくる話

AppleWatchでましたね.

誰か買ってください.Androidユーザですが,欲しいです.

研究室で借りているAndroidWear.そういえばWatchFaceつくろうと思って先延ばしにしていた.

せっかくのゴールデンウィーク,組んでみますかね.

という一連の流れの成果報告.

覚えている限りで書く.何か不足があれば@3846masaへ.

ProcessingでWatchFaceを作る方法(非推奨)

注)ActivityをつかったWatchFaceは非推奨です.でも,これしかできなかった orz

前準備

  • AndroidModeを使えるようにしておく.

    • SDK4.4W.2(API20)も入れておく.
  • ${ANDROID_SDK}\extras\google\m2repository\com\google\android\support\wearable\1.0.0\wearable-1.0.0.aarをどこかにコピーする.

  • wearable-1.0.0.aarを展開して,R.txtclasses.jarを取り出す.

    • wearable-1.0.0.aar拡張子.zipに変えると展開しやすい.
  • classes.jarを展開する.

    • 同上.
  • R.txtR.javaに書き換える.

int attr circle_border_color 0x7f010005

これを,こうする.

package android.support.wearable;

public final class R {
  public static final class attr {
    public static final int circle_border_color = 0x7f010005;
    // anything
  }
  // anything
}
  • R.javaをjavacでコンパイルする.

  • 出力された .class ファイルをclasses\android\support\wearableの中に入れる.

  • classes内のファイルをzipに圧縮して,ファイル名をwatchface.jarとかにする.

  • AndroidModeで作ったプロジェクトにwatchface.jarをドロップする.

  • 一旦プロジェクトを保存して閉じる.

  • プロジェクトフォルダ内にあるAndroidManifest.xmlを以下に書き換える.

    • {ProjectName}には,プロジェクトの名前を入れる.
    • {lowerProjectName}には,プロジェクトの名前を小文字で入れる.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          android:versionCode="1"
          android:versionName="1.0"
          package="processing.test.{lowerProjectName}">
  <uses-sdk android:minSdkVersion="20"/>
  <uses-permission android:name="com.google.android.permission.PROVIDE_BACKGROUND"/>
  <uses-permission android:name="android.permission.WAKE_LOCK"/>
  <application android:debuggable="true"
               android:icon="@drawable/icon"
               android:label="{ProjectName}"
               android:screenOrientation="portrait">
    <activity android:allowEmbedded="true"
              android:name=".{ProjectName}">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="com.google.android.clockwork.home.category.HOME_BACKGROUND"/>
      </intent-filter>
    <meta-data android:name="com.google.android.clockwork.home.preview"
               android:resource="@drawable/icon"/>
    </activity>
  </application>
</manifest>
  • プロジェクトを開いて,下のコードを貼り付ける.
    • メインのコードとは分けて書いておくといいかも.
import android.support.wearable.view.WatchViewStub;
import android.view.Window;
import android.os.Bundle;

boolean isAmbient = false;

@Override
public void onCreate(Bundle b) {
  super.onCreate(b);
  
  Window window = getWindow();
  WatchViewStub stub = new WatchViewStub(this);
  window.setContentView(stub);
  stub.addView(surfaceView, sketchWidth(), sketchHeight());
  stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
    public void onLayoutInflated(WatchViewStub stub) {
    }
  });
}

@Override
protected void onStart() {
  super.onStart();
  isAmbient = false;
}

@Override
protected void onPause() {
  super.onPause();
  paused = false;
  handleMethods("resume");
  resume();
}

@Override
protected void onStop() {
  super.onStop();
  isAmbient = true;
}
  • あとは普通に書けばよい.

注意点

  • size()を利用してはならない.
    • 落ちます.
  • isAmbientで非アクティブモード(通称:Ambient Mode)を判定できます.
    • trueで非アクティブモード
  • 非アクティブモードでは,1分に1度しか再描画されない.
  • 通知がくると画面の下半分が隠れる.
    • 非アクティブモードでは,下半分を黒色にすることを推奨.
      • 非アクティブモードの通知は透過がされないので,通知の背景が一部黒色.
      • WatchFaceが黒色でないと,とてもダサくなる.
  • この方法は非推奨
    • ActivityをつかったWatchFaceは非推奨
    • PAppletはActivityを継承しているので,他の方法がわからない.
    • もしかしたらストアで販売できないかも?(わからない

とりあえず自分だけのWatchFaceをProcessingでつくれる.

WatchFaceModeでもつくろうかと思ったけど,いろいろ厳しかったので一旦断念.

また時間があれば挑戦するかも.