Skip to content
Snippets Groups Projects
Commit 3033bffc authored by DewanaGustavus's avatar DewanaGustavus
Browse files

feat: input image from gallery

parent 66a524a5
Branches
3 merge requests!13Release,!11proper save for gmail,!9Scan nota
...@@ -72,5 +72,7 @@ dependencies { ...@@ -72,5 +72,7 @@ dependencies {
implementation("androidx.camera:camera-view:1.3.2") implementation("androidx.camera:camera-view:1.3.2")
implementation("androidx.camera:camera-lifecycle: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
...@@ -2,8 +2,15 @@ ...@@ -2,8 +2,15 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> 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.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application <application
android:allowBackup="true" android:allowBackup="true"
......
package com.example.bondoyap.ui.scanner package com.example.bondoyap.ui.scanner
import android.Manifest import android.Manifest
import android.app.Activity
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup 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.activity.result.contract.ActivityResultContracts
import androidx.appcompat.widget.AppCompatImageView
import androidx.camera.core.CameraSelector import androidx.camera.core.CameraSelector
import androidx.camera.core.ImageCapture import androidx.camera.core.ImageCapture
import androidx.camera.core.Preview import androidx.camera.core.Preview
...@@ -21,11 +26,17 @@ class ScannerFragment : Fragment() { ...@@ -21,11 +26,17 @@ class ScannerFragment : Fragment() {
// onDestroyView. // onDestroyView.
private var _binding: FragmentScannerBinding? = null private var _binding: FragmentScannerBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
// Camera
private var isBackCamera = true private var isBackCamera = true
private var frozenPreview: Boolean = false private var frozenPreview: Boolean = false
private var imageCapture: ImageCapture? = null private lateinit var imageCapture: ImageCapture
private var cameraProvider: ProcessCameraProvider? = null private lateinit var cameraLauncher: ActivityResultLauncher<String>
// Gallery
private lateinit var changeImage: ActivityResultLauncher<Intent>
private lateinit var pickImageLauncher: ActivityResultLauncher<String>
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
...@@ -35,18 +46,37 @@ class ScannerFragment : Fragment() { ...@@ -35,18 +46,37 @@ class ScannerFragment : Fragment() {
_binding = FragmentScannerBinding.inflate(inflater, container, false) _binding = FragmentScannerBinding.inflate(inflater, container, false)
val root: View = binding.root val root: View = binding.root
val permissionLauncher = registerForActivityResult( cameraLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission() ActivityResultContracts.RequestPermission()
) { isGranted -> ) { isGranted ->
if (isGranted) { if (isGranted) {
// Do if the permission is granted
startCamera() 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() imageCapture = ImageCapture.Builder().build()
cameraLauncher.launch(Manifest.permission.CAMERA)
binding.switchCameraButton.setOnClickListener { binding.switchCameraButton.setOnClickListener {
toggleCamera() toggleCamera()
...@@ -56,6 +86,10 @@ class ScannerFragment : Fragment() { ...@@ -56,6 +86,10 @@ class ScannerFragment : Fragment() {
freezePreview() freezePreview()
} }
binding.galleryButton.setOnClickListener {
pickImageLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
}
return root return root
} }
...@@ -67,7 +101,7 @@ class ScannerFragment : Fragment() { ...@@ -67,7 +101,7 @@ class ScannerFragment : Fragment() {
private fun startCamera() { private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext()) val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())
cameraProviderFuture.addListener({ cameraProviderFuture.addListener({
cameraProvider = cameraProviderFuture.get() val cameraProvider = cameraProviderFuture.get()
val preview = Preview.Builder().build().also { val preview = Preview.Builder().build().also {
mPreview -> mPreview ->
...@@ -97,7 +131,7 @@ class ScannerFragment : Fragment() { ...@@ -97,7 +131,7 @@ class ScannerFragment : Fragment() {
private fun toggleCamera() { private fun toggleCamera() {
isBackCamera = !isBackCamera isBackCamera = !isBackCamera
startCamera() cameraLauncher.launch(Manifest.permission.CAMERA)
} }
private fun freezePreview() { private fun freezePreview() {
...@@ -107,6 +141,6 @@ class ScannerFragment : Fragment() { ...@@ -107,6 +141,6 @@ class ScannerFragment : Fragment() {
} else { } else {
binding.captureButton.text = "Retake" binding.captureButton.text = "Retake"
} }
startCamera() cameraLauncher.launch(Manifest.permission.CAMERA)
} }
} }
\ No newline at end of file
...@@ -28,6 +28,14 @@ ...@@ -28,6 +28,14 @@
android:text="@string/capture_button" android:text="@string/capture_button"
app:layout_constraintTop_toBottomOf="@id/preview_view" app:layout_constraintTop_toBottomOf="@id/preview_view"
app:layout_constraintStart_toEndOf="@+id/switch_camera_button" 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" app:layout_constraintEnd_toEndOf="parent"
/> />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -23,4 +23,5 @@ ...@@ -23,4 +23,5 @@
<string name="send_transactions">Kirim daftar transaksi</string> <string name="send_transactions">Kirim daftar transaksi</string>
<string name="capture_button">capture</string> <string name="capture_button">capture</string>
<string name="switch_camera_button">switch camera</string> <string name="switch_camera_button">switch camera</string>
<string name="gallery_button">gallery</string>
</resources> </resources>
\ No newline at end of file
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment