jiichan.com

PROGRAMMING

Kotlin
javascript
PHP
Java

jetpack compose 内部(App固有)ストレージへのアクセス

androidで、端末内にファイルを保存したり読み込んだりする方法がよく分からなかったので整理してみました。
特に、内部ストレージ、外部ストレージ、アプリ固有のストレージ、共有ストレージ、メディア用途、その他の用途、 と種類が多く分かりずらいです。
また、Api のバージョンで permission の要・不要も変わります。
何回かに分けてストレージへのアクセス方法を確認してみます。

≪開発環境≫
windows11
andriod studio koala
≪実機デバッグ≫
android13

ストレージの構成

google のサイトなど色々調べ、大まかに分けてみたのが次の表です。

区分1区分2区分3アクセス
内部ストレージアプリ固有のストレージ自分のみOK
外部ストレージアプリ固有のストレージ
Android11以降作成不可
自分のみOK
共有ストレージメディア用途他のアプリからもOK
メディア以外用途他のアプリからもOK

他のアプリで作られたファイル (LINEの画像など) にアクセスする以外は、パーミッションは不要のようです。

テキストファイルへの書き込み

書き込み 方法1


val context = LocalContext.current
val text = "Hello world!\nkenichi"
Button(
	onClick = {
		context.openFileOutput("myFile.txt", Context.MODE_PRIVATE).use {
			it.write(text.toByteArray())
		}

		Toast.makeText(context, "ファイルが作成されました。", Toast.LENGTH_SHORT).show()
	}
) {
	Text(text = "内部(App固有)書き込み 1")
}

書き込み 方法2


val context = LocalContext.current
Button(
	onClick = {
		val path = context.filesDir.path + File.separator + "myText.txt"
		val file = File(path)

		// 拡張関数では内部でuse()を用いているため、ファイルのcloseが不要
		file.writeText("Test1\n")   // 最初に writeText が無ければ既存のファイルに追加される
		file.appendText("Test2\n")
		file.appendText("Test3\n")

		Toast.makeText(context, "ファイルが作成されました。", Toast.LENGTH_SHORT).show()
	}
) {
	Text(text = "内部(App固有)書き込み 2")
}

テキストファイルからの読み込み

読み込み 方法1


val context = LocalContext.current
Button(
	onClick = {
		context.openFileInput("myFile.txt").bufferedReader().useLines { lines ->
			// 改行区切りで処理 空行無視
			for (line in lines) {
				str += line + "\n"
			}
		}
		// 表示など処理
		viewModel.fileStrInSet(str)
	}
) {
	Text(text = "内部(App固有)読み込み 1")
}

読み込み 方法2


val context = LocalContext.current
Button(
	onClick = {
		val path = context.filesDir.path + File.separator + "myText.txt"
		val file = File(path)

		// 拡張関数では内部でuse()を用いているため、ファイルのcloseが不要
		file.forEachLine {
			str += it + "\n"
		}
		// 表示など処理
		viewModel.fileStrInSet(str)
	}
) {
	Text(text = "内部(App固有)読み込み 2")
}

まとめ

方法は何通りかありますが、どれを使うべきなのか爺ちゃんには良くわかりませんでした。
ただ、内部ストレージは容量も小さめで、アプリの重要なファイルなどで使用されるものではないかと考えています。