読者です 読者をやめる 読者になる 読者になる

ナカザンドットネット

Android Developer's memo

Galaxy Nexusで起きた、画像についてのおかしな出来事

Android

ある画像について、ギャラリーの「詳細情報」で見たファイルサイズと、Javaコード内でFile#length()したときのファイルサイズが大きく異なるという事象に遭遇したので、ひとまず現象だけ覚書。

ギャラリーで詳細情報を見た時のファイルサイズ

f:id:Nkzn:20120715223602p:image:w320

1.04MB。

File#length()したときのファイルサイズ

検証コード@gist
↑インテントでギャラリー呼んで、選んだ画像のファイルパスを手に入れるだけのコードです。

f:id:Nkzn:20120715223828p:image:w320

1965307Byte≒1.87MB。

ギャラリーに表示されているものの倍近いサイズです。なんぞ。

Dropbox経由で引っ張りだしてMac側で見た時のサイズ

f:id:Nkzn:20120715224225p:plain

1965307バイト。File#length()と同じ結果ですね。
んん? なんでギャラリーでは小さく表示されるんだろう?

Android File Transferで見た時のサイズ

Android File Transferとは、端末をマスストレージモードにしなくてもExternal Storage領域のデータをやりとりできる、Mac10.5&Honeycomb以上限定の素敵かどうかと言われると微妙なツールなのである!

ということで何となくこのツールでもファイルを見てみた。

f:id:Nkzn:20120715224427p:plain

1.0MB・・・?

流石に不審です。ドラッグアンドドロップでファイルを引きずり出してみましょう。

f:id:Nkzn:20120715224553p:plain


えっ

Android File Transfer経由で引っ張りだしてMac側で見た時のサイズ

f:id:Nkzn:20120715225233p:plain

サイズとかそういう次元じゃなかった。なんか欠損してる。
1095414Byte≒1.04MBなので、当初のギャラリーでの表示とは辻褄が合ってる。

考察

GNのファイルシステムがサイズの計算間違えてる感じなんだろうか。

  1. 何故かファイルシステムはこの画像を1.04MBだと思っている(というのがたぶんメタ情報として入っちゃってる)
  2. ギャラリーはイチイチ画像とか直接読んでられないので、たぶんメタ情報だけを見て1.04MBだって言ってる
  3. 本当は1.87MBある画像ファイルをFile Transferで取り出そうとすると、1.04/1.87MB分しか転送しない
    • なのでMacに転送されたものには欠損が起こる(別に端末内で欠損が起こってるわけではないたぶん)
  • DropboxやFile#length()はファイルシステム上どうかに関係なく実際のファイル全体を読んだり送ったりしているために影響を受けていないのでは
  • この現象が起きるファイルと起きないファイルがあるが、条件はよく分からない

感想&まとめ

むーん・・・。なんなんだろうこれ。
ひとまずFile#length()で読んでくる値は正しい感じがするから、仕事で詰まってた部分に関しては問題ないかな・・・。

うちにあるGN以外では試してないので、他所でも起きる現象なのかどうかは分かりませんが、とりあえずこんなことがありましたということで。