MainActivity.kt
package com.cfsuman.kotlinexamples
import android.content.Context
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.net.Uri
import android.os.Build
import android.support.v4.content.ContextCompat
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.io.OutputStream
import java.util.*
import android.os.Environment
import android.widget.Toast
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
// Check run time permission for write external storage
// android.permission.WRITE_EXTERNAL_STORAGE
}
// Get the bitmap from given drawable object
val drawable = ContextCompat.getDrawable(applicationContext,R.drawable.flower16)
val bitmap = (drawable as BitmapDrawable).bitmap
// Click listener for button widget
button.setOnClickListener{
// Save the image in external storage and get the uri
val uri:Uri = saveImageToExternalStorage(bitmap)
// Display the external storage saved image in image view
image_view_saved.setImageURI(uri)
// Show the saved image uri
text_view.text = "Saved: $uri"
}
}
// Method to save an image to external storage
private fun saveImageToExternalStorage(bitmap:Bitmap):Uri{
// Get the external storage directory path
val path = Environment.getExternalStorageDirectory().toString()
// Create a file to save the image
val file = File(path, "${UUID.randomUUID()}.jpg")
try {
// Get the file output stream
val stream: OutputStream = FileOutputStream(file)
// Compress the bitmap
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream)
// Flush the output stream
stream.flush()
// Close the output stream
stream.close()
toast("Image saved successful.")
} catch (e: IOException){ // Catch the exception
e.printStackTrace()
toast("Error to save image.")
}
// Return the saved image path to uri
return Uri.parse(file.absolutePath)
}
}
// Extension function to show toast message
fun Context.toast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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"
android:id="@+id/root_layout"
android:background="#ded5d2"
android:padding="16dp"
android:orientation="vertical"
>
<ImageView
android:id="@+id/image_view_source"
android:layout_width="match_parent"
android:layout_height="200dp"
android:src="@drawable/flower16"
/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Save Image To External Storage"
android:layout_gravity="center_horizontal"
android:layout_margin="10dp"
/>
<TextView
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#ff2079"
android:layout_margin="10dp"
style="@style/Base.TextAppearance.AppCompat.Medium"
/>
<ImageView
android:id="@+id/image_view_saved"
android:layout_width="match_parent"
android:layout_height="200dp"
/>
</LinearLayout>
AndroidManiest.xml [Permission]
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>