しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

【Kotlin】Androidでファイルアプリへの保存・取得を試す

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を渡すと下のようにファイルを選ぶ画面に遷移できます。