ばいんのブログ http://blog.flaxia.net ウソじゃないよ,ジョークという名のユーモアだよ Tue, 31 Jan 2012 18:17:52 +0000 ja hourly 1 http://wordpress.org/?v=3.3.1 byobuのバックエンドをtmuxからscreenに変える方法 http://blog.flaxia.net/2012/02/01/byobu%e3%81%ae%e3%83%90%e3%83%83%e3%82%af%e3%82%a8%e3%83%b3%e3%83%89%e3%82%92tmux%e3%81%8b%e3%82%89screen%e3%81%ab%e5%a4%89%e3%81%88%e3%82%8b%e6%96%b9%e6%b3%95/ http://blog.flaxia.net/2012/02/01/byobu%e3%81%ae%e3%83%90%e3%83%83%e3%82%af%e3%82%a8%e3%83%b3%e3%83%89%e3%82%92tmux%e3%81%8b%e3%82%89screen%e3%81%ab%e5%a4%89%e3%81%88%e3%82%8b%e6%96%b9%e6%b3%95/#comments Tue, 31 Jan 2012 18:17:52 +0000 ばいん http://blog.flaxia.net/?p=144 byobuのバックエンドのデフォルトはずっとscreenだったと思うのですが,Debian wheezyでbyobuを起動してみたところ,バックエンドがtmuxに設定されていました.

tmuxベースの方がスッキリしているのは良いのですが,エスケープキーの設定が反映されなかったのでtmuxからscreenにバックエンドの変更を行いました.

~/.byobu/backendに

BYOBU_BACKEND=tmux

と書かれているので,これを

BYOBU_BACKEND=screen

に書き換えます.

以上です.

]]>
http://blog.flaxia.net/2012/02/01/byobu%e3%81%ae%e3%83%90%e3%83%83%e3%82%af%e3%82%a8%e3%83%b3%e3%83%89%e3%82%92tmux%e3%81%8b%e3%82%89screen%e3%81%ab%e5%a4%89%e3%81%88%e3%82%8b%e6%96%b9%e6%b3%95/feed/ 0
Debian wheezyでAndroidの実機を認識させる方法 http://blog.flaxia.net/2012/01/23/debian-wheezy%e3%81%a7android%e3%81%ae%e5%ae%9f%e6%a9%9f%e3%82%92%e8%aa%8d%e8%ad%98%e3%81%95%e3%81%9b%e3%82%8b%e6%96%b9%e6%b3%95/ http://blog.flaxia.net/2012/01/23/debian-wheezy%e3%81%a7android%e3%81%ae%e5%ae%9f%e6%a9%9f%e3%82%92%e8%aa%8d%e8%ad%98%e3%81%95%e3%81%9b%e3%82%8b%e6%96%b9%e6%b3%95/#comments Mon, 23 Jan 2012 14:59:57 +0000 ばいん http://blog.flaxia.net/?p=141 /lib/udev/rules.d/91-permissions.rules の

# usbfs-like devices
SUBSYSTEM==”usb”, ENV{DEVTYPE}==”usb_device”, \
MODE=”0664″

# usbfs-like devices
SUBSYSTEM==”usb”, ENV{DEVTYPE}==”usb_device”, \
MODE=”0666″

に変更

/etc/udev/rules.d/99-android.rules に
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0502", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0B05", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="413C", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0489", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="091E", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="18D1", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="109B", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0BB4", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="12D1", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="24E3", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="2116", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0482", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="17EF", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1004", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="22B8", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0409", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="2080", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0955", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="2257", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="10A9", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1D4D", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0471", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="04DA", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="05C6", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="1F53", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="04E8", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="04DD", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0FCE", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="2340", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0930", MODE="0666"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="19D2", MODE="0666"
こちらを参考にしました.
]]>
http://blog.flaxia.net/2012/01/23/debian-wheezy%e3%81%a7android%e3%81%ae%e5%ae%9f%e6%a9%9f%e3%82%92%e8%aa%8d%e8%ad%98%e3%81%95%e3%81%9b%e3%82%8b%e6%96%b9%e6%b3%95/feed/ 0
Ubuntu11.10,Eclipse3.7でAndroidプラグインをインストールする方法 http://blog.flaxia.net/2011/11/03/ubuntu11-10%ef%bc%8ceclipse3-7%e3%81%a7android%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/ http://blog.flaxia.net/2011/11/03/ubuntu11-10%ef%bc%8ceclipse3-7%e3%81%a7android%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/#comments Thu, 03 Nov 2011 06:41:37 +0000 ばいん http://blog.flaxia.net/?p=132

Cannot complete the install because one or more required items could not be found.
Software being installed: Android Development Tools 15.0.0.v201110251216-213216 (com.android.ide.eclipse.adt.feature.group 15.0.0.v201110251216-213216)
Missing requirement: Android Development Tools 15.0.0.v201110251216-213216 (com.android.ide.eclipse.adt.feature.group 15.0.0.v201110251216-213216) requires 'org.eclipse.wst.sse.core 0.0.0' but it could not be found

apt-get install eclipseとEclipseをインストールすると,このようなメッセージが表示され,ADTをインストールできないと思います.
ここからインストールする方法です.
僕はこうしたらできた,という方法なのでもっと良い方法があるかもしれませんし,間違っているかもしれません.

方法は簡単で,「https://dl-ssl.google.com/android/eclipse/」を追加したように,「http://download.eclipse.org/releases/indigo/」を追加するだけです.

これでもう一度Androidプラグインの追加を試みると,インストールすることができました.\

]]>
http://blog.flaxia.net/2011/11/03/ubuntu11-10%ef%bc%8ceclipse3-7%e3%81%a7android%e3%83%97%e3%83%a9%e3%82%b0%e3%82%a4%e3%83%b3%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/feed/ 3
sbtでライブラリを有効にする方法 http://blog.flaxia.net/2011/09/17/sbt%e3%81%a7%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aa%e3%82%92%e6%9c%89%e5%8a%b9%e3%81%ab%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/ http://blog.flaxia.net/2011/09/17/sbt%e3%81%a7%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aa%e3%82%92%e6%9c%89%e5%8a%b9%e3%81%ab%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/#comments Sat, 17 Sep 2011 06:46:03 +0000 ばいん http://blog.flaxia.net/?p=127 sbtは0.10を使用しています.
build.sbtに以下を書きます.
libraryDependencies ++= Seq(
  "net.databinder" %% "dispatch-http" % "0.8.5",
  "net.databinder" %% "dispatch-oauth" % "0.8.5"
)
0.8.5はdispatch-httpや,dispatch-oauthのバージョンを表しています.
今回,例として使用したDispatchはこちら
]]>
http://blog.flaxia.net/2011/09/17/sbt%e3%81%a7%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aa%e3%82%92%e6%9c%89%e5%8a%b9%e3%81%ab%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/feed/ 0
Ubuntuでnpmのインストールを行う http://blog.flaxia.net/2011/08/07/ubuntu%e3%81%a7npm%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%82%92%e8%a1%8c%e3%81%86/ http://blog.flaxia.net/2011/08/07/ubuntu%e3%81%a7npm%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%82%92%e8%a1%8c%e3%81%86/#comments Sat, 06 Aug 2011 18:01:12 +0000 ばいん http://blog.flaxia.net/?p=120 こちらの記事を参考に行いました.

$ sudo apt-get update
$ sudo apt-get install git-core curl build-essential openssl libssl-dev
$ git clone https://github.com/joyent/node.git && cd node
$ ./configure
$ make
$ sudo make install
$ node -v
$ cd
$ curl http://npmjs.org/install.sh | sudo sh

記事の通り上記を実行すると

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3927  100  3927    0     0   4348      0 --:--:-- --:--:-- --:--:-- 10121
fetching: http://registry.npmjs.org/npm/-/npm-1.0.22.tgz

node.js:63
    throw e;
    ^
Error: Cannot find module 'graceful-fs'
    at loadModule (node.js:275:15)
    at require (node.js:411:14)
    at Object.<anonymous> (/tmp/npm.5806/package/lib/utils/read-json.js:7:10)
    at Module._compile (node.js:462:23)
    at Module._loadScriptSync (node.js:469:10)
    at Module.loadSync (node.js:338:12)
    at loadModule (node.js:283:14)
    at require (node.js:411:14)
    at Object.<anonymous> (/tmp/npm.5806/package/bin/read-package-json.js:9:16)
    at Module._compile (node.js:462:23)
0.2.6
~~~中略

It failed

このようにインストールに失敗したので,僕がインストールに成功した方法を残します.

エラー出力にある通り,graceful-fsが必要なようです.
これはnodejsのv0.4.0以降に含まれるようです.しかし,今回は0.2.6を使用しています.
なので,これを0.4.0以降にすることにします.

$ sudo apt-get update
$ sudo apt-get install git-core curl build-essential openssl libssl-dev
$ git clone https://github.com/joyent/node.git && cd node
$ git checkout v0.5.3
$ ./configure
$ make
$ sudo make install
$ node -v
$ cd
$ curl http://npmjs.org/install.sh | sudo sh

git checkoutで使用するnodejsのバージョンを変更します.
もっと新しいバージョンが存在する場合はv0.5.3より新しいものにすると良いかもしれません.

これで無事,npmをインストールすることができます.

]]>
http://blog.flaxia.net/2011/08/07/ubuntu%e3%81%a7npm%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%82%92%e8%a1%8c%e3%81%86/feed/ 0
Macでjarsignerの文字化け対策 http://blog.flaxia.net/2011/08/05/mac%e3%81%a7jarsigner%e3%81%ae%e6%96%87%e5%ad%97%e5%8c%96%e3%81%91%e5%af%be%e7%ad%96/ http://blog.flaxia.net/2011/08/05/mac%e3%81%a7jarsigner%e3%81%ae%e6%96%87%e5%ad%97%e5%8c%96%e3%81%91%e5%af%be%e7%ad%96/#comments Fri, 05 Aug 2011 06:51:17 +0000 ばいん http://blog.flaxia.net/?p=113 Macに含まれるJavaは標準ではShift-JISを出力するようです.
そのためUTF-8のMacのターミナルで実行すると,このように日本語が文字化けします.

$ jarsigner -verify HelloWorld.apk
jar �����؂���܂����

ターミナルの文字コードをShift-JISにすることでも文字化けを解消できますが,これをするとJava以外の部分が文字化けしてしまいます.
Javaの実行時に文字コードを指定することにします.

$ jarsigner -J-Dfile.encoding=UTF-8 -verify HelloWorld.apk
jar が検証されました

毎回入力するのは面倒なのでこれをjarsignerにaliasすると良いと思います.

jarsigner -J-Dfile.encoding=UTF-8
]]>
http://blog.flaxia.net/2011/08/05/mac%e3%81%a7jarsigner%e3%81%ae%e6%96%87%e5%ad%97%e5%8c%96%e3%81%91%e5%af%be%e7%ad%96/feed/ 0
ScrollViewを一番下まで自動でスクロールする方法 http://blog.flaxia.net/2011/07/25/scrollview%e3%82%92%e4%b8%80%e7%95%aa%e4%b8%8b%e3%81%be%e3%81%a7%e8%87%aa%e5%8b%95%e3%81%a7%e3%82%b9%e3%82%af%e3%83%ad%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/ http://blog.flaxia.net/2011/07/25/scrollview%e3%82%92%e4%b8%80%e7%95%aa%e4%b8%8b%e3%81%be%e3%81%a7%e8%87%aa%e5%8b%95%e3%81%a7%e3%82%b9%e3%82%af%e3%83%ad%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/#comments Mon, 25 Jul 2011 01:47:40 +0000 ばいん http://blog.flaxia.net/?p=108 ScrollViewを一番下までスクロールするには,ScrollView内部のViewのサイズが変わってからスクロールさせる必要があります.
ScrollViewにOnLayoutChangeListenerをセットすることでこれを行うことができます.
以下のようにすることで,ScrollView内部のViewのサイズが変更されるたびに一番下までスクロールします.
例えば,ScrollViewの中にTextViewをセットしていたのなら,TextViewに対してappendを実行した場合などにイベントが発生します.
この場合,append→TextViewのサイズが変化→layoutChangeイベント発生→スクロールの順に処理が行われます.

final ScrollView scrollView = ((ScrollView) findViewById(R.id.logScroll));
scrollView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom,
            int oldLeft, int oldTop, int oldRight, int oldBottom) {
        scrollView.scrollTo(0, bottom);
    }
});
]]>
http://blog.flaxia.net/2011/07/25/scrollview%e3%82%92%e4%b8%80%e7%95%aa%e4%b8%8b%e3%81%be%e3%81%a7%e8%87%aa%e5%8b%95%e3%81%a7%e3%82%b9%e3%82%af%e3%83%ad%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/feed/ 0
自宅サーバにGitリポジトリを作る http://blog.flaxia.net/2011/05/23/%e8%87%aa%e5%ae%85%e3%82%b5%e3%83%bc%e3%83%90%e3%81%abgit%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e3%82%92%e4%bd%9c%e3%82%8b/ http://blog.flaxia.net/2011/05/23/%e8%87%aa%e5%ae%85%e3%82%b5%e3%83%bc%e3%83%90%e3%81%abgit%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e3%82%92%e4%bd%9c%e3%82%8b/#comments Mon, 23 May 2011 10:27:27 +0000 ばいん http://blog.flaxia.net/?p=39 サーバのOSはUbutnu 10.04です.
リポジトリは

/var/repos

とします.

ディレクトリを作ります.

$ sudo mkdir /var/repos

ディレクトリの所有者を変更します.

$sudo chown あなたのユーザ名:あなたのグループ名 /var/repos

必要なパッケージをインストールします.

$ sudo apt-get install git-core git-daemon-run

一旦サーバを停止します.

$ sudo sv stop git-daemon

サーバの開始します.

$ sudo /usr/lib/git-core/git-daemon –export-all –enable=receive-pack –base-path=/var/repos &

サーバにリポジトリを作ります.

$ cd /var/repos
$ git clone –bare Hoge.git
$ touch Hoge.git/git-daemon-export-ok

クライアント

$ git clone git://ドメイン名/Hoge.git

]]>
http://blog.flaxia.net/2011/05/23/%e8%87%aa%e5%ae%85%e3%82%b5%e3%83%bc%e3%83%90%e3%81%abgit%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e3%82%92%e4%bd%9c%e3%82%8b/feed/ 0
Sony Ericsson “Create Now Tour 2011″ in NAGOYAに参加しました http://blog.flaxia.net/2011/04/24/sony-ericsson-create-now-tour-2011-in-nagoya%e3%81%ab%e5%8f%82%e5%8a%a0%e3%81%97%e3%81%be%e3%81%97%e3%81%9f/ http://blog.flaxia.net/2011/04/24/sony-ericsson-create-now-tour-2011-in-nagoya%e3%81%ab%e5%8f%82%e5%8a%a0%e3%81%97%e3%81%be%e3%81%97%e3%81%9f/#comments Sun, 24 Apr 2011 00:57:59 +0000 ばいん http://blog.flaxia.net/?p=35 Xperia arcのイベントに参加しました.
と言っても,arcは既に発売済なうえに,イベントから既に一週間以上経過しちゃっていますが,参加したので軽く書きます.

arcを触ってとにかくすごいと思ったのが動作速度.
僕のCM7をインストールしてあるNexus Oneよりもヌルヌル動いていました.
自作のアプリでJSONのパースをさせてみましたが,Nexus Oneよりも圧倒的に高速でした.
新しい世代のCPUの力でしょうかね.

それと,Timescapeのプラグイン開発を可能としてくれたことに驚きました.
http://developer.sonyericsson.com/wportal/devworld/technology/android/timescapeextensions/overview?cc=gb&lc=en
プラグイン開発を少し試してみたところ,サンプルが付属していることもあり,それほど難しくはない感じでした.

逆に残念だったことは,電源ボタンが小さくなって押しにくかったことです.
イヤホン端子は自分は使わないと思いますけど,できれば上についていて欲しかったです.

物理キーの配置が旧Xperiaと違うのはAndroid3.0のボタンの配置に合わせたからだそうです.
Androidはボタンの配置がバラバラなので,他のメーカーも3.0の配置に合わせていってくれると嬉しいです.

arc欲しい.

]]>
http://blog.flaxia.net/2011/04/24/sony-ericsson-create-now-tour-2011-in-nagoya%e3%81%ab%e5%8f%82%e5%8a%a0%e3%81%97%e3%81%be%e3%81%97%e3%81%9f/feed/ 0
Androidでディレクトリ選択プリファレンスを使う http://blog.flaxia.net/2011/03/27/android%e3%81%a7%e3%83%87%e3%82%a3%e3%83%ac%e3%82%af%e3%83%88%e3%83%aa%e9%81%b8%e6%8a%9e%e3%83%97%e3%83%aa%e3%83%95%e3%82%a1%e3%83%ac%e3%83%b3%e3%82%b9%e3%82%92%e4%bd%bf%e3%81%86/ http://blog.flaxia.net/2011/03/27/android%e3%81%a7%e3%83%87%e3%82%a3%e3%83%ac%e3%82%af%e3%83%88%e3%83%aa%e9%81%b8%e6%8a%9e%e3%83%97%e3%83%aa%e3%83%95%e3%82%a1%e3%83%ac%e3%83%b3%e3%82%b9%e3%82%92%e4%bd%bf%e3%81%86/#comments Sun, 27 Mar 2011 11:14:52 +0000 ばいん http://blog.flaxia.net/?p=28 理ろぐさんの記事を参考に作りました. http://relog.xii.jp/archives/2010/09/android_1.html


DirectorySelectDialog.java

package net.flaxia.android.githubviewer;

import java.io.File;
import java.util.ArrayList;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;

public class DirectorySelectDialog extends Activity implements DialogInterface.OnClickListener {
    private Context mContext;
    private ArrayList<File> mDirectoryList;
    private onDirectoryListDialogListener mListenner;

    public DirectorySelectDialog(Context context) {
        mContext = context;
        mDirectoryList = new ArrayList<File>();
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        if ((null != mDirectoryList) && (null != mListenner)) {
            File file = mDirectoryList.get(which);
            show(file.getAbsolutePath(), file.getPath());
        }
    }

    public void show(final String path, String title) {
        try {
            File[] mDirectories = new File(path).listFiles();
            if (null == mDirectories && null != mListenner) {
                mListenner.onClickFileList(null);
            } else {
                mDirectoryList.clear();
                ArrayList<String> viewList = new ArrayList<String>();
                for (File file : mDirectories) {
                    if (file.isDirectory()) {
                        viewList.add(file.getName() + "/");
                        mDirectoryList.add(file);
                    }
                }

                // ダイアログ表示
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mContext);
                alertDialogBuilder.setTitle(title);
                alertDialogBuilder.setItems(viewList.toArray(new String[0]), this);
                // 自身のContextではgetStringが失敗する
                alertDialogBuilder.setPositiveButton(mContext.getString(R.string.ok),
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                System.out.println(path);
                                mListenner.onClickFileList(path);
                            }
                        });
                // 自身のContextではgetStringが失敗する
                alertDialogBuilder.setNegativeButton(mContext.getString(R.string.cancel),
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                mListenner.onClickFileList(null);
                            }
                        });
                alertDialogBuilder.show();
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }

    public void setOnFileListDialogListener(onDirectoryListDialogListener listener) {
        mListenner = listener;
    }

    public interface onDirectoryListDialogListener {
        public void onClickFileList(String path);
    }
}

DirectorySelectDialogPreference.java

package net.flaxia.android.githubviewer;

import java.io.File;

import net.flaxia.android.githubviewer.DirectorySelectDialog.onDirectoryListDialogListener;
import net.flaxia.android.githubviewer.util.Configuration;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Environment;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.View;

public class DirectorySelectDialogPreference extends DialogPreference implements
        DirectorySelectDialog.onDirectoryListDialogListener {

    public DirectorySelectDialogPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onBindView(View view) {
        SharedPreferences pref = getSharedPreferences();
        String summry = Configuration.DEFAULT_SAVE_PATH;
        if (null != pref) {
            summry = pref.getString(getKey(), summry);
        }
        setSummary(summry);
        super.onBindView(view);
    }

    @Override
    protected void onClick() {
        File externalStorage = Environment.getExternalStorageDirectory();
        DirectorySelectDialog dlg = new DirectorySelectDialog(getContext());
        dlg.setOnFileListDialogListener((onDirectoryListDialogListener) this);
        dlg.show(externalStorage.getAbsolutePath(), externalStorage.getPath());
    }

    @Override
    public void onClickFileList(String path) {
        if (null != path) {
            SharedPreferences.Editor editor = getEditor();
            editor.putString(getKey(), path);
            editor.commit();
            notifyChanged();
        }
    }
}

このように使います.

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <net.flaxia.android.githubviewer.DirectorySelectDialogPreference
        android:key="saveDir" android:title="@string/directory_location_to_store" />
</PreferenceScreen>
]]>
http://blog.flaxia.net/2011/03/27/android%e3%81%a7%e3%83%87%e3%82%a3%e3%83%ac%e3%82%af%e3%83%88%e3%83%aa%e9%81%b8%e6%8a%9e%e3%83%97%e3%83%aa%e3%83%95%e3%82%a1%e3%83%ac%e3%83%b3%e3%82%b9%e3%82%92%e4%bd%bf%e3%81%86/feed/ 0