2012/04/24

Intentを使いギャラリーで画像を表示する

トラノマキでSDカード内に配置された画像を表示するだけビューがあります。これは何の変哲もないImageViewで、表示する以外の機能は無いのですが、ユーザーが画像を拡大して見たくなる場合もあるだろうと考え、他の画像ビューア(ギャラリー等)にインテントを投げるという実装を試みました。

有名なファイルマネージャ『アストロビューア』で画像ファイル名をクリックしたときのあの動作です。

ところがこういったサンプルがありそうでなかなか見つからず(調べ方が悪いのか需要が無いのか)おかげで3日くらい苦しみましたが、アストロビューアのLogCatを眺めていたところ解決に至りました。

ちなみに日本Androidの会メーリングリストで同じ悩みを持っている人が居て(未解決でしたが)、そのやりとりがヒントになりました。

前置きが長くなりましたが、以下がサンプルです(一部抜粋)


String filename = "SDカードのファイルパス";
//コンテンツプロバイダのURI取得
Cursor c = getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.ImageColumns.DATA + " = ?", new String[]{filename}, null); 
c.moveToFirst(); 
String contentname = "content://media/external/images/media/" + c.getInt(c.getColumnIndex(MediaStore.MediaColumns._ID)); 
   
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(contentname));
 
startActivity(intent);


3-5行でファイルパスからコンテンツプロバイダのURIを取得しています。コンテンツプロバイダに登録されていないファイルの場合nullが返されるので例外処理を書いた方がいいかもしれません。

自前アプリで作成・保存した、あるいはダウンロードした等のケースではコンテンツプロバイダに登録されてないので、MediaScannerConnection を使ってコンテンツプロバイダに登録させる処理が必要になります。

詳細は以下のURLを参照しください。


参考URL

MediaScannerConnectionを使って画像をギャラリーに反映させる http://techbooster.jpn.org/andriod/multimedia/5341/

contentスキーマとfileスキーマの相互変換 http://yagni.jp/android/interconversion_between_file_and_content

Android URI
http://ee72078.moo.jp/chinsan/pc/MobileApp/index.php?Android%20URI

2012/04/19

HttpURLConnectionでBasic認証を使ったサイトにアクセスする

現在トラノマキアプリでデータを更新する処理を作っています。

このアプリで使うベースとなるデータファイルはネット上に置いてあり、先ずはこれらの更新日を取得する必要があります。オープンな場所のファイル更新日を取得するだけならHttpURLConnectionを使う方法がお手軽で良い感じですが、今回は対象となるサイトにBasic認証を掛けてある為(大した情報は無いのですが保身的な人に知れると面倒なので)ひと工夫必要です。

という訳で、Basic認証を使ってネット上のファイルの更新日を取得する方法を調べてみました。

以下、一部抜粋

private Date getLastModified(String filename) {

 URL url;
 Date date = null;

 try {
  Authenticator.setDefault(new Authenticator() {
   protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication("userId", "password".toCharArray());
   }
  });

  url = new URL("http://www.hoge.com/" + filename);

  HttpURLConnection con = (HttpURLConnection) url.openConnection();

  con.setRequestMethod("HEAD");
  date = new Date(con.getLastModified());

 } catch (MalformedURLException e) {
  e.printStackTrace();
 } catch (IOException e) {
  e.printStackTrace();
 }
  return date;
}

こんな感じで良いみたいです。

上記コードでは 便宜上Authenticator.setDefault~の部分をメソッド内部に書いてますが、その必要はありません。まだ勉強中で曖昧なのですが、VMがパスワード要求を受けた時に返せるように設定しておくイメージ?


ちなみにこの方法だとID,パスは暗号化されないので、シビアな場所に使うならHTTPSと併用した方が良いとの事です。


参考URL
http://developer.android.com/intl/ja/reference/java/net/HttpURLConnection.html

2012/04/15

トラノマキforAndroid

会社で役立つツールをAndroid端末で作る、という計画はゆっくりと進んでいます。今年の初めに少し、しばらく休止後、4月に入ってまた再開。本当にゆっくりですが、自身のモチベ維持の為に書いてみます。

名前は 『トラノマキ for Android』

基本的には作業手順書なんですが、それを見れば誰でも出来るという物にはせず、あくまで”記憶を助けるツール”という事をコンセプトとしています。また、現存する紙媒体の虎の巻では困難だった情報の共有化というのも一つの狙いです。

アプリケーション自体は単純で、起動すると機種等でカテゴライズされた手順書等のタイトルがあり、それをタッチすると内容が表示されるというものです。手順書画面はViewPagerで構成され、手順を書いたリストと参考画像の画面をスワイプで切り替える、という物になります。



手順書データは端末に無い場合に自動的に取得する仕組みで、一度取得すれば内部のデータを参照します。また、データを編集/追加していく事も必要なのですが、Android端末でその作業は厳しいので別途PCソフトを用意する必要があるかなと考えています。

現在はアプリの枠組みと呼べるものがおおよそ完成した状態です。まだ最新のファイルに更新する仕組みが未実装。データを編集するソフトについては未着手(これが一番大変そう)。コンテンツを充実させる作業もあるし、まだまだ先は長い。

完成したら若者を中心に広げてもらい、末永く業務に役立ててくれたら嬉しいと思います。


2012/04/14

ブログ引っ越し

JUGEMブログからBloggerへ引っ越ししました。

たまにコードも載せるのでいい機会だと思い、Syntaxhighlighterを導入。こいつはバージョンがいくつかあったので色々比較してたのですが、スクロールバーが出ずに折り返して表示してくれる1.5.1にしました。

導入は、rmascoさんの 怠け者が頑張るブログ のブログを参考にしました。感謝!


後から再び試してみたのですが、結局のところこれはBloggerの新しいインターフェイスで、

レイアウト→ガジェット追加→HTML/JavaScript→コード貼り付け

だけで出来るんですね。ただし、テンプレートを動的ビューにしていると駄目みたいで、他にも旧インターフェイスで選択できるテンプレートでも出来ないものがあるみたいです(出来ない=手軽に出来ない、という意味ね)

2012/04/07

宇宙戦艦ヤマト2199

宇宙戦艦ヤマト2199観てきました。なかなか良かったと思います。ストーリそのものはオリジナルと大差ないのですが、少し思った事を書いてみます。

(以下、多少のネタバレ含みます)