ContentResolverのsortOrderにDATE_ADDEDを使うべき理由

Androidアプリに自前でフォトギャラリーを実装する際、ContentResolver.query()で写真のURIを取得しますが、日付順に写真を並べたいとき、引数のsortOrderに何を指定するかで迷ったので、私なりの結論を書きます。

日付順にも種類がある

私のアプリでは、写真を「日付順」に並べる必要がありました。フォトギャラリーを実装しているアプリの多くは、デフォルトが「日付順」もしくは、選択肢の一つとして「日付順」が用意されていると思います。そこでMediaStore.Images.Mediaクラスのリファレンスを見てみると、MediaStore.MediaColumnsから継承された定数の中に、日付順に並べるために使えそうなものがいくつかありました。

定数API Level説明
DATE_ADDED1以上The time the media item was first added.
DATE_MODIFIED1以上Indexed value of File#lastModified() extracted from this media item.
DATE_TAKEN29以上Indexed value of MediaMetadataRetriever#METADATA_KEY_DATE 
or ExifInterface#TAG_DATETIME_ORIGINAL extracted from this media item.
https://developer.android.com/reference/kotlin/android/provider/MediaStore.MediaColumns より

このうちDATE_TAKENはAPI Level 29以上でしか利用できず、またExif情報から取得するデータなので、すべての写真にこのデータが含まれているとは限りません。ユーザーが切り替え可能な並べ替えの選択肢の一つとするなら良いですが、デフォルトの並び順として使うのは現時点では難しそうです。

したがって、候補はDATE_ADDED, DATE_MODIFIEDに絞られます。DATE_ADDEDはデータベースにファイルが追加された日、DATE_MODIFIEDはファイルが作成・更新された日です。普通にカメラで撮影した写真などの場合はどちらも同じ日時になりますが、カメラで撮影後に編集した画像、別の端末からコピーした画像、Webからダウンロードした画像などの場合に、DATE_ADDEDとDATE_MODIFIEDが別の日時を示します。

DATE_ADDEDを使う理由

ではDATE_ADDEDとDATE_MODIFIEDのどちらを使うのがよいのでしょうか。もちろん時と場合によりますが、私は、DATE_ADDEDの方が適している場合が多いと思います。理由は、Webからダウンロードしたり、別の端末からコピーした画像が、ダウンロードやコピーした日時を基準に並べられるからです。例えば、Webからダウンロードした画像を別のアプリで利用したいとき、DATE_ADDEDで並べれば、さっきダウンロードしたばかりの画像が先頭に表示されます。画像を利用するためにフォトギャラリーを実装している場合は、この方が使いやすいと思います。DATE_MODIFIEDだと、ダウンロードの日時ではなくファイルの最終更新日なので、インターネット上のファイルの場合は、いつ更新されたかどうかなんてわかりません。たくさんの画像に埋もれてしまって探すのは難しくなってしまいます。

有名アプリの実装を調べてみる

有名なアプリがどちらを採用しているかを調べてみると、SNS系アプリはDATE_ADDEDで並べているアプリが多いようでした。入手した画像を利用するための表示順として理にかなっているように思います。一方でGoogle Photoなど画像を表示することそのものが主目的のアプリでは、DATE_MODIFIEDで並べているアプリが多いようでした。

DATE_ADDEDで並べているアプリDATE_MODIFIEDで並べているアプリ
Facebook, Instagram, TwitterなどGoogle Photo, Google Files, LINEなど

まとめ

写真を日付順に並べる場合に、DATE_ADDEDを使うほうが便利になる場合が多いということを書きました。もちろん、日付順以外に、ファイル名やフォルダなどいろいろな方法で並べ替えたり探したりできるUIが望ましいとは思います。ですが写真の閲覧が目的ではないアプリの場合、なかなかフォトギャラリーの実装だけに力を入れることも難しいでしょうから、簡単なフォトギャラリーの実装としては、DATE_ADDEDは無難な選択だと思います。