投稿

ラベル(android)が付いた投稿を表示しています

ファイル一覧が取得できなくなる。listFiles メソッドで、nullが返るようになった。

イメージ
久しぶりに android を触る。以前に作ったdeprecated な Galleryを途中まで公開して放置していたんだけど、ちゃんと公開してほしいというリクエストを受けて、久しぶりに android開発環境を触る。 とりあえず以前のプロジェクトをビルドして実行したら、 File dir = new File(path); File[] fileArray = dir.listFiles(getFilenameFilter()); で、null pointer exception で落ちた。はて?デバッガで追いかけると、パスは実在してるし、ファイルも抽出できないとおかしい。もしや?と思って調べたら、androidのバージョンアップでどうもセキュリティに関する仕様変更があった様子。ストレージへのアクセス権限をちゃんとマニフェストに書かないといけないようだ。eclipseのマニフェストエディタだとこんな感じ。  xml を直接のぞくとこんな感じ。 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> こんな基本的なAPIでも、いままで動いてたプログラムが動かなくなったりするのか。app store でアプリを公開したら、継続的にチェックしないといけないのね。

deprecated な Gallery の代替を自作する(1)

android プログラミングで遊ぶ。 ずっと作ってみたかったアプリがあって、先ずはフィルムストリップみたく写真を選ぶ機能から作ってみる。 本を見るとその名も Gallery というコンポーネントがあって、これを配置すれば簡単にできそうである。 ところが配置すると、『deprecated』とある。比較的新しい部品のようではあるが、android 4 からは非推奨らしいのだ。というわけで代替手段を探す。ところが… Gallery ばりにペタンと貼って終了、ってのはどうもなさそう。そもそもなんで Gallery が非推奨なんだって調べたら、どうもキャッシュに問題があるらしい。おそらくものすごく大量の画像リストを喰わせると落ちるとか、落ちないにしてもかなりメモリを喰うんだろうと想像。 無いものは作るしかない、ということで、ネットから拝借した HorizontalListView とキャッシュ機構を自作したら意外に簡単に実装できた。キャッシュのサイズを指定して、キャッシュがいっぱいになるまで画像を先読みしてため込んでおくということもできそう。僕は EOS-60D の画像ビューアを作ろうとしているので、高解像度の画像からサムネイルを作る処理というのは1フレームにはおさまりそうにないのだ。とりあえず、キャッシュ機構はこんな感じ。あらかじめ作った配列をサイズを保ったまま使いまわす。 package ps.ksk.imageanalyzer.util; public class LoopedCacheList { int buffersize = 0; int topPosition = 0; // 配列のどこが先頭か int topIndex = 0; // topPositionの本来のインデックス Object[] objectArray; public LoopedCacheList(int buffersize) { this.buffersize = buffersize; objectArray = new Object[buffersize]; } /** * 指定したインデックスに要素をキャッシュします. * 必要に応じてキャッシュ範囲をシフトし、はみ出す要素は削除します. * * @param in...

File.isFile、File.isDirectory が思ったとおりに動かない

android 開発で遊んでみる。 File dir = new File("/hoge/hoge" ); assertTrue( dir.isDirectory() ); // ←コケル File file = new File("/hoge/hoge/hoge.jpg" ); assertTrue( file.isFile() ); // ←コケル むむむ。そういうもんなのか。ファイルシステムが違うから? 理由はおいおい調べようっと。