内部ストレージ化(Adoptable Storage)の設定が正しく行われていても、プログラムから context.getFilesDir() で取得したパスに保存するだけでは、自動的にSDカード側が優先的に使われるわけではないという点に注意が必要です。
なぜ反映されないのか(Androidの仕様)
Androidの内部ストレージ化機能は、物理的な2つのストレージ(内蔵メモリとSDカード)を仮想的に1つにまとめますが、ディレクトリ構造まで完全に混ざり合うわけではありません。
context.getFilesDir()の挙動: 通常、このメソッドは常に本体内蔵メモリ側(/data/user/0/パッケージ名/files)のパスを返します。- データの配置: システムは「アプリごと」に、そのデータを「内蔵メモリに置くか」「SDカードに置くか」を決定します。コードから強制的にSDカード領域の
getFilesDir()を指定することは通常できません。
SDカードの容量を「使う」ための設定
アプリのデータをSDカード側の容量に反映させるには、ユーザーがシステム設定から**「アプリをSDカードに移動」**させる必要があります。
- タブレットの「設定」>「アプリと通知」>「すべてのアプリを表示」
- 該当のアプリを選択
- **「ストレージ」**をタップ
- 「使用されているストレージ」という項目に**「変更」**ボタンがあるか確認します。
- ここで「SDカード」を選択して移動させると、そのアプリの
getFilesDir()が指す実体(保存先)が物理的なSDカード領域に切り替わり、SDカードの容量を消費するようになります。
thoughtful 設定画面に「変更」ボタンがない、あるいは変更しても状況が変わらない場合、Androidの**「マニフェスト設定」または「内部ストレージ化の仕様」**が壁になっている可能性が高いです。
以下の3つのポイントを確認してみてください。
アプリ側で「外部への移動」を許可しているか
Androidアプリは、開発者が明示的に許可しない限り、内部ストレージ化したSDカードへの移動(書き込み先変更)が制限されることがあります。
AndroidManifest.xml の <manifest> タグに以下の属性が含まれているか確認してください。
XML
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="auto"> ...
</manifest>
autoまたはpreferExternal: これが指定されていない(デフォルト)場合、システムはアプリを頑なに内蔵メモリに留めようとし、getFilesDir()の実体も内蔵メモリから動きません。
getFilesDir() と getExternalFilesDirs() の違い
内部ストレージ化していても、Androidのファイルシステム上は**「厳格な内部領域」と「拡張された外部領域」**の区別が残っています。
getFilesDir(): 基本的に/data/user/0/...(内蔵チップ)を指し続けます。getExternalFilesDirs(null): 内部ストレージ化されたSDカードを含めた、より広い保存先を返します。
実験: 以下のコードを実行して、ログに複数のパスが出てこないか確認してみてください。
Java
File[] dirs = context.getExternalFilesDirs(null);
for (int i = 0; i < dirs.length; i++) {
Log.d("STORAGE_CHECK", "Index " + i + ": " + dirs[i].getAbsolutePath());
}
内部ストレージ化が成功していれば、この配列のいずれかのパス(多くの場合 index 1 以降)がSDカード上の領域を指しており、そこへ保存すればSDカードの容量が消費されます。
【強制手段】開発者オプションで移動を許可する
もしアプリの設定画面に「変更」ボタンが出ない場合、OSレベルで強制的に移動を許可する設定があります。
- タブレットの「設定」>「デバイス情報」>**「ビルド番号」を連打**して開発者モードを有効にする。
- 「設定」>「システム」>「開発者向けオプション」を開く。
- 「外部ストレージへのアプリの書き込みを強制的に許可する」(Force allow apps on external)をオンにする。
- この後、再度アプリのストレージ設定を確認すると「変更」ボタンが出現することがあります。




コメント