💡

[Flutter]getApplicationDocumentsDirectory()で取得したパスが存在しない件

に公開

個人的にぶつかった問題の共有のための記録を残しておきます。
対象端末のOSはAndroidで実機で動作確認を行っていました。

Flutterでアプリ固有の保存領域のパスを取得したい

Flutterでアプリ固有の保存領域のパスを取得したい場面が出てきたので、どう取得すればいいかを調べると、path_providerパッケージのgetApplicationDocumentsDirectory()で取得できるらしいことがわかりました。(ディレクトリを取得するメソッドにはいくつか種類があるみたいなのでそれは後述します。)

パスが存在しない

で早速実装してみたのですが、getApplicationDocumentsDirectory()で取得したパスがAndroid StudioのDevice Explorer上では見当たりません。
具体的には、「/data/user/0/[app_name]/app_flutter」が得られるのですが、dataフォルダ直下には「app」「data」「local」の3つのフォルダが存在するのみで「user」フォルダは存在しません。

実際の保存領域はどこにあるのか

調べても同じような問題に言及している記事は見つからなかったので手動でフォルダを探し回りました。(割とみんな直面しそうなありふれた問題だと思うのですが、、、)
最初はセキュリティ的な理由からAndroid Studio上からはアクセスできないようにされている隠しファイルになっているのかとも思いましたが、別の場所で探していたファイルが見つかりました。
「/data/data/[app_name]/app_flutter」です。
なぜパスが異なるのかは未だ謎のままですが、「user/0」の部分を「data」に読み替えると目的のファイルに辿り着けるということで、アプリ固有の保存領域のパスを見つけるという目的は達成できました。

path_providerのディレクトリを取得するメソッドにはいくつか種類がある

◼︎getApplicationDocumentsDirectory

/data/user/0/[app_name]/app_flutter
ユーザーが生成したデータを配置するディレクトリ。Windowsの「ドキュメント」、Macの「書類」に当たる。

◼︎getApplicationSupportDirectory

/data/user/0/[app_name]/files
ユーザーが直接アクセスすることを意図していないデータを保存するディレクトリ。

◼︎getApplicationCacheDirectory/getTemporaryDirectory

/data/user/0/[app_name]/cache
前者はキャッシュデータを保存するディレクトリ、後者はキャッシュよりも短い時間保持する一時的なデータ(ダウンロード途中のファイルや一時的な変換処理用のファイル)を保存するディレクトリという違いがあるがAndroidでは同じディレクトリを指す。

Discussion