Skip to content

Commit 44bca60

Browse files
committed
Choose Multiple images from gallery
1 parent f04717d commit 44bca60

File tree

7 files changed

+256
-84
lines changed

7 files changed

+256
-84
lines changed

EasyMediaPicker/src/main/java/com/bn/easypicker/EasyPicker.kt

Lines changed: 94 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import android.net.Uri
99
import android.os.Build
1010
import android.provider.MediaStore
1111
import android.util.Log
12+
import android.widget.Toast
1213
import androidx.activity.result.ActivityResultLauncher
1314
import androidx.activity.result.contract.ActivityResultContracts
1415
import androidx.fragment.app.FragmentActivity
@@ -70,7 +71,11 @@ class EasyPicker(
7071
var btnBackground: Int = R.drawable.bg_et_silver
7172
var textColor: Int = R.color.black
7273
var mListener = object : OnCaptureMedia {
73-
override fun onCaptureMedia(request: Int, file: FileResource) {
74+
override fun onCaptureMedia(
75+
request: Int,
76+
file: ArrayList<FileResource>?,
77+
) {
78+
7479
}
7580
}
7681

@@ -123,33 +128,68 @@ class EasyPicker(
123128
getImageUri(mContext, result.data!!.extras!!.get("data") as Bitmap)!!
124129
}
125130

126-
CoroutineScope(Dispatchers.Main).launch {
127-
var resulting: FileResource? = null
131+
CoroutineScope(Main).launch {
132+
var resulting: ArrayList<FileResource> = ArrayList()
128133
async {
129134
try {
130-
resulting = MediaStoreUtils.getResourceByUri(mContext, imageUri)
135+
resulting.add(MediaStoreUtils.getResourceByUri(mContext, imageUri))
131136
} catch (e: Exception) {
132137
try {
133138
Log.e("ExceptionVideo", ">>> Exception Video First: ${e.message}")
134-
resulting = FileResource(
139+
resulting.add(FileResource(
135140
uri = imageUri,
136141
path = FilesVersionUtil.getRealPathFromUri(mContext, imageUri)
137-
)
142+
))
138143
} catch (e: Exception) {
139144
Log.e("ExceptionVideo", ">>> Exception Video: ${e.message}")
140145
}
141146
}
142147
}.await()
143-
mListener.onCaptureMedia(request, resulting!!)
148+
mListener.onCaptureMedia(request, resulting)
149+
}
150+
}
151+
}
152+
private var multiImageLauncher =
153+
act.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
154+
if (result.resultCode == Activity.RESULT_OK) {
155+
if (result.data?.clipData != null) {
156+
val count: Int = result.data?.clipData?.itemCount ?: 0
157+
158+
var images: ArrayList<FileResource> = ArrayList()
159+
for (i in 0 until count) {
160+
val imageUri: Uri = try {
161+
result.data?.clipData?.getItemAt(i)?.uri!!
162+
} catch (e: Exception) {
163+
getImageUri(
164+
mContext,
165+
result.data?.clipData?.getItemAt(i)?.uri!! as Bitmap
166+
)!!
167+
}
168+
169+
images.add(
170+
FileResource(
171+
uri = imageUri,
172+
path = FilesVersionUtil.getRealPathFromUri(
173+
mContext,
174+
imageUri
175+
)
176+
)
177+
)
178+
}
179+
if(images.isNotEmpty()) mListener.onCaptureMedia(request, files = images)
180+
} else {
181+
Toast.makeText(mContext, "Can't pick your images", Toast.LENGTH_SHORT)
144182
}
183+
145184
}
146185
}
147186

148187

149188
private var takeImageLauncher =
150189
act.registerForActivityResult(ActivityResultContracts.TakePicture()) { result ->
151-
CoroutineScope(Dispatchers.Main).launch {
152-
var resulting: FileResource? = null
190+
CoroutineScope(Main).launch {
191+
var resulting: ArrayList<FileResource> = ArrayList()
192+
153193
if (!result) {
154194
try {
155195
deleteUriFile(mPath, act)
@@ -160,20 +200,20 @@ class EasyPicker(
160200
}
161201
async {
162202
try {
163-
resulting = MediaStoreUtils.getResourceByUri(mContext, mPath)
203+
resulting.add(MediaStoreUtils.getResourceByUri(mContext, mPath))
164204
} catch (e: Exception) {
165205
try {
166206
Log.e("ExceptionVideo", ">>> Exception Video First: ${e.message}")
167-
resulting = FileResource(
207+
resulting.add(FileResource(
168208
uri = mPath,
169209
path = FilesVersionUtil.getRealPathFromUri(mContext, mPath)
170-
)
210+
))
171211
} catch (e: Exception) {
172212
Log.e("ExceptionVideo", ">>> Exception Video: ${e.message}")
173213
}
174214
}
175215
}.await()
176-
mListener.onCaptureMedia(request, resulting!!)
216+
mListener.onCaptureMedia(request, resulting)
177217
}
178218
}
179219

@@ -184,29 +224,29 @@ class EasyPicker(
184224
val data: Intent? = result.data
185225
val imageUri: Uri = data?.data!!
186226

187-
CoroutineScope(Dispatchers.Main).launch {
188-
var resulting: FileResource? = null
227+
CoroutineScope(Main).launch {
228+
var resulting: ArrayList<FileResource> = ArrayList()
189229
async {
190230
try {
191-
resulting = MediaStoreUtils.getResourceByUri(mContext, imageUri)
231+
resulting.add(MediaStoreUtils.getResourceByUri(mContext, imageUri))
192232
} catch (e: Exception) {
193233
try {
194234
Log.e("ExceptionVideo", ">>> Exception Video First: ${e.message}")
195-
resulting = FileResource(
235+
resulting.add(FileResource(
196236
uri = imageUri,
197237
path = FilesVersionUtil.getRealPathFromUri(mContext, imageUri)
198238
?: getPathFromURI(mContext, imageUri)
199-
)
239+
))
200240
} catch (e: Exception) {
201241
try {
202-
resulting = MediaStoreUtils.getResourceByUri(mContext, imageUri)
242+
resulting.add(MediaStoreUtils.getResourceByUri(mContext, imageUri))
203243
} catch (e: Exception) {
204244
Log.e("ExceptionVideo", ">>> Exception Video: ${e.message}")
205245
}
206246
}
207247
}
208248
}.await()
209-
mListener.onCaptureMedia(request, resulting!!)
249+
mListener.onCaptureMedia(request, resulting)
210250
}
211251
}
212252
}
@@ -228,19 +268,20 @@ class EasyPicker(
228268
act.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
229269
if (result.resultCode == Activity.RESULT_OK) {
230270
val imageUri = result.data?.data!!
231-
CoroutineScope(Dispatchers.Main).launch {
232-
var resulting: FileResource? = null
271+
CoroutineScope(Main).launch {
272+
var resulting: ArrayList<FileResource> = ArrayList()
233273
async {
234-
resulting = try {
235-
MediaStoreUtils.getResourceByUri(mContext, imageUri)
274+
275+
try {
276+
resulting.add(MediaStoreUtils.getResourceByUri(mContext, imageUri))
236277
} catch (e: Exception) {
237278
FileResource(
238279
uri = imageUri,
239280
path = FilesVersionUtil.getRealPathFromUri(mContext, imageUri)
240281
)
241282
}
242283
}.await()
243-
resulting?.path?.let {
284+
resulting[0].path?.let {
244285
CoroutineScope(Dispatchers.Default).launch {
245286
val compressedImageFile: String =
246287
withContext(Dispatchers.Default) {
@@ -250,9 +291,9 @@ class EasyPicker(
250291
"${System.currentTimeMillis()}"
251292
)
252293
}
253-
withContext(Dispatchers.Main) {
254-
resulting?.path = compressedImageFile
255-
mListener.onCaptureMedia(request, resulting!!)
294+
withContext(Main) {
295+
resulting[0].path = compressedImageFile
296+
mListener.onCaptureMedia(request, resulting)
256297
}
257298
}
258299
}
@@ -267,31 +308,34 @@ class EasyPicker(
267308
val data: Intent? = result.data
268309
val imageUri: Uri = data?.data!!
269310

270-
CoroutineScope(Dispatchers.Main).launch {
271-
var resulting: FileResource? = null
311+
CoroutineScope(Main).launch {
312+
var resulting: ArrayList<FileResource> = ArrayList()
272313
async {
273314
try {
274-
resulting = MediaStoreUtils.getResourceByUri(mContext, imageUri)
315+
resulting.add(MediaStoreUtils.getResourceByUri(mContext, imageUri))
275316
} catch (e: Exception) {
276317
try {
277318
Log.e("ExceptionVideo", ">>> Exception Video First: ${e.message}")
278-
resulting = FileResource(
319+
resulting.add(FileResource(
279320
uri = imageUri,
280321
path = FilesVersionUtil.getRealPathFromUri(mContext, imageUri)
281-
)
322+
))
282323
} catch (e: Exception) {
283324
Log.e("ExceptionVideo", ">>> Exception Video: ${e.message}")
284325
}
285326
}
286327
}.await()
287-
mListener.onCaptureMedia(request, resulting!!)
328+
mListener.onCaptureMedia(request, resulting)
288329
}
289330
}
290331
}
291332

292333

293334
private fun checkPermission(): Boolean {
294-
return if (Build.VERSION.SDK_INT > 32) PermissionUtils.hasPermissions(act, PermissionUtils.NEW_IMAGE_PERMISSIONS)
335+
return if (Build.VERSION.SDK_INT > 32) PermissionUtils.hasPermissions(
336+
act,
337+
PermissionUtils.NEW_IMAGE_PERMISSIONS
338+
)
295339
else PermissionUtils.hasPermissions(act, PermissionUtils.IMAGE_PERMISSIONS)
296340
}
297341

@@ -303,6 +347,21 @@ class EasyPicker(
303347
}
304348
}
305349

350+
fun chooseMultipleImages() {
351+
if (checkPermission()) {
352+
val intent = Intent(
353+
Intent.ACTION_PICK,
354+
MediaStore.Images.Media.INTERNAL_CONTENT_URI
355+
).apply {
356+
type = "image/*"
357+
}
358+
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
359+
multiImageLauncher.launch(intent)
360+
} else {
361+
PickActions.openStorageRequest(act, resultLauncher)
362+
}
363+
}
364+
306365
fun chooseAndCompressImage() {
307366
if (checkPermission()) {
308367
val intent = Intent(

0 commit comments

Comments
 (0)