Androidの画像保存をやってみた

Androidで画像を端末に保存したときにやったこととはまったこと。
String型で『data:image/jpeg;base64,・・・』という生データを端末のギャラリーで見えるようにするまで。

保存場所を決める

/sdcard/ やら /mnt/sdcard/ 以下に保存するらしい。
例えば、/mnt/sdcard/MyApp/20120130210000.jpg みたいな感じ。

  1. SDカードがマウントされていれば、画像を保存するディレクトリを取得します。
  2. ディレクトリがまだなければ作ります。
  3. もし、SDカードがマウントされていなければ使用できるディレクトリを探します。
  4. ディレクトリが決まったら、ディレクトリのパス情報を元にファイル名を足して保存場所を決定します。

また、SDカードへの書き込みにはマニフェストで許可してあげる必要があります。
AndroidManifest.xmlに追記します。

画像データを書き込み可能なフォーマットに変換する

Androidの画像保存では、画像データをBitmapオブジェクトに変換する必要があります。

  1. データの先頭についている『data:image/jpeg;base64,』を取ります。
  2. Base64でデコードします。
  3. Bitmapオブジェクトに変換します。

Base64はAndroidSDKに入ってるのでそれを使います。
ここで、1と2をしなければいけないことに気づかず結構はまりました。
参考. http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46376&forum=12

保存する

ここまでできればあとは保存するだけです。
ただし、Androidは画像を保存しただけではギャラリーでみれないらしく、別途ギャラリーへの登録処理が必要です。

これで端末に画像を保存して、見れるようになります。

参考.

http://goo.gl/yiE6m

http://dividebyzero-ksz.blogspot.com/2010/11/sd.html

エラーハンドリングがお粗末なのはすいません。

おわり。

Pocket

Posted in Android.

weinreでスマートフォンをデバッグする

スマートフォンアプリ開発時のデバッグは大変。
iOSならXcodeのconsole log、AndroidならEclipseのLogCat。
JavaScriptで開発していると、エラーの内容とかがほんと微々たる情報しかでないのでカオスです。

そこで、ブラウザからスマートフォンのリモートデバッグができる「weinre」がとても便利!

スマートフォンブラウザのWebInspectorをリモートで実現するweinreが凄い
スマホの開発が超絶楽に! weinreでスマートフォンをPCでリモートデバッグ!

ダウンロード

アプリ版があるけどアプリは動作確認できなかったので、今回はjarファイルを実行する形式で。
http://phonegap.github.com/weinre/Installing.html

実行

ダウンロードしたファイルを伸張して、フォルダの中にあるweinre.jarを実行します。

実行できたら、weinre:HTTP server started atに載っているURLにブラウザでアクセスします。
今回ならhttp://localhost:8080です。

タグの埋め込み

開いたページの「Target Script」に載っているURLのファイルを、アプリ(index.htmlなど)で読み込みます。
僕の環境ではhttp://localhost:8080/target/target-script-min.js#anonymousです。

コンソールを開いてデバッグ開始

以上で設定は終わりです。簡単。
あとは先ほどのhttp://localhost:8080ページの「Access Points」→「debug client user interface」に載っているURLを開くとデバッガにアクセスできます。
Consoleタブでalert(“Hello World”);ってするとアプリ上でダイアログボックスがでたりします。

詳しくは公式をみたりしてください。

おわり。

Pocket

Posted in Android, iPhone, JavaScript.

Cursorをcloseするタイミング

先日書いた「AndroidでSQLiteをつかう」にのせたコード(をベースにしたコード)をコードレビューしてもらった。
いろいろと指摘されたことをメモしておく。

主に改善点があるコード

改善点
・JSON文字列を作るにはJSONArrayとJSONObjectを使う。
・Cursor(に限らず)を閉じるというような処理は、finallyの中でやるのが鉄則。

改善後のコード

JSONArrayとJSONObjectはそういうのがあるんだなという感じでOK。

Cursorをcloseするタイミングに関しては「ほぉ」と思った。
僕はここ3年間ずっとPHPをやってきたが、PHPには「finally」は存在しない。なので「finally」の存在をすっかり忘れていた。

SQLiteDatabaseも同様のタイミング(finallyの中)でcloseすると間違いはない。
また try ~ catch まみれになるがJavaはそういうものらしいので気にしない。

参考 : カーソルが解放されるタイミング (2)

おわり。

Pocket

Posted in Android, Java.