diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 1866bc344390e415172a5a1d48d9a23b9f45365f..8e12c486edd92b99da4979e8d5ac4c8e0284ac56 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -72,5 +72,7 @@ dependencies {
     implementation("androidx.camera:camera-view:1.3.2")
     implementation("androidx.camera:camera-lifecycle:1.3.2")
 
+    implementation("androidx.activity:activity-ktx:1.8.2")
+
 
 }
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index dd0880aaa9550f08cfd0c5ee9e7948f1c284af8b..86ef56102e278c0cf56694ff7aeae2dc46441681 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,8 +2,15 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools">
 
+
+    <uses-feature
+        android:name="android.hardware.camera"
+        android:required="false" />
+
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.CAMERA" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+
 
     <application
         android:allowBackup="true"
diff --git a/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt b/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt
index 272c5cf246d207f05c2fa5ef9ac7f610194eeaaf..d9e0d20d8e345b4bddfaf94b8b7a405678feb1cd 100644
--- a/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt
+++ b/app/src/main/java/com/example/bondoyap/ui/scanner/ScannerFragment.kt
@@ -1,12 +1,17 @@
 package com.example.bondoyap.ui.scanner
 
 import android.Manifest
+import android.app.Activity
 import android.os.Bundle
 import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.content.Intent
+import android.provider.MediaStore
+import androidx.activity.result.ActivityResultLauncher
 import androidx.activity.result.contract.ActivityResultContracts
+import androidx.appcompat.widget.AppCompatImageView
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.Preview
@@ -21,11 +26,17 @@ class ScannerFragment : Fragment() {
     // onDestroyView.
     private var _binding: FragmentScannerBinding? = null
     private val binding get() = _binding!!
-
+    
+    // Camera
     private var isBackCamera = true
     private var frozenPreview: Boolean = false
-    private var imageCapture: ImageCapture? = null
-    private var cameraProvider: ProcessCameraProvider? = null
+    private lateinit var imageCapture: ImageCapture
+    private lateinit var cameraLauncher: ActivityResultLauncher<String>
+
+    // Gallery
+    private lateinit var changeImage: ActivityResultLauncher<Intent>
+    private lateinit var pickImageLauncher: ActivityResultLauncher<String>
+
 
     override fun onCreateView(
             inflater: LayoutInflater,
@@ -35,18 +46,37 @@ class ScannerFragment : Fragment() {
         _binding = FragmentScannerBinding.inflate(inflater, container, false)
         val root: View = binding.root
 
-        val permissionLauncher = registerForActivityResult(
+        cameraLauncher = registerForActivityResult(
             ActivityResultContracts.RequestPermission()
         ) { isGranted ->
             if (isGranted) {
-                // Do if the permission is granted
                 startCamera()
             }
         }
 
-        permissionLauncher.launch(Manifest.permission.CAMERA)
+        pickImageLauncher = registerForActivityResult(
+            ActivityResultContracts.RequestPermission()
+        ) { isGranted ->
+            if (isGranted) {
+                val pickImageIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI)
+                changeImage.launch(pickImageIntent)
+            }
+        }
+
+        changeImage = registerForActivityResult(
+            ActivityResultContracts.StartActivityForResult()
+        ) {
+            if (it.resultCode == Activity.RESULT_OK) {
+                val data = it.data
+                val imgUri = data?.data
+                val selectedImage = AppCompatImageView(requireContext())
+                selectedImage.setImageURI(imgUri)
+                Log.d("Image Input", "Image Selected with URI: $imgUri")
+            }
+        }
 
         imageCapture = ImageCapture.Builder().build()
+        cameraLauncher.launch(Manifest.permission.CAMERA)
 
         binding.switchCameraButton.setOnClickListener {
             toggleCamera()
@@ -56,6 +86,10 @@ class ScannerFragment : Fragment() {
             freezePreview()
         }
 
+        binding.galleryButton.setOnClickListener {
+            pickImageLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
+        }
+
         return root
     }
 
@@ -67,7 +101,7 @@ class ScannerFragment : Fragment() {
     private fun startCamera() {
         val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())
         cameraProviderFuture.addListener({
-            cameraProvider = cameraProviderFuture.get()
+            val cameraProvider = cameraProviderFuture.get()
 
             val preview = Preview.Builder().build().also {
                 mPreview ->
@@ -97,7 +131,7 @@ class ScannerFragment : Fragment() {
 
     private fun toggleCamera() {
         isBackCamera = !isBackCamera
-        startCamera()
+        cameraLauncher.launch(Manifest.permission.CAMERA)
     }
 
     private fun freezePreview() {
@@ -107,6 +141,6 @@ class ScannerFragment : Fragment() {
         } else {
             binding.captureButton.text = "Retake"
         }
-        startCamera()
+        cameraLauncher.launch(Manifest.permission.CAMERA)
     }
 }
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_scanner.xml b/app/src/main/res/layout/fragment_scanner.xml
index 3c82a34313bc712a9bae1e0e4dc3e401fa617940..459c75552df3d47d5a6f0ad32f6b4d49c303d723 100644
--- a/app/src/main/res/layout/fragment_scanner.xml
+++ b/app/src/main/res/layout/fragment_scanner.xml
@@ -28,6 +28,14 @@
         android:text="@string/capture_button"
         app:layout_constraintTop_toBottomOf="@id/preview_view"
         app:layout_constraintStart_toEndOf="@+id/switch_camera_button"
+        />
+    <Button
+        android:id="@+id/gallery_button"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:text="@string/gallery_button"
+        app:layout_constraintTop_toBottomOf="@id/preview_view"
+        app:layout_constraintStart_toEndOf="@+id/capture_button"
         app:layout_constraintEnd_toEndOf="parent"
         />
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 9551cd893ba5f86220d3f7c67265f2de4e7ad907..1cb99fecd39d2bdf28e3566ab9cc8abbe55ece62 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -23,4 +23,5 @@
     <string name="send_transactions">Kirim daftar transaksi</string>
     <string name="capture_button">capture</string>
     <string name="switch_camera_button">switch camera</string>
+    <string name="gallery_button">gallery</string>
 </resources>
\ No newline at end of file