MediaStore

写真、動画、音楽なども、ContentResolverを使って取り出す・・・。
MediaStoreに、それらのメディア情報に関する定数が定義されているので、それを使う・・・。

MediaStore | Android Developers

まず、activity_main.xmlは、

今回は写真を表示するので、GridViewを使う・・・。

grid_item.xmlには、

写真を表示するImageViewのgrid_item_bitmap、表示名(というかファイル名)を表示するTextViewのgrid_item_nameで構成・・・。

GridItem.javaは、

表示名はStringのnameだが、写真そのものはBitmapのbitmapで持っておく・・・。

GridItemAdapter.javaは、

findViewByIdで、R.id.grid_item_bitmapからivbitmapをとったら、
ivbitmap.setImageBitmapでgetItem(position)で取得したアイテムのbitmapをセット・・・。

MainActivity.javaは、

MediaStore.Images.Media.EXTERNAL_CONTENT_URIは外部ストレージ(つまりSDカード)の場所を指している・・・。
今回はID使わないけど、一応取得している・・・。
あと表示名も・・・。

MediaStore.Images.Media.DATAがファイルパスを指してるので、まずこれでパスを取得・・・。
そしたら、BitmapFactory.decodeFileでパスを指定してロードしたいところだが、今回GridViewで大量に読み込んで表示するので、このまま読み込むとOutOfMemoryで落ちてしまう・・・。
(ここで落ちるというより、ImageViewで読むところでかな・・・。)
そこで、BitmapFactory.Optionsを使う・・・。

BitmapFactory.Options | Android Developers

options.inJustDecodeBoundsをtrueにしてdecodeFileを呼ぶと、画像を読み込まず画像情報だけを取得してくる・・・。
で、options.outWidthとoptions.outHeightに格納されたサイズから縦横80(pxかな?)に収まる縮尺scaleを計算・・・。
options.inSampleSizeにscaleをセット・・・。
今度は読み込むのでoptions.inJustDecodeBoundsをfalseにして、decodeFileを再び・・・。
これで縮小されたbitmapが取得できる・・・。

あとは、item.nameにname、item.bitmapにbitmapをセットして、griditemsにadd・・・。
最後はgridview1にgriditemsを渡したadapterをセットして表示されるという感じ・・・。

あまりにも写真の量が多いので、数十秒かかったけど、

f:id:BG1:20161213122803p:plain

こんな感じで表示される・・・。

Sample/android/MediaStore/MediaStore/src/MediaStore at master · bg1bgst333/Sample · GitHub