Pick an Image from the Gallery – Android Studio - Compose
How to Pick an Image from the Gallery?
In this tutorial, we will walk through the complete process of selecting an image from the device’s Gallery in an Android application. This feature is commonly used in many modern apps—for uploading profile pictures, choosing photos for posts, or attaching images to forms.
We will start by creating a simple layout with a button that the user can tap to open the Gallery. Once the button is clicked, the system’s built-in image picker will appear, allowing the user to browse their photo library and select a single image. After the user chooses an image, we will retrieve its URI and display it inside an ImageView within our app.
>> Check for Kotlin
>> Check for Compose
Code:
MainActivity.java
package com.technifysoft.myapplication
import android.net.Uri
import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import coil.request.ImageRequest
import com.technifysoft.myapplication.ui.theme.MyApplicationTheme
class MainActivityCompose : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
PickImageScreen()
}
}
}
@Composable
fun PickImageScreen() {
var imageUri by remember { mutableStateOf<Uri?>(null) }
val context = LocalContext.current
// Launcher to pick image
val galleryLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.GetContent()
) { uri ->
if (uri != null) {
imageUri = uri
} else {
Toast.makeText(context, "Cancelled", Toast.LENGTH_SHORT).show()
}
}
Column(
modifier = Modifier
.fillMaxSize()
.padding(20.dp)
) {
// Image View
AsyncImage(
model = ImageRequest.Builder(context)
.data(imageUri)
.crossfade(true)
.build(),
modifier = Modifier
.fillMaxWidth()
.height(300.dp),
contentDescription = "Pick Image",
contentScale = ContentScale.Inside
)
Spacer(modifier = Modifier.height(20.dp))
Button(
onClick = {
galleryLauncher.launch("image/*")
},
modifier = Modifier.fillMaxWidth()
) {
Text("Pick Image from Gallery")
}
}
}
/**
* GreetingPreview is a composable function for previewing the MainUI in Android Studio.
* It is annotated with @Preview to enable live preview.
*
*/
@Preview(showBackground = true)
@Composable
private fun GreetingPreview() {
MyApplicationTheme {
PickImageScreen()
}
}
package com.technifysoft.myapplication import android.net.Uri import android.os.Bundle import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import coil.request.ImageRequest import com.technifysoft.myapplication.ui.theme.MyApplicationTheme class MainActivityCompose : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { PickImageScreen() } } } @Composable fun PickImageScreen() { var imageUri by remember { mutableStateOf<Uri?>(null) } val context = LocalContext.current // Launcher to pick image val galleryLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.GetContent() ) { uri -> if (uri != null) { imageUri = uri } else { Toast.makeText(context, "Cancelled", Toast.LENGTH_SHORT).show() } } Column( modifier = Modifier .fillMaxSize() .padding(20.dp) ) { // Image View AsyncImage( model = ImageRequest.Builder(context) .data(imageUri) .crossfade(true) .build(), modifier = Modifier .fillMaxWidth() .height(300.dp), contentDescription = "Pick Image", contentScale = ContentScale.Inside ) Spacer(modifier = Modifier.height(20.dp)) Button( onClick = { galleryLauncher.launch("image/*") }, modifier = Modifier.fillMaxWidth() ) { Text("Pick Image from Gallery") } } } /** * GreetingPreview is a composable function for previewing the MainUI in Android Studio. * It is annotated with @Preview to enable live preview. * */ @Preview(showBackground = true) @Composable private fun GreetingPreview() { MyApplicationTheme { PickImageScreen() } }

Comments
Post a Comment