INSTALL_FAILED_INSUFFICIENT_STORAGE

Android4.0のエミュレータで開発をしていたら突然以下の例外が発生しました。

Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE
Please check logcat output for more details.
Launch canceled!

Logcatを見ても良く分からない。
Google先生に聞いてみると、皆さん困っている様子だけど、やっぱり原因が良く分からない。解決方法も、エミュレータ起動時のオプションに

-partition-size 1024

を付けたら直ったとか、作成中のアプリケーションをアンインストールしたら直ったとか様々で、解決方法も良く分からない。サイズの大きなアプリケーションを作っているわけではないので、容量が足りないということもなさそう。
色々試してみた結果、私の場合は、AVDを作り直して、デフォルトでインストールされているアプリケーションを削除したら直りました(もしかしたらデフォルトアプリケーションの削除は関係ないかもしれない)。
一応、直ったけど、原因が良く分かりません。

Macでslコマンド

MacOSX(Lion)でもslコマンドが実行できます。slコマンドは、lsコマンドをミスって、slと打った時に出てくるジョークコマンドです。もちろん標準では入ってないので、以下のような感じでインストールします。

$ curl -O http://www.tkl.iis.u-tokyo.ac.jp/%7Etoyoda/sl/sl.tar
$ tar xvf sl.tar
$ cd sl
$ make
$ sudo cp -p sl /usr/local/bin/

これで、

$ sl

とすると、こんな感じで実行されます。
f:id:chitans:20111203234744p:image
一度実行されるとCTRL+C等で中断することはできませんので、通過するまで待たなければいけません。忙しいときこそ和みます。

Android4.0でCursor使用時に例外が発生する

Android4.0で、カーソルを使用しているActivityAからActivityBに遷移して、ハードウェアの戻るボタンでActivityAに戻ったとき以下の例外が発生しました。

java.lang.RuntimeException: Unable to resume activity
java.lang.IllegalStateException: trying to requery an already closed cursor

ActivityAで、

startManagingCursor(cursor);

としていると、カーソルの管理をAndroidに委譲できるが、これが原因となっているようです。ドキュメントを見ると確かにstartManagingCursor(cursor)は、deprecatedとなっていました。

startManagingCursor(cursor)

ドキュメントには、CursorLoader()を使えと書いてありますが、カーソルの管理をAndroidに委譲していたから、例外が発生しているので、素直に自前で管理してあげれば良いようです。なので、onDestroy()で

cursor.close();

としてやると解決しました。

「はてなブログ」はじめました。

TwitterFacebook等を利用していますが、まとまった文章を書く場所がないので、はてなブログのアカウントを取ってみました。 

仕事のことから興味を持ったことやプライベートなことまでジャンルを問わず書いていきたいと思いますので、よろしくお願いします。