From e15e41a54bc8669a6b95465bdce083c237a5333c Mon Sep 17 00:00:00 2001 From: zhangmengxiong Date: Fri, 15 Jul 2022 13:59:40 +0800 Subject: [PATCH 1/2] v1.5.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 优化目录缺少部分照片的问题 --- ImagePickerLib/build.gradle | 2 +- .../com/mx/imgpicker/app/picker/MXPickerVM.kt | 38 +++++++++++++ .../java/com/mx/imgpicker/db/MXDBSource.kt | 56 ++++++++++++++++--- .../com/mx/imgpicker/db/MXSQLiteOpenHelper.kt | 4 +- .../java/com/mx/imgpicker/utils/MXUtils.kt | 7 +++ build.gradle | 2 +- 6 files changed, 99 insertions(+), 10 deletions(-) diff --git a/ImagePickerLib/build.gradle b/ImagePickerLib/build.gradle index b15d7e3..ec5b19d 100644 --- a/ImagePickerLib/build.gradle +++ b/ImagePickerLib/build.gradle @@ -33,7 +33,7 @@ afterEvaluate { groupId = 'com.mx.imgpicker' artifactId = 'MXImagePicker' - version = '1.5.0' + version = '1.5.1' } } } diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt index e4a1809..d25390e 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt @@ -80,6 +80,7 @@ internal class MXPickerVM : ViewModel() { startScanVideo(context) } } + startScanAllDirs() folderList.postValue(getFolderGroup()) } } @@ -120,6 +121,43 @@ internal class MXPickerVM : ViewModel() { } } + /** + * 搜索文件夹 + */ + private fun startScanAllDirs() { + val dirs = sourceDB.getAllDirs() + if (dirs.isEmpty()) return + for (dir in dirs) { + val list = dir.listFiles() + if (list == null || list.isEmpty()) continue + val mediaList = ArrayList() + for (file in list) { + val ext = file.extension + if (ext in MXUtils.IMAGE_EXT) { + mediaList.add( + MXItem( + file.absolutePath, + file.lastModified(), + MXPickerType.Image + ) + ) + } else if (ext in MXUtils.VIDEO_EXT) { + mediaList.add( + MXItem( + file.absolutePath, + file.lastModified(), + MXPickerType.Video + ) + ) + } + } + MXUtils.log("扫描目录 --> ${dir.absolutePath} ${mediaList.size}") + if (mediaList.isNotEmpty()) { + sourceDB.addSysSource(mediaList) + } + } + } + fun addPrivateSource(file: File, type: MXPickerType) { sourceDB.addPrivateSource(file, type) } diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt index 7575ea7..8b9f44d 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt @@ -25,6 +25,7 @@ internal class MXDBSource(val context: Context) { try { val values = ContentValues() values.put(MXSQLiteOpenHelper.DB_KEY_PATH, file.absolutePath) + values.put(MXSQLiteOpenHelper.DB_KEY_DIR, file.parentFile?.absolutePath) values.put(MXSQLiteOpenHelper.DB_KEY_TYPE, type.value) values.put(MXSQLiteOpenHelper.DB_KEY_PRIVATE, MXSQLiteOpenHelper.VALUE_PRIVATE_APP) values.put(MXSQLiteOpenHelper.DB_KEY_TIME, (System.currentTimeMillis() / 1000)) @@ -46,20 +47,22 @@ internal class MXDBSource(val context: Context) { val insertSql = "replace into ${MXSQLiteOpenHelper.DB_NAME}(" + "${MXSQLiteOpenHelper.DB_KEY_PATH}, " + + "${MXSQLiteOpenHelper.DB_KEY_DIR}, " + "${MXSQLiteOpenHelper.DB_KEY_TYPE}, " + "${MXSQLiteOpenHelper.DB_KEY_PRIVATE}, " + "${MXSQLiteOpenHelper.DB_KEY_TIME}, " + "${MXSQLiteOpenHelper.DB_KEY_VIDEO_LENGTH}) " + - "values(?,?,?,?,?)" + "values(?,?,?,?,?,?)" val stat = database.compileStatement(insertSql) database.beginTransaction() try { for (item in list) { stat.bindString(1, item.path) - stat.bindString(2, item.type.value) - stat.bindString(3, MXSQLiteOpenHelper.VALUE_PRIVATE_SYS) - stat.bindLong(4, item.time) - stat.bindLong(5, item.duration.toLong()) + stat.bindString(2, File(item.path).parentFile?.absolutePath) + stat.bindString(3, item.type.value) + stat.bindString(4, MXSQLiteOpenHelper.VALUE_PRIVATE_SYS) + stat.bindLong(5, item.time) + stat.bindLong(6, item.duration.toLong()) stat.executeInsert() } database.setTransactionSuccessful() @@ -160,6 +163,40 @@ internal class MXDBSource(val context: Context) { return sourceList } + fun getAllDirs(): ArrayList { + val dirs = ArrayList() + synchronized(lock) { + val database = dbHelp.writableDatabase + var cursor: Cursor? = null + try { + val selectSql = + "select ${MXSQLiteOpenHelper.DB_KEY_DIR} from ${MXSQLiteOpenHelper.DB_NAME} group by ${MXSQLiteOpenHelper.DB_KEY_DIR}" + cursor = database.rawQuery(selectSql, arrayOf()) + if (cursor != null && cursor.moveToFirst()) { + do { + val dir = cursor.getString( + cursor.getColumnIndexOrThrow(MXSQLiteOpenHelper.DB_KEY_DIR) + ) + val dirFile = File(dir) + if (!dirFile.exists()) continue + val child = dirFile.listFiles() + if (child == null || child.isEmpty()) continue + dirs.add(dirFile) + } while (cursor.moveToNext()) + } + } catch (e: Exception) { + e.printStackTrace() + } finally { + try { + cursor?.close() + } catch (e: Exception) { + } + database.close() + } + } + return dirs + } + /** * 指针转换成对象 */ @@ -171,13 +208,18 @@ internal class MXDBSource(val context: Context) { val isPrivate = cursor.getString(cursor.getColumnIndexOrThrow(MXSQLiteOpenHelper.DB_KEY_PRIVATE)) == MXSQLiteOpenHelper.VALUE_PRIVATE_APP - val path = cursor.getString(cursor.getColumnIndexOrThrow(MXSQLiteOpenHelper.DB_KEY_PATH)) + val path = + cursor.getString(cursor.getColumnIndexOrThrow(MXSQLiteOpenHelper.DB_KEY_PATH)) var duration = cursor.getLong(cursor.getColumnIndexOrThrow(MXSQLiteOpenHelper.DB_KEY_VIDEO_LENGTH)) val file = File(path) if (!file.exists() && !isPrivate) { - database.delete(MXSQLiteOpenHelper.DB_NAME, "${MXSQLiteOpenHelper.DB_KEY_PATH} = ?", arrayOf(path)) + database.delete( + MXSQLiteOpenHelper.DB_NAME, + "${MXSQLiteOpenHelper.DB_KEY_PATH} = ?", + arrayOf(path) + ) return null } val time = file.lastModified() diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXSQLiteOpenHelper.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXSQLiteOpenHelper.kt index 2214ac1..fc20d24 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXSQLiteOpenHelper.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXSQLiteOpenHelper.kt @@ -4,9 +4,10 @@ import android.content.Context import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper -internal class MXSQLiteOpenHelper(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, 1) { +internal class MXSQLiteOpenHelper(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, 2) { companion object { internal const val DB_NAME = "mx_image_picker_db_v2" + internal const val DB_KEY_DIR = "picker_dir" internal const val DB_KEY_PATH = "picker_path" internal const val DB_KEY_TYPE = "picker_type" internal const val DB_KEY_PRIVATE = "private" @@ -19,6 +20,7 @@ internal class MXSQLiteOpenHelper(context: Context) : SQLiteOpenHelper(context, private const val DB_CREATE = "create table $DB_NAME(" + "$DB_KEY_PATH varchar(500) PRIMARY KEY," + + "$DB_KEY_DIR varchar(500) ," + "$DB_KEY_TYPE varchar(20) ," + "$DB_KEY_PRIVATE varchar(2) ," + "$DB_KEY_TIME long," + diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/MXUtils.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/MXUtils.kt index 2ad27cd..1b223f5 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/MXUtils.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/MXUtils.kt @@ -9,6 +9,13 @@ import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat internal object MXUtils { + val IMAGE_EXT = arrayOf( + "svg", "png", "webp", "jpg", "jpeg", "gif", "bmp", "heic", "heif" + ) + val VIDEO_EXT = arrayOf( + "mp4", "3gp", "mov", "m4a", "ts", "webm", "mkv" + ) + private var isDebug = false fun setDebug(debug: Boolean) { isDebug = debug diff --git a/build.gradle b/build.gradle index 649d900..dbcb83e 100644 --- a/build.gradle +++ b/build.gradle @@ -37,5 +37,5 @@ ext { minSdkVersion = 19 versionCode = 1 - versionName = "1.0.1" + versionName = "1.5.1" } \ No newline at end of file -- Gitee From e3b56f54356ea3292bc8c65d65528316dcf4d1c7 Mon Sep 17 00:00:00 2001 From: zhangmengxiong Date: Fri, 15 Jul 2022 14:01:03 +0800 Subject: [PATCH 2/2] Update MXPickerVM.kt --- .../src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt index d25390e..c2b1a80 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/app/picker/MXPickerVM.kt @@ -132,7 +132,7 @@ internal class MXPickerVM : ViewModel() { if (list == null || list.isEmpty()) continue val mediaList = ArrayList() for (file in list) { - val ext = file.extension + val ext = file.extension?.lowercase() if (ext in MXUtils.IMAGE_EXT) { mediaList.add( MXItem( -- Gitee