【Flutter】「READ_MEDIA_IMAGESと READ_MEDIA_VIDEOをアプリから削除する必要があります」に対応する方法

Flutterで「READ_MEDIA_IMAGESと READ_MEDIA_VIDEOをアプリから削除する必要があります」に対応する方法を詳しく解説します。

「READ_MEDIA_IMAGESと READ_MEDIA_VIDEOをアプリから削除する必要があります」について

先日、Google Play Storeでアプリを公開しようとしたところ、以下の警告が表示され非承認となってしまいました。

写真や動画を頻繁に利用しないアプリでは、 READ_MEDIA_IMAGESと READ_MEDIA_VIDEOをアプリから削除する必要があります。

写真や動画のファイルを一度だけ使用する、または頻繁には使用しないとはどういう意味ですか?

写真や動画のファイルを一度だけ使用する、または頻繁には使用しないとは、たとえば、プロフィール写真のアップロード、プレイリスト用の画像のアップロード、銀行取引を目的とした小切手の写真のアップロードなどが該当します。

「頻繁には使用しない」とは、アプリのコア機能として写真や動画のユースケースがないということです。アプリのユースケースが写真や動画のファイルを一度だけ使用するものの場合、または頻繁には使用しないものの場合は、READ_MEDIA_IMAGES 権限や READ_MEDIA_VIDEO 権限を使用できません。代わりに、ユーザーのプライバシーを保護するため、システムの選択ツールを利用することを推奨します。

頻繁には使用しない、または一度だけ使用するユースケースには、ソーシャル、コミュニケーション、写真 / 動画エディタのカテゴリに属するアプリや、幅広いアクセスへのニーズを実証できるアプリ(例: 写真エディタ、ユーザー作成コンテンツ プラットフォーム、画像検索機能、QR コードスキャナ)などがあります。

READ_MEDIA_IMAGES 権限や READ_MEDIA_VIDEO 権限にアクセスできるのは、どのような場合ですか?

コア機能として写真や動画への幅広いアクセスが必要となるアプリでは、上記の権限を使用できます。こうした権限を使用できるアプリとしては、写真や動画を管理するアプリやギャラリー アプリが一般的です

これまでは、アプリが「写真を選ばせる」だけであっても、デバイス内のすべての写真や動画にアクセスできる権限READ_MEDIA_IMAGES 等)を要求するケースが一般的でしたが、Googleはこれを「セキュリティリスク」とみなし、以下のポリシー変更がなされました。

  • 「システムフォトピッカー」の使用を推奨: アプリに権限を与えず、Android OSが提供する安全な選択画面(ピッカー)を使う。
  • 広範な権限は「コア機能」のみ: ギャラリーアプリや高度な編集アプリなど、全ファイルへのアクセスが不可欠なアプリ以外は権限剥奪。

【対応手順①】READ_MEDIA_IMAGES権限の削除

プロフィール画像の変更、チャットでの画像送信などにREAD_MEDIA_IMAGES権限を使用していた場合、権限を削除します。

android/app/src/main/AndroidManifest.xml を開き、以下の行があれば削除します。(READ_MEDIA_IMAGES権限の削除)

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

【対応手順②】「システムフォトピッカー」の使用

続いて、「システムフォトピッカー」を用いた方法を実装します。今回は、Flutterで最も一般的な image_picker パッケージを使用している場合を例に紹介します。

image_picker パッケージの最新バージョン(1.0.0以降)は**Android 13以降で自動的に「システムフォトピッカー」を使用する仕様となっています。もし古いバージョンを使っている場合は pubspec.yamlimage_picker を最新版に更新します。

③ コード内での呼び出しは、これまで通りで問題ありません。

final ImagePicker picker = ImagePicker();
// これを呼び出すと、Android 13+ では権限不要のシステムピッカーが立ち上がります
final XFile? image = await picker.pickImage(source: ImageSource.gallery);

【動作確認】OSバージョンごとの挙動を確認

① Android 13 (API 33) 以降の端末で、権限要求なしでフォトピッカーが起動するか確認します。

② Android 11 / 12の端末で、Google Play開発者サービスを通じてバックポートされたフォトピッカーが動くか確認します。

それ以前のOSだと、依然として READ_EXTERNAL_STORAGE が必要になる場合がありますが、Googleのポリシーは主に「新しいAndroidでの広範な権限要求」を制限することに焦点を当てています。

関連ページ

【Flutter超入門】使い方とサンプルアプリを解説
Flutterの使い方とサンプルアプリ(iOS、Android、Windows)について入門者向けに解説します。

コメント