From 42b0af9279df54a799287bbfd6750a05cdd8a56a Mon Sep 17 00:00:00 2001 From: Chris Albert <christiangultom5@gmail.com> Date: Fri, 5 Apr 2024 16:05:53 +0700 Subject: [PATCH] feat: select image from gallery --- app/src/main/AndroidManifest.xml | 2 + .../if3210_2024_android_aab/ScanFragment.kt | 63 +++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 863f239..c1c8b5a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> @@ -24,6 +25,7 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.If32102024androidaab" + android:enableOnBackInvokedCallback="true" tools:targetApi="31"> <activity android:name=".EditTransactionActivity" diff --git a/app/src/main/java/com/example/if3210_2024_android_aab/ScanFragment.kt b/app/src/main/java/com/example/if3210_2024_android_aab/ScanFragment.kt index a08a301..0e7dd20 100644 --- a/app/src/main/java/com/example/if3210_2024_android_aab/ScanFragment.kt +++ b/app/src/main/java/com/example/if3210_2024_android_aab/ScanFragment.kt @@ -3,6 +3,7 @@ package com.example.if3210_2024_android_aab import android.Manifest import android.annotation.SuppressLint import android.app.Activity +import android.content.ContentResolver import android.content.Intent import android.content.pm.PackageManager import android.location.LocationManager @@ -10,6 +11,8 @@ import android.location.LocationRequest import android.net.Uri import android.os.Bundle import android.os.Environment +import android.provider.MediaStore +import android.provider.Settings import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -69,6 +72,8 @@ class ScanFragment : Fragment() { TransactionViewModelFactory((requireActivity().application as TransactionApplication).repository) } + private val SELECT_IMAGE_REQUEST = 1 + private var capturedImageFile: File? = null private lateinit var fusedLocationClient: FusedLocationProviderClient @@ -106,6 +111,10 @@ class ScanFragment : Fragment() { takePhoto() } + binding.galleryButton.setOnClickListener { + selectPhoto() + } + binding.retryButton.setOnClickListener { retryPhoto() } @@ -237,6 +246,59 @@ class ScanFragment : Fragment() { ) } + private fun selectPhoto() { + if (!Environment.isExternalStorageManager()) { + val intentESM = Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION) + startActivity(intentESM) + } + + val intent = Intent(Intent.ACTION_PICK) + intent.type = "image/*" + startActivityForResult(intent, SELECT_IMAGE_REQUEST) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + if (requestCode == SELECT_IMAGE_REQUEST && resultCode == Activity.RESULT_OK) { + val selectedImageUri: Uri? = data?.data + + if (selectedImageUri != null) { + val selectedImage: File? = selectedImageUri?.let { + getImageFile(requireActivity().contentResolver, it) + } + } + + val imageView = binding.imageView + + capturedImageFile = getImageFile(requireActivity().contentResolver, selectedImageUri!!) + + imageView.setImageURI(selectedImageUri) + imageView.visibility = View.VISIBLE + + binding.viewFinder.visibility = View.GONE + binding.captureButton.visibility = View.GONE + binding.galleryButton.visibility = View.GONE + binding.retryButton.visibility = View.VISIBLE + binding.okButton.visibility = View.VISIBLE + } + } + + private fun getImageFile(contentResolver: ContentResolver, uri: Uri): File? { + val filePathCol = arrayOf(MediaStore.Images.Media.DATA) + val cursor = contentResolver.query(uri, filePathCol, null, null, null) + cursor?.moveToFirst() + val colIdx = cursor?.getColumnIndex(filePathCol[0]) + val filePath = colIdx?.let { + cursor.getString(it) + } + cursor?.close() + + return filePath?.let { + File(it) + } + } + private fun retryPhoto() { binding.imageView.visibility = View.GONE binding.viewFinder.visibility = View.VISIBLE @@ -292,6 +354,7 @@ class ScanFragment : Fragment() { } } override fun onFailure (call: Call<ResponseItem>, t: Throwable) { + println(t) Toast.makeText(requireContext(), t.localizedMessage, Toast.LENGTH_SHORT).show() } }) -- GitLab