OSX MavericksでSynergyが動かなくなったときの対策の要点だけ
OSX LionからOSX Marvericksにアップデートしたところ、Synergy(サーバ)の起動でエラーが起きるようになって、対策を調べたメモです。Synergy 1.4.14 OSX版で確認しました。 (1.4.14は10.8(Mountain Lion)用と書いてあるので、そのうちMarvericks版が出ると思うのでdonateして応援すると良い。)
OSX LionからOSX Marvericksにアップデートしたところ、Synergy(サーバ)の起動でエラーが起きるようになって、対策を調べたメモです。Synergy 1.4.14 OSX版で確認しました。 (1.4.14は10.8(Mountain Lion)用と書いてあるので、そのうちMarvericks版が出ると思うのでdonateして応援すると良い。)
OSXのHomebrew環境をbrew updateして最新版0.9.5にしたら変な現象に遭遇したので対応まとめ。とはいえアップデートが原因なのか一般的な解なのかはよくわかりません。
HomebrewでPython3を入れようとした時にpkg-configがSHA1 errorというのを吐いてうまくインストールできないという現象に遭遇した。 エラーメッセージにはCache配下の該当ファイルを消せとあったので、消して何度か試したけれど同じ結果だった。 結果、以下の操作で解消。 brew update manページによるとhomebrewそのものの最新バージョンをとってくるとのこと。
Android SDK Toolsをrev.21にアップデートしたら、アプリのビルドが出来なくなった。
OSXでAutomatorを使うと、apkファイルを右クリックで直接インストールできることが判った。以下やり方です。 Automatorを開く。 「新規」で「サービス」を作成間違ったらファイル>変換…をすればOK。 「アクション>ユーティリティ>Run Shell Script」を右ペインにドラッグ 「入力の引き渡し方法」を「引数として」に変更これでファイルのパスが$@に入ってくる。 スクリプトを入力。PATH_TO_ADBは環境に合わせてフルパスを書きます。 ワークフロー最初の「”サービス”は、次の選択項目を受け取ります」の部分を「ファイルまたはフォルダ」に変更 適当なファイル名で保存 とりあえず以上でAutomatorでサービスの作成は終わり。スクリプトはAppleScriptで好きなGUIを付けたりしたほうが良いと思う。次は作成したサービスを右クリックに関連づける。 Finder>サービス>サービス環境設定…「システム環境設定>キーボード>キーボードショートカット>サービス」が開きます。なんでキーボードなんだろ。 サービスの「ファイルとフォルダ」というグループの中に、さきほど保存したサービスの名前が出てくるので、チェックを入れる。 以上で、Finderからファイルを右クリックするとapkファイルを直接インストールすることができます。これは色々応用できそう。
UnityでJavaを使ったAndroidプラグインの作り方について、いまいちまとまった情報がないので、要点のみまとめ。あとで追記とかはするかもしれない。 とりあえず2つのケースを想定すれば良いと思う。 Androidとは関係なく単純にJavaクラスをUnityスクリプトから利用したい場合例えば何かのパーサだったりとか、手持ちの便利ライブラリがJavaであるとか。これはAssets/Plugins/Androidに該当の.jarファイルを置けばOK(.dexでなく.classで良い)。その上で、Assets/Pluginsとかに置いたスクリプトから、new AndroidJavaClass(“Javaクラス名”)とかnew AndroidJavaObject(“Javaクラス名”)とかすればOK。それぞれJavaのクラス型およびインスタンス型に対応し、そこからメソッドを呼ぶ事ができる。(詳細はUnityのリファレンスを見ると良い。インスタンス変数、メンバ変数の取得、クラスメソッド、インスタンスメソッドなど行うことができる) Pluginを通じてAndroid OSの機能を利用する場合Android OSの色んな機能を使うときにはContextオブジェクトを使う訳だけど、これはUnityアプリの場合、ランタイムであるUnityPlayerActivityが持っていることになるので、まずはプラグインのJavaクラスをUnityPlayerActivityを継承したActivityにする必要がある。class MyUnityPlayerActivity extends UnityPlayerAcitvityこんな感じ。この中のメソッドは普通のAndroidJavaクラスとして作れば良い。 その上で、Unityアプリの起動クラスをこのUnityPlayerActivityを継承したMyUnityPlayerActivityにする必要がある。これはAndroidManifest.xmlファイルのカスタマイズのやり方を使う。つまり.jarファイルと同様に、Assets/Plugins/Androidのフォルダに、MyUnityPlayerActivityクラスを起動Activityに設定したAndroidManifest.xmlファイルを置く。そうするとAndroidバイナリのビルド時にこちらを使うようになってくれる。ちなみにUnityのPlayer Settingsで設定したアプリアイコンを使うには、android:iconを@drawable/app_iconに変更する必要があることに注意。 尚、このAndroidManifest.xmlを置き換えるやり方は独自のpermissionやActivityを追加したりするときにも使う。 あとは1と同様にAndroidJavaClassおよびAndroidObjectを利用してプラグインを利用するスクリプトを書けば良い。独自の注意として、Activityは直接newできないのでMyUnityPlayerActivityにpublic static な MyUnityPlayerActivityを変数として持っておいて(onCreate時にMyUnityPlayerActivity.instance = thisとかやる)、そのうえでUnityスクリプト側からaAndroidJavaClass.GetStatic<AndroidJavaObject>(“instance”)みたいにすればActivityインスタンスを直接取ることができる。 尚、Unity 3.5を前提に書いています。もし間違い等あれば指摘してください。
Androidアプリの開発でEclipseを使っていて、Eclipseの起動時に”Initializing Java Tooling”でエラーになるとか、謎のエラーに悩まされたのでその対策メモ。 環境はOSX Snow Leopard + Eclipse(Indigo)。 このエラーを消すには、Eclipseをいったん終了後、workspaceのルートにある.metadataディレクトリを消す。 その上で、Eclipseを再起動すれば良い。 そうするとProjectはワースクペースから消えてるので、インポートし直す必要はある。 それか新規にworkspacewを作るでもOKですね。
PackageManager#queryIntentActivities (Intent intent, int flags) を利用すればOK。flagはPackageManagerの定数。
Androidのライブ壁紙でタッチイベントを取得して、何かエフェクトをかけたり、動作をさせたりしたいときのやりかた。 端的には、WallpaperService.EngineのonTouchEvent(MotionEvent event)またはonCommand(String action, int x, int y, int z, Bundle extras, boolean resultRequested)いずれかをオーバーライドすれば良い。 大きな違いとして、onTouchEventは、アプリのアイコンをタッチしたときなんかもイベントが発生してしまうのに対して、onCommandは、HOME画面中何もないところをタッチしたときだけにイベントが発生する(actionのところに”android.wallpaper.tap”というのが来て、x, yで座標が分かる)。これはHOMEアプリから発行されるイベントのようで、デフォルトのHOMEアプリ利用時に発生しないというような記述をどこかで見かけたけど、これは未確認。 なお、ライブ壁紙上の操作から何かしらIntentを発生させたい時は、通常どおり新規のIntentを作成してContext#startActivity()してやれば良いが、IntentにIntent#setFlag(Intnet.FLAG_ACTIVITY_NEW_TASK)をしてやる必要がある。これをしないとExceptionが発生するよう。