Android External Storage in Kotlin

First of all, create an Activity in your project that will have a layout similar to below. You will need;

  1. Three buttons tp check, save and read external storage.
  2. One TextView to display results.

activity_external_storage.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".ExternalStorageActivity">

    <Button
            android:text="Check External Storage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/btnCheckExternal"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            android:layout_marginTop="50dp" />

    <Button
            android:text="Save External Storage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/btnSaveExternal"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginTop="24dp"
            app:layout_constraintTop_toBottomOf="@+id/btnCheckExternal" />

    <Button
            android:text="Read External Storage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/btnReadExternal"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginTop="32dp"
            app:layout_constraintTop_toBottomOf="@+id/btnSaveExternal" />

    <TextView
            android:text=""
            android:layout_width="250dp"
            android:layout_height="200dp"
            android:id="@+id/resultView"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            android:layout_marginBottom="200dp" />

</androidx.constraintlayout.widget.ConstraintLayout>

ExternalStorageActivity.kt

package com.androidatc.lesson9

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Environment
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_external_storage.*
import java.io.*

class ExternalStorageActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_external_storage)

        val filepath = "MyFileStorage"
        var myExternalFile: File? = null
        var filename = "mytestfile"

        btnCheckExternal.setOnClickListener {
            val state = Environment.getExternalStorageState()
            if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(
                    state
                )
            ) {
                Toast.makeText(this, "External storage is available to read", Toast.LENGTH_SHORT)
                    .show()
            } else {
                Toast.makeText(
                    this,
                    "External storage is not available to read",
                    Toast.LENGTH_SHORT
                ).show()
            }
        }

        btnSaveExternal.setOnClickListener {
            myExternalFile = File(getExternalFilesDir(filepath), filename)
            Toast.makeText(applicationContext, myExternalFile.toString(), Toast.LENGTH_SHORT).show()
            try {
                val fileOutPutStream = FileOutputStream(myExternalFile)
                fileOutPutStream.write("This is just a test".toByteArray())
                fileOutPutStream.close()
                Toast.makeText(applicationContext, "data save", Toast.LENGTH_SHORT).show()
            } catch (e: IOException) {
                e.printStackTrace()
            }

        }

        btnReadExternal.setOnClickListener {
            myExternalFile = File(getExternalFilesDir(filepath), filename)
            if (filename.toString() != null && filename.toString().trim() != "") {
                var fileInputStream = FileInputStream(myExternalFile)
                var inputStreamReader: InputStreamReader = InputStreamReader(fileInputStream)
                val bufferedReader: BufferedReader = BufferedReader(inputStreamReader)
                val stringBuilder: StringBuilder = StringBuilder()
                var text: String? = null
                while ({ text = bufferedReader.readLine(); text }() != null) {
                    stringBuilder.append(text)
                }
                fileInputStream.close()
                //Displaying data on EditText
                Toast.makeText(applicationContext, stringBuilder.toString(), Toast.LENGTH_SHORT)
                    .show()
                resultView.setText(stringBuilder.toString())
            }
        }
    }
}

View the file created in storage directory

Double-click to download and view the content of mytestfile.

The contents of the file will also be displayed on the textview.