Slide 1

Slide 1 text

Android 11におけるローカル ストレージアクセスの辛み 対象範囲別ストレージの制約について

Slide 2

Slide 2 text

自己紹介 和田 篤 ● Androidエンジニア ● 2018年8月にゆめみに転職 (前職は業務システム開発) ● 音楽プレイヤーアプリ 「Medoly」を個人開発 (2013年~) ● Qiita: https://qiita.com/wa2c Shaniwar Wada (Pune, India) Medoly

Slide 3

Slide 3 text

アジェンダ ● Androidストレージ管理の主な変遷 ● 対象範囲別ストレージ ● 対象範囲別ストレージによって困るパターン ● 対象範囲別ストレージ非対応ファイルへのアクセス

Slide 4

Slide 4 text

Androidストレージ管理の主な変遷 ● API 16: READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE ● API 19: Storage Access Framework (SAF), SDカード書込み制限 ● API 23: Runtime Permission ● API 26: file:// URI使用の制限 ● API 29: 対象範囲別ストレージ (Scoped Storage) ● API 30: 対象範囲別ストレージの必須化 / MANAGE_EXTERNAL_STORAGE Androidローカルストレージ史上最大の苦難

Slide 5

Slide 5 text

対象範囲別ストレージ ファイルパスでアクセス可能な範囲 ● アプリ固有ディレクトリ内 ● MediaStoreに登録されているメディアファイル (動画・音楽・画像) FIle API (java.io.File) を使って外部ストレージを探索するとどうなる? (READ_EXTERNAL_STORAGE 付与済み) ● ディレクトリは見える (アクセス不可能なディレクトリは除く) ● 対応ファイル以外は見えない ● 見えないファイルにアクセスするとFileNotFoundException

Slide 6

Slide 6 text

対象範囲別ストレージによって困るパターン [ストレージ上のファイル] Album1 ディレクトリ ├ Audio1.m4a 音声 ├ Audio1.lrc 歌詞テキスト ├ Audio2.mp3 音声 ├ Audio2.txt 歌詞テキスト ├ Audio3.ape 音声 └ artwork.jpg アルバム画像 [見えるファイル] Album1 ├ Audio1.m4a ├ Audio1.lrc ├ Audio2.mp3 └ artwork.jpg File.listFiles() 類似例: ● 一部の字幕ファイル(.stl, .ssa等)に対応した動画再生アプリ ● 特殊な形式のメディアファイルを扱うアプリ アプリ

Slide 7

Slide 7 text

対象範囲別ストレージ 非対応ファイルへのアクセス

Slide 8

Slide 8 text

対応1: preserveLegacyExternalStorage ● 従来と同様のストレージアクセスが可能 ● API29のみ、30以降では使えない 移行するまでの一時しのぎ

Slide 9

Slide 9 text

対応2: MANAGE_EXTERNAL_STORAGE ● 従来と同様のストレージアクセスが可能 ● 多数のファイル操作をするアプリが対象 (ファイラー等) ● Google Playに登録する際に審査がある ● 2021 年初頭まで Google Play へアップロードできない アプリ登録できるかはGoogle次第 (多分無理)

Slide 10

Slide 10 text

対応3: Storage Access Framework ● 指定ディレクトリ以下のファイルにアクセス可能 ● API30よりストレージのルートが指定出来なくなった ● 従来のFile APIからの置き換えが大変 ( MediaStoreとの連携、パスの相互変換が難しい ) 修正が大変、機能を諦める場合も

Slide 11

Slide 11 text

まとめ ローカルストレージを扱うアプリは、 Android 11からかなり面倒臭いことになります

Slide 12

Slide 12 text

ご清聴ありがとうございました