Androidでファイルへの保存・取得を試してみました。
ファイルへの保存するために、まずはregisterForActivityResultでActivityResultLauncherインスタンスを作ります。
val writeResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult result.data?.data?.let { uri -> // 保存処理 } }
次に下のようにIntentを作ってwriteResultLauncherのlaunchメソッドに渡します。
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "text/plain" putExtra(Intent.EXTRA_TITLE, "ファイル名") } writeResultLauncher.launch(intent)
そうするとregisterForActivityResultのコールバックが呼ばれます。
その時、保存先URLが渡されるのでそこにデータを保存します。
val writeResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult result.data?.data?.let { uri -> contentResolver.openOutputStream(uri)?.use { outputStream -> outputStream.write("テスト".toByteArray()) } } }
ファイルの読み込みもregisterForActivityResultを使います。
今度は読み込んだファイルのURLが渡されるので下のように読み込みます。
val readResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult result.data?.data?.let { uri -> BufferedReader(InputStreamReader(contentResolver.openInputStream(uri)))?.use { reader -> val stringBuilder = StringBuilder() var line = reader.readLine() while (line != null) { stringBuilder.append(line) line = reader.readLine() } Log.i("Test", stringBuilder.toString()) } } }
Intentを渡す方法は下の通りです。
今回は読み込みなのでIntentの初期化の引数をACTION_OPEN_DOCUMENTにしています。
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "text/plain" } readResultLauncher.launch(intent)
Intentを渡すと下のようにファイルを選ぶ画面に遷移できます。