1
1
package dev.ahrsoft.easycameraandgallery
2
2
3
3
import android.annotation.SuppressLint
4
+ import android.app.Activity
4
5
import android.content.ContentUris
5
6
import android.content.ContentValues
6
7
import android.content.Intent
@@ -13,6 +14,7 @@ import android.net.Uri
13
14
import android.os.Build
14
15
import android.os.Bundle
15
16
import android.os.Environment
17
+ import android.provider.DocumentsContract
16
18
import android.provider.MediaStore
17
19
import android.util.DisplayMetrics
18
20
import android.util.Log
@@ -21,6 +23,8 @@ import android.view.View
21
23
import android.view.WindowInsets
22
24
import android.webkit.MimeTypeMap
23
25
import android.widget.Toast
26
+ import androidx.activity.result.ActivityResultLauncher
27
+ import androidx.activity.result.contract.ActivityResultContracts
24
28
import androidx.appcompat.app.AppCompatActivity
25
29
import androidx.camera.core.*
26
30
import androidx.camera.lifecycle.ProcessCameraProvider
@@ -52,6 +56,7 @@ class CameraActivity : AppCompatActivity() {
52
56
53
57
private var cameraProvider: ProcessCameraProvider ? = null
54
58
private var lensFacing: Int = CameraSelector .LENS_FACING_BACK
59
+ private var flashMode: Int = ImageCapture .FLASH_MODE_OFF
55
60
private var preview: Preview ? = null
56
61
private var imageCapture: ImageCapture ? = null
57
62
private lateinit var outputDirectory: File
@@ -61,46 +66,174 @@ class CameraActivity : AppCompatActivity() {
61
66
private val imageList = arrayListOf<ImageModel >()
62
67
private val imageSelected = arrayListOf<ImageModel >()
63
68
private lateinit var adapter: GalleryAdapter
69
+ private lateinit var resultGallery: ActivityResultLauncher <Intent >
70
+
64
71
65
72
override fun onCreate (savedInstanceState : Bundle ? ) {
66
73
super .onCreate(savedInstanceState)
67
74
binding = ActivityCameraBinding .inflate(layoutInflater)
68
75
val view = binding.root
69
76
setContentView(view)
77
+ if (allPermissionsGranted()) {
78
+ startCamera()
79
+ getAllImageFromGallery()
80
+ } else {
81
+ ActivityCompat .requestPermissions(this , REQUIRED_PERMISSIONS , REQUEST_CODE_PERMISSIONS )
82
+ }
83
+
70
84
initUI()
71
85
}
72
86
73
87
private fun initUI () {
74
88
optionsCamera = (intent.getSerializableExtra(" options" ) as ? OptionsCamera )!!
89
+ flashModeOptions(optionsCamera.flash)
90
+
75
91
with (binding) {
92
+ galleryCaptureButton.setOnClickListener {
93
+ getPickImageIntent()
94
+ }
76
95
cameraCaptureButton.setOnClickListener {
77
96
takePhoto()
78
97
}
98
+ ibFrontCamera.setOnClickListener {
99
+ if (CameraSelector .LENS_FACING_FRONT == lensFacing){
100
+ lensFacing = CameraSelector .LENS_FACING_BACK
101
+ enableFrontCamera(false )
102
+ }else {
103
+ lensFacing = CameraSelector .LENS_FACING_FRONT
104
+ enableFrontCamera(true )
105
+ }
106
+ bindCameraUseCases()
107
+ }
108
+ ibFlashCamera.setOnClickListener {
109
+ when (flashMode){
110
+ ImageCapture .FLASH_MODE_OFF -> {
111
+ flashMode = ImageCapture .FLASH_MODE_ON
112
+ caseFlashMode()
113
+ }
114
+ ImageCapture .FLASH_MODE_ON -> {
115
+ flashMode = ImageCapture .FLASH_MODE_AUTO
116
+ caseFlashMode()
117
+ }
118
+ ImageCapture .FLASH_MODE_AUTO -> {
119
+ flashMode = ImageCapture .FLASH_MODE_OFF
120
+ caseFlashMode()
121
+ }
122
+ }
123
+ bindCameraUseCases()
124
+ }
125
+
79
126
fabSendData.setOnClickListener {
80
127
val list = imageSelected.map {
81
128
it.image
82
129
}
83
130
getListPath(list as ArrayList <String >)
84
131
}
85
132
}
86
- if (allPermissionsGranted()) {
87
- startCamera()
88
- getAllImageFromGallery()
89
- } else {
90
- ActivityCompat .requestPermissions(this , REQUIRED_PERMISSIONS , REQUEST_CODE_PERMISSIONS )
133
+ openCallback()
134
+ }
135
+
136
+ private fun openCallback () {
137
+ resultGallery =
138
+ registerForActivityResult(ActivityResultContracts .StartActivityForResult ()) { result ->
139
+ if (result.resultCode == Activity .RESULT_OK ) {
140
+ val data = result.data
141
+ if (data != null ) {
142
+ if (data.clipData != null ) {
143
+ val mClipData = data.clipData
144
+ for (i in 0 until mClipData!! .itemCount) {
145
+ val item = mClipData.getItemAt(i)
146
+ val uri = item.uri
147
+ getPathFromURI(uri)
148
+ }
149
+ } else if (data.data != null ) {
150
+ val uri = data.data
151
+ if (uri != null ) {
152
+ getPathFromURI(uri)
153
+ }
154
+ }
155
+ }
156
+ }
157
+ }
158
+ }
159
+
160
+ private fun caseFlashMode (){
161
+ when (flashMode){
162
+ ImageCapture .FLASH_MODE_OFF -> {
163
+ binding.ibFlashCamera.setImageResource(R .drawable.ic_baseline_flash_off_24)
164
+ }
165
+ ImageCapture .FLASH_MODE_ON -> {
166
+ binding.ibFlashCamera.setImageResource(R .drawable.ic_baseline_flash_on_24)
167
+
168
+ }
169
+ ImageCapture .FLASH_MODE_AUTO -> {
170
+ binding.ibFlashCamera.setImageResource(R .drawable.ic_baseline_flash_auto_24)
171
+ }
91
172
}
92
173
}
93
174
175
+ private fun enableFrontCamera (isFront : Boolean ) {
176
+ if (isFront){
177
+ binding.ibFrontCamera.setImageResource(R .drawable.ic_baseline_camera_rear_24)
178
+ }else {
179
+ binding.ibFrontCamera.setImageResource(R .drawable.ic_baseline_camera_front_24)
180
+ }
181
+ }
182
+
183
+ private fun getPathFromURI (uri : Uri ) {
184
+ var realPath = String ()
185
+ uri.path?.let { path ->
186
+ val databaseUri: Uri
187
+ val selection: String?
188
+ val selectionArgs: Array <String >?
189
+ if (path.contains(" /document/image:" )) {
190
+ databaseUri = MediaStore .Images .Media .EXTERNAL_CONTENT_URI
191
+ selection = " _id=?"
192
+ selectionArgs = arrayOf(DocumentsContract .getDocumentId(uri).split(" :" )[1 ])
193
+ } else {
194
+ databaseUri = uri
195
+ selection = null
196
+ selectionArgs = null
197
+ }
198
+ try {
199
+ val column = " _data"
200
+ val projection = arrayOf(column)
201
+ val cursor = contentResolver.query(
202
+ databaseUri,
203
+ projection,
204
+ selection,
205
+ selectionArgs,
206
+ null
207
+ )
208
+ cursor?.let {
209
+ if (it.moveToFirst()) {
210
+ val columnIndex = cursor.getColumnIndexOrThrow(column)
211
+ realPath = cursor.getString(columnIndex)
212
+ }
213
+ cursor.close()
214
+ }
215
+ } catch (e: Exception ) {
216
+ println (e)
217
+ }
218
+ }
219
+ addImage(realPath)
220
+ }
221
+
222
+
94
223
private fun startCamera () {
95
224
val cameraProviderFuture = ProcessCameraProvider .getInstance(this )
96
225
cameraProviderFuture.addListener({
97
226
cameraProvider = cameraProviderFuture.get()
98
-
99
- lensFacing = when {
100
- hasBackCamera() -> CameraSelector .LENS_FACING_BACK
101
- hasFrontCamera() -> CameraSelector .LENS_FACING_FRONT
102
- else -> throw IllegalStateException (" No existen dispositivo de captura disponibles..." )
103
- }
227
+ if (optionsCamera.isFrontFacing){
228
+ enableFrontCamera(true )
229
+ lensFacing = CameraSelector .LENS_FACING_FRONT
230
+ hasBackCamera()
231
+
232
+ }else {
233
+ enableFrontCamera(false )
234
+ lensFacing = CameraSelector .LENS_FACING_BACK
235
+ hasFrontCamera()
236
+ }
104
237
bindCameraUseCases()
105
238
}, ContextCompat .getMainExecutor(this ))
106
239
}
@@ -109,9 +242,11 @@ class CameraActivity : AppCompatActivity() {
109
242
if (isCompleteSelect){
110
243
binding.fabSendData.visibility = View .VISIBLE
111
244
binding.cameraCaptureButton.visibility = View .GONE
245
+ binding.galleryCaptureButton.visibility = View .GONE
112
246
}else {
113
247
binding.fabSendData.visibility = View .GONE
114
248
binding.cameraCaptureButton.visibility = View .VISIBLE
249
+ binding.galleryCaptureButton.visibility = View .VISIBLE
115
250
}
116
251
}
117
252
@@ -313,6 +448,21 @@ class CameraActivity : AppCompatActivity() {
313
448
}
314
449
}
315
450
451
+ private fun flashModeOptions (flash : Flash ) {
452
+ flashMode = when (flash){
453
+ Flash .On -> {
454
+ ImageCapture .FLASH_MODE_ON
455
+ }
456
+ Flash .Off -> {
457
+ ImageCapture .FLASH_MODE_OFF
458
+ }
459
+ Flash .Auto -> {
460
+ ImageCapture .FLASH_MODE_AUTO
461
+ }
462
+ }
463
+ caseFlashMode()
464
+ }
465
+
316
466
317
467
private fun getScreenWidth (): Int {
318
468
return if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .R ) {
@@ -374,6 +524,7 @@ class CameraActivity : AppCompatActivity() {
374
524
.setCaptureMode(ImageCapture .CAPTURE_MODE_MINIMIZE_LATENCY )
375
525
.setTargetAspectRatio(aspectRadio(optionsCamera.ratio))
376
526
.setTargetRotation(ROTATION_0 )
527
+ .setFlashMode(flashMode)
377
528
.build()
378
529
cameraProvider.unbindAll()
379
530
@@ -393,6 +544,13 @@ class CameraActivity : AppCompatActivity() {
393
544
return if (path.exists()) path else filesDir
394
545
}
395
546
547
+ fun getPickImageIntent () {
548
+ val intent = Intent (Intent .ACTION_GET_CONTENT )
549
+ intent.type = " image/*"
550
+ intent.putExtra(Intent .EXTRA_ALLOW_MULTIPLE , false )
551
+ resultGallery.launch(intent)
552
+ }
553
+
396
554
private fun getListPath (list : ArrayList <String >) {
397
555
val result = Intent ()
398
556
result.putExtra(IMAGE_RESULTS , list)
0 commit comments