0

emacsでAndroidのAPIも入力補完する

それなりに補完してくれて便利。
ソースコードの静的解析もしてくれてるみたいで、キャストとかしてるとおかしくなるが、インスタンスの持ってるメソッドを引数付きで出してくれたりもする。


必要なものをインストール

homebrewのemacs23.4.1に、yasnippetauto-completeajc-java-completeyasnippet-java-modeを入れる。


Androidのクラスを入力補完できるようにする


ajc-java-completeのTagファイルにAndroidのjarも突っ込めばおk
git clone git://github.com/jixiuf/ajc-java-complete.git
cd ajc-java-complete
javac Tags.java

CLASSPATHが通っている所jarを読んでくれるので、Android4.1とGoogle APIにもpathを通す。
export CLASSPATH=/usr/local/var/lib/android-sdk/add-ons/addon-google_apis-google-16/libs/:/usr/local/var/lib/android-sdk/platforms/android-16/android.jar:/System/Library/Frameworks/JavaVM.framework/Classes/classes.jar:$CLASSPATH
java Tags

~/.java_base.tag ができる。 ~/.emacs.d/ajc.tag に移動させた。
(require 'ajc-java-complete-config)
(set 'ajc-tag-file "~/.emacs.d/ajc.tag")
(add-hook 'java-mode-hook 'ajc-java-complete-mode)
emacsに読み込ませて完成。


jarを探すのはMacならmdfind使うと速いと思う。
mdfind android.jar
mdfind maps.jar
とかすればすぐ出てくる。


いろんな所からもらってきたelispやらがごっちゃになってるけど、ここに.emacs以下置いてある
https://github.com/shokai/mac-dot-emacs

参考:Android開発にも役立つEmacsの補完プラグイン – ajc-java-complete – Clouder::Blogger

0

Android開発環境をインストールしなおした

Macbook Air(Mountain Lion)にAndroid関係を入れなおした。
手順が多くてややこしい。

  • Android SDKをhomebrewでインストールした
  • Eclipse4.2入れた

Android SDKインストール

http://developer.android.com/sdk/index.htmlと同じ最新バージョンが確かめる。
brew info android
brew install android
which android
androidコマンドが使えるようになる。/usr/local/bin/androidにインストールされた。


各Androidバージョン毎のPlatform SDKをインストールする

(山ライオンにJavaが入ってなかったので、この時にインストールされた)
android
GUIが起動する。
必要なものだけインストールする。4.1と2.3.3をいれた。2.3.3の中には各メーカーの端末用のSDKがあるけど必要ないのでチェックはずした。


Androidアプリを作ってみる

せっかくだからちゃんとSDKがインストールできているか確かめる。
android list
どのバージョンのAndroid用のアプリを作るか、listで出てくるのでidをメモしておく


プロジェクト作ってビルドする
android create project --target 3 --name TestApp --path `pwd` --activity 'Test' --package org.shokai.testapp
android update project --path `pwd`
ant debug
–target 3だが、SDK Version3ではなくlistにあった id: 3 or “android-10″のこと。


Android接続して
adb install -r bin/TestApp-debug.apk
これでAndroidにTestというアプリがインストールされてる。

res/layout/main.xmlの中の”Hello World”とかの文字列変更してみたりするとよい


Eclipseインストール

いいかげんworkspaceという概念が古臭いので使いたくないけど、Javaのクラス階層が深すぎて仕方なくインストールする。

Eclipse 4.2 JUNOを入れた。
http://www.eclipse.org/downloads/


ダウンロードしたtar.gzをダブルクリックで解凍すると、Android SDKをインストールできずにエラーがでるので、Terminalで解凍しなければならない。
Cannot complete the request. This installation has not been configured properly for Software Updates.

cd ~/Downloads
tar -zxvf eclipse-SDK-4.2-macosx-cocoa-x86_64.tar.gz
mv eclipse /Applications/
open /Applications/eclipse
Eclipse.appを起動。


EclipseにAndroid Developer Toolsインストール


[Help]->[Install New Software]
Works with: に https://dl-ssl.google.com/android/eclipse/ を書いてadd。
Developer Toolsをインストールする。


Eclipseを再起動する。


homebrewで入れたAndroid SDKへのパスを設定する
[Eclipse]->[環境設定]->[Android]
SDK Location: /usr/local/Cellar/android-sdk/r18


あと、[Eclipse]->[環境設定]->[Java]->[Code Style]->[Formatter]で、
Tab plicyをSpaces onlyにすると良いと思います。

0

ORF2011で実世界コピペ、実世界ユーザインタフェース等を展示した

昨日まで東京ミッドタウンで開催していたSFC ORF2011の増井研でデモしていました。


■実世界コピペ
実世界コピペはAndroidとNFCタグを使ってコピペできるアプリなのですが、これはAndroid側のアプリは全てJavaScriptで書かれています




■GoldFish
GoldFishというプラットフォームを自作していて、これを使うとJavaなしでJavaScriptだけでアプリが書けて、しかも端末にインストールする必要がなくなります。(今学校のサーバーが落ちていて見れないがそのうち復活するはず)

先週書いたAndroidとNFCで研究室の鍵を開けるシステムもGoldFish上で実装されているし、他にも置く場所によって自動的にAndroidがパソコンを操作するタッチパッドになったり、写真立てになったりするデモをしました。


GoldFishは、実世界志向なユーザインタフェースを作る時によくある5つの機能を簡単にJavaScriptだけで扱えます。

  • 操作する物体や機器の指定をタッチで直接指示する … GUIでは名前を入力するかアイコンをクリックしていた
  • ジェスチャーで操作する … 大量のボタンは必要なく、画面を見る必要もない
  • 状況によってインタフェースが変わる … タグによって起動するアプリを切り替えられる、またGoldFishアプリ内からもタグの情報が読める
  • 使用者によってコンテンツが切り替わる … 安全な方法で端末IDを生成しているので、ユーザ名を入れたりする事なくユニークユーザを検出できる。居間のTVで見ていたビデオを台所の小型モニタで継続する等も簡単。
  • 他のアプリと通信する … 中身がWebブラウザなのでAjaxは使えるのは勿論だが、普通のTCPやUDP SocketもwebsocketっぽいAPIで簡単に使える。TCPでチャットを実装した例
Javaを書かなければ使えなかった機能をラップしてJavaScriptから使えるようにしています。



■他のGoldFishアプリ
MacとUDPで通信して操作できるタッチパッドが86行で書けたり(ソースコード




空中マウスが62行ぐらいで書けたりする。(ソースコード



空中マウスは操作が難しくてボツになりました。でもこういうのを実験的に作る時に、イチからAndroidアプリを書くのと比べて全然楽に実装できます。プロトタイピングにも向いている。


研究室のドアの鍵開ける奴も、ほとんどプログラム書いたこと無い後輩にサンプル見せて、作ってよーって頼んだら1日でできてしまったので、それなりに使いやすいんじゃないかなと思います。setIntervalで50msecごとにジャイロスコープを監視して、+90度以上回ったらドアを開けるだけだし。

0

AndroidとNFCで研究室の鍵を開けるシステムができた

先週、後輩のN園が作ってくれました。


  1. AndroidでNFCタグを読むと鍵開けアプリが起動
  2. ジェスチャー入力をSinatraで書かれたドアサーバーに伝える
  3. ドアサーバーはPhidgetsのサーボモーターを駆動し、鍵をヒモで引っ張って開ける

最近はAndroidでNFCタグを読むとタグ毎のwebアプリが起動し、しかもPhoneGapみたいにJavaとJavaScriptのブリッジが書かれているのでセンサーが使えるというシステムを作っている。
6月にNHKのITホワイトボックスでデモした奴の発展版で、GoldFishという開発コードで呼んでいる。


こんなメリットがある
  • HTMLとJS(と必要あればwebアプリ)が書ければアプリを作れる環境
  • 実世界の物体を指し示して、「アレをコレに」とか操作できる
  • GUIだけではなくジェスチャーも入力できる
  • 状況によってインタフェースが変化する
  • 誰が使っているかによって内容が変化させられる

1

IOIO for Androidのアナログ入出力を試した

IOIOの10bit ADコンバータと10kHz PWM出力を試した。

今回のコード https://github.com/shokai/android-ioio-study/tree/master/AnalogInOut


Androidの画面上のシークバーを操作すると、PWMによる擬似的なアナログ出力でLEDの明るさを調整できる。
ブレッドボード上のCdSで明るさを計測して、Androidの画面上のシークバーの長さで表示したりした。
R0016190


動画




■準備
まず久しぶりに秋葉原に行ったら秋月が改装工事中だったので、他の店を見て回った。IOIOの開発者が使っているピンヘッダを千石で発見したので買った。

このピンヘッダ気に入った


このピンヘッダ、みっしりと敷き詰めるように装着できる。いつも使ってるメスピンヘッダは隣のピンにぶつかるので敷き詰められない。
ピンヘッダ装備IOIO

これでブレッドボードに線を引き出す準備が整いました


■回路を作る
ブレッドボードに5Vか3.3Vと、GNDを引き出す。
4番ピンでデジタル入力を試すために、タクトスイッチを通して5Vを流し込む。IOIO内部でGNDにプルダウンするので直結で良い。ただし、Read This Before Connectingに書いてある通り5Vを入れて良いピンは決まっているのでよくわからなかったらブレッドボードに出すのは3.3Vにしておいた方が良い。

3番ピンをLEDに接続する。PWMを試すため。

アナログ入力は40番ピン周辺に16個ある。45番ピンにCdSをつけ、10kΩで分圧した。

R0016189



■プログラムを書く
書いた。
AnalogInOutActivity.java

1からAndroidプロジェクトでIOIOを使う方法は前の記事を参考にされたし


このへんのドキュメント参考になる。



重要なのはAnalogInOutActivity.javaの49行目あたり
class IOIOThread extends AbstractIOIOActivity.IOIOThread{
private DigitalOutput led;
private DigitalInput btn;
private PwmOutput pwm;
private AnalogInput ain;
protected void setup() throws ConnectionLostException{
led = this.ioio_.openDigitalOutput(0, true);
btn = this.ioio_.openDigitalInput(4, Mode.PULL_DOWN);
pwm = this.ioio_.openPwmOutput(3, 1000); // 1000hz
ain = this.ioio_.openAnalogInput(45);
}

protected void loop() throws ConnectionLostException{
try{
led.write(!btnLed.isChecked());
if(btn.read()) seekBarDigitalIn.setProgress(1);
else seekBarDigitalIn.setProgress(0);
pwm.setDutyCycle((float)seekBarPwm.getProgress() / seekBarPwm.getMax());
seekBarAnalogIn.setProgress((int) (ain.read() * seekBarAnalogIn.getMax()));
sleep(10);
} catch (InterruptedException e) {
}
}
}

DigitalInputはMode.PULL_DOWNにしておく。PwmOutputは1kHzに設定した(最大10kHz)
PWMもAnlogInputも、0〜1の間のfloat値で入出力値を扱う。Androidの画面のSeekBarは最大値を1000にしておいたので、IOIO上での値を1000倍してintにcastすればSeekBarに表示できる。


デジタル入力の状態をAndroidの画面上に表示する時、IOIOThreadからUI Threadを操作するとデッドロックが起きてアプリが停止するが、なぜかSeekBarはデッドロックが起きないので長さ1の小さなSeekBarを作ってデジタル値を表現するように工夫した。

ほんとうは「android.os.Handlerクラスのpost()を使え」、とyoggyさんが言っていたので今度やってみます。