(2011-02の一覧)
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

2011-02-17 Thu (他の年の同じ日: 2005 2006)

ボリューム変更ハードキーのハンドリング
2011-02-17-2 / カテゴリ: [Android] / [permlink]

動作確認用アプリなんかで手抜きをしたい^a^k上下スクロールとかズームイン/アウトなんかにキー操作を割り当てしたい場合に。
標準だと「押す:ボリューム変更&UI表示 / 離す:通知音を鳴らす」という動作のため、KEYCODE_VOLUME_UPとKEYCODE_VOLUME_DOWNの両方をフックする必要がある。

というわけで、こんな感じ。
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
	switch (event.getAction()) {
	case KeyEvent.ACTION_DOWN:
		switch (event.getKeyCode()) {
		case KeyEvent.KEYCODE_VOLUME_UP:
			// ここにボリュームupが押されたときに走らせたい処理
			return true;
			
		case KeyEvent.KEYCODE_VOLUME_DOWN:
			// ここにボリュームdownが押されたときに走らせたい処理
			return true;
			
		default:
			break;
		}
		break;
		
	case KeyEvent.ACTION_UP:
		switch (event.getKeyCode()) {
		case KeyEvent.KEYCODE_VOLUME_UP:
		case KeyEvent.KEYCODE_VOLUME_DOWN:
			// キーが離された場合はイベントを捨てる
			return true;
		default:
			break;
		}
		break;
		
	default:
		break;
	}
	return super.dispatchKeyEvent(event);
}

Androidでキー長押しはACTION_DOWNがコールバックされまくるんだな。

参考
キーイベントに応答するには - 逆引きAndroid入門
ハードキーフックの方法 - 明日の鍵

find|xargsでスペース込みのパスが有る場合
2011-02-17-1 / カテゴリ: [linux][command] / [permlink]

$ find path [opt] -print0 | xargs -0 command
でGo

これで、findの結果が\0区切りになり、xargsのデリミタの扱いが\0になる。
http://linuxjm.sourceforge.jp/html/GNU_findutils/man1/xargs.1.html

例: "a b.txt" がある場合
zaki@salva% find . -name "*txt"                                    [~/tmp/path]
./a b.txt
./a.txt
./b.txt
./sub/a b.txt
./sub/a.txt
./sub/b.txt
こんなディレクトリ構成の場合("a b.txt"がある)
zaki@salva% find . -name "*txt" | xargs file                       [~/tmp/path]
./a:         ERROR: cannot open `./a' (No such file or directory)
b.txt:       empty
./a.txt:     empty
./b.txt:     empty
./sub/a:     ERROR: cannot open `./sub/a' (No such file or directory)
b.txt:       empty
./sub/a.txt: empty
./sub/b.txt: empty
"a"とか"b.txt"なんかねーよといわれる。

これは、findの結果が改行区切りで出力されるためで、更にxargsが改行とスペースを区切りとみなしているため。
zaki@salva% find . -name "*txt" | od -c                            [~/tmp/path]
0000000   .   /   a       b   .   t   x   t  \n   .   /   a   .   t   x
0000020   t  \n   .   /   b   .   t   x   t  \n   .   /   s   u   b   /
0000040   a       b   .   t   x   t  \n   .   /   s   u   b   /   a   .
0000060   t   x   t  \n   .   /   s   u   b   /   b   .   t   x   t  \n
0000100
んで、-print0を付加してやると
zaki@salva% find . -name "*txt" -print0 | od -c                    [~/tmp/path]
0000000   .   /   a       b   .   t   x   t  \0   .   /   a   .   t   x
0000020   t  \0   .   /   b   .   t   x   t  \0   .   /   s   u   b   /
0000040   a       b   .   t   x   t  \0   .   /   s   u   b   /   a   .
0000060   t   x   t  \0   .   /   s   u   b   /   b   .   t   x   t  \0
0000100
区切りが\0に変わる。

で、xargs -0 で本来「スペース/改行区切りで」ファイル名を拾う動作が、\0区切りになる、と。
zaki@salva% find . -name "*txt" -print0 | xargs -0 file            [~/tmp/path]
./a b.txt:     empty
./a.txt:       empty
./b.txt:       empty
./sub/a b.txt: empty
./sub/a.txt:   empty
./sub/b.txt:   empty

そもそもスペース込みのファイル名やディレクトリ名をつけるな、という話。

xargs(1)
find(1)
前の日 / 次の日 / 最新 / 2011-02

2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2013-05-02 16:12