Skip to content

Commit 5a6a75d

Browse files
Merge pull request #1 from AlfredoHdez1709/develop
Develop
2 parents 62f28c2 + a40fbae commit 5a6a75d

File tree

14 files changed

+297
-23
lines changed

14 files changed

+297
-23
lines changed

EasyCameraAndGallery/src/main/java/dev/ahrsoft/easycameraandgallery/CameraActivity.kt

Lines changed: 169 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.ahrsoft.easycameraandgallery
22

33
import android.annotation.SuppressLint
4+
import android.app.Activity
45
import android.content.ContentUris
56
import android.content.ContentValues
67
import android.content.Intent
@@ -13,6 +14,7 @@ import android.net.Uri
1314
import android.os.Build
1415
import android.os.Bundle
1516
import android.os.Environment
17+
import android.provider.DocumentsContract
1618
import android.provider.MediaStore
1719
import android.util.DisplayMetrics
1820
import android.util.Log
@@ -21,6 +23,8 @@ import android.view.View
2123
import android.view.WindowInsets
2224
import android.webkit.MimeTypeMap
2325
import android.widget.Toast
26+
import androidx.activity.result.ActivityResultLauncher
27+
import androidx.activity.result.contract.ActivityResultContracts
2428
import androidx.appcompat.app.AppCompatActivity
2529
import androidx.camera.core.*
2630
import androidx.camera.lifecycle.ProcessCameraProvider
@@ -52,6 +56,7 @@ class CameraActivity : AppCompatActivity() {
5256

5357
private var cameraProvider: ProcessCameraProvider? = null
5458
private var lensFacing: Int = CameraSelector.LENS_FACING_BACK
59+
private var flashMode: Int = ImageCapture.FLASH_MODE_OFF
5560
private var preview: Preview? = null
5661
private var imageCapture: ImageCapture? = null
5762
private lateinit var outputDirectory: File
@@ -61,46 +66,174 @@ class CameraActivity : AppCompatActivity() {
6166
private val imageList = arrayListOf<ImageModel>()
6267
private val imageSelected = arrayListOf<ImageModel>()
6368
private lateinit var adapter: GalleryAdapter
69+
private lateinit var resultGallery: ActivityResultLauncher<Intent>
70+
6471

6572
override fun onCreate(savedInstanceState: Bundle?) {
6673
super.onCreate(savedInstanceState)
6774
binding = ActivityCameraBinding.inflate(layoutInflater)
6875
val view = binding.root
6976
setContentView(view)
77+
if (allPermissionsGranted()) {
78+
startCamera()
79+
getAllImageFromGallery()
80+
} else {
81+
ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS)
82+
}
83+
7084
initUI()
7185
}
7286

7387
private fun initUI() {
7488
optionsCamera = (intent.getSerializableExtra("options") as? OptionsCamera)!!
89+
flashModeOptions(optionsCamera.flash)
90+
7591
with(binding) {
92+
galleryCaptureButton.setOnClickListener {
93+
getPickImageIntent()
94+
}
7695
cameraCaptureButton.setOnClickListener {
7796
takePhoto()
7897
}
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+
79126
fabSendData.setOnClickListener {
80127
val list = imageSelected.map {
81128
it.image
82129
}
83130
getListPath(list as ArrayList<String>)
84131
}
85132
}
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+
}
91172
}
92173
}
93174

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+
94223
private fun startCamera() {
95224
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
96225
cameraProviderFuture.addListener({
97226
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+
}
104237
bindCameraUseCases()
105238
}, ContextCompat.getMainExecutor(this))
106239
}
@@ -109,9 +242,11 @@ class CameraActivity : AppCompatActivity() {
109242
if (isCompleteSelect){
110243
binding.fabSendData.visibility = View.VISIBLE
111244
binding.cameraCaptureButton.visibility = View.GONE
245+
binding.galleryCaptureButton.visibility = View.GONE
112246
}else{
113247
binding.fabSendData.visibility = View.GONE
114248
binding.cameraCaptureButton.visibility = View.VISIBLE
249+
binding.galleryCaptureButton.visibility = View.VISIBLE
115250
}
116251
}
117252

@@ -313,6 +448,21 @@ class CameraActivity : AppCompatActivity() {
313448
}
314449
}
315450

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+
316466

317467
private fun getScreenWidth(): Int {
318468
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
@@ -374,6 +524,7 @@ class CameraActivity : AppCompatActivity() {
374524
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
375525
.setTargetAspectRatio(aspectRadio(optionsCamera.ratio))
376526
.setTargetRotation(ROTATION_0)
527+
.setFlashMode(flashMode)
377528
.build()
378529
cameraProvider.unbindAll()
379530

@@ -393,6 +544,13 @@ class CameraActivity : AppCompatActivity() {
393544
return if (path.exists()) path else filesDir
394545
}
395546

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+
396554
private fun getListPath(list: ArrayList<String>) {
397555
val result = Intent()
398556
result.putExtra(IMAGE_RESULTS, list)

EasyCameraAndGallery/src/main/java/dev/ahrsoft/easycameraandgallery/OptionsCamera.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ import java.io.Serializable
88
data class OptionsCamera(
99
var count : Int = 1,
1010
var path : String = "EasyCamera/",
11-
var flash: Flash = Flash.Disabled,
11+
var flash: Flash = Flash.Auto,
1212
var isFrontFacing : Boolean = false,
1313
var ratio : Ratio = Ratio.RATIO_AUTO
1414
) : Serializable
1515

1616
@Parcelize
1717
enum class Flash : Parcelable {
18-
Disabled, On, Off, Auto
18+
On, Off, Auto
1919
}
2020

2121
@Parcelize
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<shape xmlns:android="http://schemas.android.com/apk/res/android">
3+
<gradient
4+
android:type="linear"
5+
android:angle="90"
6+
android:startColor="@color/black"
7+
android:endColor="@color/transparent" />
8+
</shape>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<shape
3+
xmlns:android="http://schemas.android.com/apk/res/android"
4+
android:shape="rectangle" >
5+
<gradient
6+
android:angle="90"
7+
android:startColor="@color/transparent"
8+
android:endColor="@color/black"
9+
android:type="linear" />
10+
</shape>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<vector android:height="24dp" android:tint="@android:color/white"
2+
android:viewportHeight="24" android:viewportWidth="24"
3+
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
4+
<path android:fillColor="@android:color/white" android:pathData="M10,20L5,20v2h5v2l3,-3 -3,-3v2zM14,20v2h5v-2h-5zM12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -1.99,0.9 -1.99,2S10.9,8 12,8zM17,0L7,0C5.9,0 5,0.9 5,2v14c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,2c0,-1.1 -0.9,-2 -2,-2zM7,2h10v10.5c0,-1.67 -3.33,-2.5 -5,-2.5s-5,0.83 -5,2.5L7,2z"/>
5+
</vector>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<vector android:height="24dp" android:tint="@android:color/white"
2+
android:viewportHeight="24" android:viewportWidth="24"
3+
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
4+
<path android:fillColor="@android:color/white" android:pathData="M10,20L5,20v2h5v2l3,-3 -3,-3v2zM14,20v2h5v-2h-5zM17,0L7,0C5.9,0 5,0.9 5,2v14c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,2c0,-1.1 -0.9,-2 -2,-2zM12,6c-1.11,0 -2,-0.9 -2,-2s0.89,-2 1.99,-2 2,0.9 2,2C14,5.1 13.1,6 12,6z"/>
5+
</vector>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<vector android:height="24dp" android:tint="@android:color/white"
2+
android:viewportHeight="24" android:viewportWidth="24"
3+
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
4+
<path android:fillColor="@android:color/white" android:pathData="M3,2v12h3v9l7,-12L9,11l4,-9L3,2zM19,2h-2l-3.2,9h1.9l0.7,-2h3.2l0.7,2h1.9L19,2zM16.85,7.65L18,4l1.15,3.65h-2.3z"/>
5+
</vector>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<vector android:height="24dp" android:tint="@android:color/white"
2+
android:viewportHeight="24" android:viewportWidth="24"
3+
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
4+
<path android:fillColor="@android:color/white" android:pathData="M3.27,3L2,4.27l5,5V13h3v9l3.58,-6.14L17.73,20 19,18.73 3.27,3zM17,10h-4l4,-8H7v2.18l8.46,8.46L17,10z"/>
5+
</vector>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<vector android:height="24dp" android:tint="@android:color/white"
2+
android:viewportHeight="24" android:viewportWidth="24"
3+
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
4+
<path android:fillColor="@android:color/white" android:pathData="M7,2v11h3v9l7,-12h-4l4,-8z"/>
5+
</vector>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<vector android:height="24dp" android:tint="#FFFFFF"
2+
android:viewportHeight="24" android:viewportWidth="24"
3+
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
4+
<path android:fillColor="@android:color/white" android:pathData="M21,19V5c0,-1.1 -0.9,-2 -2,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM8.5,13.5l2.5,3.01L14.5,12l4.5,6H5l3.5,-4.5z"/>
5+
</vector>

0 commit comments

Comments
 (0)