Androidの写真と動画権限のポリシーに対応した話
はじめに
自己紹介
こんにちは、Sun*でモバイルエンジニアをしている宮下です。
周りにはよくみやしーと呼ばれていたりします。
Sun*には今年の9月に入社し、現在のプロジェクトではiOS、Android両方の開発のリードとしてプロジェクト内の技術的調査、仕様設計、CI/CDを活用した開発プロセスの改善活動などを担っています。
今回のテーマ
Androidではプライバシーの保護やセキュリティの強化を目的として、定期的にGoogle Playポリシーの更新が行われます。
去年の10月にGoogleがポリシーを発表し、写真と動画に関する権限について、新たに厳格な制限が設けられました。
私のプロジェクトでも上記ポリシーの影響を受け、対応が必要となりましたが、その際にいくつか課題に対処する必要があったため、備忘録として今回の記事を書くことにしました。
写真と動画の権限ポリシー変更について
2025年5月末までに写真と動画の権限ポリシーに対応しない場合、権限を使用しているアプリはストアから削除されます。
回避するためには、以下ケースのいずれかの対応が必要です。
- 写真と動画の権限をアプリのコア機能として使っている場合は申告し、使用の承認を受ける必要がある
- 写真と動画の権限をアプリ一度だけ使用、または頻繁には使用しない場合はアプリから以下の権限を削除する必要がある
READ_MEDIA_IMAGES
READ_MEDIA_VIDEO
ではこのコア機能とは何なのか?という話になるのですが、Googleの回答として以下となっています。
コア機能は、アプリの主な目的であると見なされています。つまり、アプリの説明に記載した機能がアプリの動作に不可欠であり、その機能がなければアプリが正しく動作しないということです。
この条件がかなり厳しく、写真や動画を管理するギャラリーアプリのような頻繁かつ継続的にアクセスを行うアプリである必要があります。一般的に権限を必要とするのは以下のようなアプリですが、これらは全てコア機能の対象にはなりません。。
- 画像のアップロード、選択機能を持つアプリ(プロフィール設定など)
- SNS(X, Instagram、LINEなど)
- 写真、動画エディタアプリ
私のプロジェクトでも例外ではなく、権限の削除を行う必要が発生しました。
プロジェクトでの課題
私のプロジェクトではチャットツール系のサービスを展開しており、元々下記のユースケースにおいて、写真と動画の権限を使用していました。
- 写真選択画面で選択した画像をチャットに投稿する
- 動画選択画面で選択した動画をトリミング画面に渡す
- トリミング画面で編集した動画をチャットに投稿する
- ファイル選択ツールからファイルを選択する
- 画像を選択した場合はチャットに投稿する
- 動画を選択した場合はトリミング画面に渡す
課題発生時の操作フロー
課題1
トリミング画面はAndroidVideoTrimmerライブラリを使用して実装しています。
開発側で調査した結果、READ_MEDIA_VIDEO
権限を削除した状態でも動作することが判明したため、権限関連の処理を削除することで対応しました。
課題2
写真選択画面と動画選択画面についてはアプリ側で実装していたため、仕様の変更が必要となりました。
開発チームで上記の対応方法を模索したところ、Googleが推奨している写真選択ツールが対応方法として上がりました。
写真選択ツール
写真選択ツールはGoogleが提供しているメディアライブラリが閲覧可能なインターフェースです。
選択した画像と動画にのみアクセスを許可する方法が取られています。
以下のアクティビティ結果コントラクトを使用することで起動します。
-
PickVisualMedia
: 1つの画像または動画を選択できる -
PickMultipleVisualMedia
: 複数の画像または動画を選択できる
写真選択ツール
実装コストが低く、以下の点からアプリパフォーマンスの面でも安全と判断し、採用する方向となりました。
- 特定の画像・動画のみアクセスを許可するため、ポリシーに準拠している
- システムのメディアライブラリとの互換性がある
- システムのUIが提供されるため、UIの変更によるユーザの混乱も少ない
最終的にプロジェクト内での合意も得られたため、課題2も解決です。
写真選択ツール導入後の操作フロー
クラッシュの問題が発生
ではこれで対応が完了。。と思った矢先、ファイル選択ツールから動画ファイルを選択した際にクラッシュする問題が発生しました。写真選択ツールからは問題なく動作しているのになぜ、、
原因
ファイル選択ツールはアクティビティ結果コントラクトのGetContent
を使用しており、選択したファイルはContentProviderによって提供されるURI(content://URI
)で返されます。
READ_MEDIA_VIDEO
の権限がない場合、上記のURI経由ではファイルのメタデータが取得できない状態となっていました。
対処法
以下の3パターンを検討しました。
- 選択した動画ファイルをストレージに保存する。保存先のURIをトリミング画面に渡す
- ファイルピッカーで動画ファイルを選択した場合、写真選択ツールを表示する
- トリミング画面への遷移を行わず、そのままチャットに投稿を行う
1はストレージへの保存処理が絡むことでパフォーマンス上の懸念があり、
2はユーザの操作ステップ数が増えてしまう、
3は仕様への影響、実装コストが大きい、
それぞれに課題を抱えていましたが、アプリパフォーマンスへの影響、実装コストの観点から、最終的に2の方針で進める形となりました。
最終的な操作フロー
まとめ
ポリシー対応は、いつも突然やってくるものです。開発のマネジメントを担う立場としては、常に最新の情報にアンテナを張り巡らせておく必要があります。また、今回のように実装側だけで完結する問題ではなく、クライアント側との仕様調整が必要になる場面も今後起こり得ると思っていますので、今回の経験を踏まえて、より円滑な対応をしていきたいと思います!
参考
Discussion