nashcft's blog

時々何か書く。

Android: Photo Picker 近況

以下の記事を書いた後くらいから眺めていた photo picker 関連の issue についてのメモ。

nashcft.hatenablog.com

Photo picker から返却されるファイルの並び順

issue: https://issuetracker.google.com/issues/264215151

上記の記事でも言及した result で返ってくるファイルの順序が選択順ではない問題。こちらは Google Play の2024年2月のアップデートで修正され、 photo picker 上で選択した順序で返ってくるようになった。

選択ファイル数上限の指定タイミング

issue: https://issuetracker.google.com/issues/303112556

Photo picker で複数のファイルを選択する場合は registerForActivityResultPickMultipleVisualMedia を与えるが、現在選択可能なファイルの上限を指定するにはこの PickMultipleVisualMedia の constructor の maxItems で指定するため、 launcher を作成する時点で上限が固定される仕組みになっていた。

https://cs.android.com/androidx/platform/frameworks/support/+/a0eabef3092da562c3f9f7b95468b3c368ffee02:activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt;l=826

この issue はこれに対して launcher で実際に photo picker を呼び出す際に上限を指定できるようにしてほしいというもので、以下の CL で対応され、 launch 時に渡すPickVisualMediaRequest を作成する関数に上限数を指定する引数が追加されたものが新たに実装された*1

CL: https://android-review.googlesource.com/c/platform/frameworks/support/+/3106768

この変更によって PickMultipleVisualMedia の constructor と PickVisualMediaRequest の二箇所で上限数を指定できるようになったが、実際に使われるのは2つのうち小さい方になる。

この変更は AndroidX Activity の 1.10.0-alpha01 でリリースとのこと。

Exif 情報の取得ができない

issue: https://issuetracker.google.com/issues/243294058

Photo picker 経由で取得したメディアファイルの exif 情報が取れなかったり、 MediaStore.setRequireOriginal を使うと permission 不足で SecurityException になるというもの。 MediaStore.ACTION_PICK_IMAGES のドキュメントによると photo picker で取得した URI には様々な制限があるとのこと。

Output: MediaStore content URI(s) of the item(s) that was picked. Unlike other MediaStore URIs, these are referred to as 'picker' URIs and expose a limited set of read-only operations. Specifically, picker URIs can only be opened for read and queried for columns in PickerMediaColumns.

developer.android.com

報告者の Google の人の会話で位置情報に関しては一応 feature request として受け止められたが、 intended behavior として close されてしまった*2

Close として処理されたが feature request として管理するための issue が作成された様子がないことからか、様々なアプリの開発者たちによる自分のアプリでのユースケースexif 情報を読み出せるようにすることの必要性についての投稿が続いていたところ、4月に突然 issue が reopen された。とはいえそこから何か表明があったり話が進んだりしたわけでもなく、状況については不明なままである。

オリジナルのファイル名が取得できない

issue: https://issuetracker.google.com/issues/268079113

Photo picker 経由で取得したメディアファイルのファイル名が数字の連番になっており、元々のファイル名が取得できないというもの。多分 exif 情報と同じような理由でマスクしているのだと思うが、こちらは特に対応の期待を感じさせるような話もないまま intended behavior として close された。

Google 製のアプリはどうしているのか気になって見てみたところ、 Gmail での画像添付ではマスクされたファイル名をそのまま使っていた。

所感

ポリシーの変更によって、来年からはアップロードのためのファイル選択のような用途でのメディアファイルへのアクセスには photo picker を使わざるを得なくなるはずなのに、機能面でアプリ開発者と足並み揃えられてないのまあまあ不安に思う。

*1:元々存在した関数の引数に追加せず別に関数を実装したのはバイナリ互換性を保つためとのこと。CL 内の関連する議論

*2:Google の人の回答が報告者の関心とやや噛み合っていないのも個人的に気になる