From 9755d9eefb12f95fa45c785e526038e10c9c7115 Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期五, 25 四月 2025 18:15:51 +0800
Subject: [PATCH] 短信fix

---
 app/src/main/java/com/example/firstapp/database/entity/Msg.kt                |    1 
 app/src/main/java/com/example/firstapp/database/repository/CodeRepository.kt |    4 
 app/src/main/java/com/example/firstapp/receiver/SmsReceiver.kt               |  150 ++++++++++++++---------------
 app/src/main/java/com/example/firstapp/MainActivity.kt                       |   49 ++++-----
 app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt               |    6 
 app/src/main/java/com/example/firstapp/database/entity/Code.kt               |    1 
 app/src/main/java/com/example/firstapp/utils/CodeUtils.kt                    |   78 +++++++--------
 app/src/main/res/drawable/invite.png                                         |    0 
 8 files changed, 138 insertions(+), 151 deletions(-)

diff --git a/app/src/main/java/com/example/firstapp/MainActivity.kt b/app/src/main/java/com/example/firstapp/MainActivity.kt
index 5dced23..f0be7b9 100644
--- a/app/src/main/java/com/example/firstapp/MainActivity.kt
+++ b/app/src/main/java/com/example/firstapp/MainActivity.kt
@@ -65,9 +65,9 @@
                 }
             }
         }
-        
+
     // 通知权限请求
-    private val notificationPermissionRequest = 
+    private val notificationPermissionRequest =
         registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
             if (isGranted) {
                 // 权限已授予
@@ -97,25 +97,25 @@
 
         // 重置提醒计划并检查是否有错过的提醒
         resetReminders()
-        
+
         // 开始权限请求流程
         startPermissionsFlow()
     }
 
     override fun onResume() {
         super.onResume()
-        
+
         // 每次恢复活动时检查短信权限
         checkAndHandleSmsPermissions(showDialog = false)
     }
-    
+
     // 权限请求主流程
     private fun startPermissionsFlow() {
         // 先请求通知权限,再请求短信权限
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
             // Android 13+ 需要通知权限
             if (ContextCompat.checkSelfPermission(
-                    this, 
+                    this,
                     Manifest.permission.POST_NOTIFICATIONS
                 ) != PackageManager.PERMISSION_GRANTED
             ) {
@@ -129,7 +129,7 @@
             requestSmsPermissions()
         }
     }
-    
+
     // 请求短信权限
     private fun requestSmsPermissions() {
         if (!hasSmsPermissions()) {
@@ -148,7 +148,7 @@
             }
         }
     }
-    
+
     // 检查并处理短信权限(可选是否显示对话框)
     private fun checkAndHandleSmsPermissions(showDialog: Boolean = true) {
         if (!hasSmsPermissions()) {
@@ -162,17 +162,17 @@
             }
         }
     }
-    
+
     // 检查是否有短信权限
     private fun hasSmsPermissions(): Boolean {
         return ContextCompat.checkSelfPermission(
             this, Manifest.permission.RECEIVE_SMS
-        ) == PackageManager.PERMISSION_GRANTED && 
-        ContextCompat.checkSelfPermission(
-            this, Manifest.permission.READ_SMS
-        ) == PackageManager.PERMISSION_GRANTED
+        ) == PackageManager.PERMISSION_GRANTED &&
+                ContextCompat.checkSelfPermission(
+                    this, Manifest.permission.READ_SMS
+                ) == PackageManager.PERMISSION_GRANTED
     }
-    
+
     // 显示短信权限解释对话框
     private fun showSmsPermissionExplanationDialog() {
         AlertDialog.Builder(this)
@@ -188,13 +188,13 @@
             .setCancelable(false)
             .show()
     }
-    
+
     // 提供给外部调用的请求通知权限方法
     fun requestNotificationPermission() {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
             // 判断是否已经有通知权限
             if (ContextCompat.checkSelfPermission(
-                    this, 
+                    this,
                     Manifest.permission.POST_NOTIFICATIONS
                 ) != PackageManager.PERMISSION_GRANTED
             ) {
@@ -211,7 +211,7 @@
     private fun registerSmsReceiver() {
         // 确保不重复注册
         if (smsReceiver != null) return
-        
+
         Log.d("SMS_DEBUG", "MainActivity注册短信接收器")
         smsReceiver = SmsReceiver()
         val filter = IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)
@@ -304,8 +304,7 @@
                                                 company = response.data.details.company,
                                                 pickupCode = response.data.details.pickupCode,
                                                 address = response.data.details.address,
-                                                time = response.data.details.time,
-                                                smsTimestamp = datetime  // 添加短信时间戳
+                                                time = response.data.details.time
                                             )
                                             CodeUtils.saveCode(code)
                                         }
@@ -320,8 +319,7 @@
                                                 date = response.data.details.date,
                                                 address = response.data.details.address,
                                                 minAmount = response.data.details.min_amount,
-                                                number = response.data.details.number,
-                                                smsTimestamp = datetime  // 添加短信时间戳
+                                                number = response.data.details.number
                                             )
                                             CodeUtils.saveCode(code)
                                         }
@@ -334,8 +332,7 @@
                                                 amount = response.data.details.amount,
                                                 datetime = response.data.details.datetime,
                                                 address = response.data.details.address,
-                                                balance = response.data.details.balance,
-                                                smsTimestamp = datetime  // 添加短信时间戳
+                                                balance = response.data.details.balance
                                             )
                                             CodeUtils.saveCode(code)
                                         }
@@ -349,8 +346,7 @@
                                                 end = response.data.details.end,
                                                 seat = response.data.details.seat,
                                                 time = response.data.details.time,
-                                                address = response.data.details.address,
-                                                smsTimestamp = datetime  // 添加短信时间戳
+                                                address = response.data.details.address
                                             )
                                             CodeUtils.saveCode(code)
                                         }
@@ -363,8 +359,7 @@
                                                 seat = response.data.details.seat,
                                                 time = response.data.details.time,
                                                 address = response.data.details.address,
-                                                trips = response.data.details.trips,
-                                                smsTimestamp = datetime  // 添加短信时间戳
+                                                trips = response.data.details.trips
                                             )
                                             CodeUtils.saveCode(code)
                                         }
diff --git a/app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt b/app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt
index 4cc2795..a9a03af 100644
--- a/app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt
+++ b/app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt
@@ -62,10 +62,12 @@
         SELECT * FROM Code 
         WHERE category = :category 
         AND code = :code 
-        AND (smsTimestamp = :smsTimestamp )
+        AND substr(createTime, 1, 10) = substr(:dateString, 1, 10)
+        ANd pickup = '0'
+        ORDER BY createTime DESC
         LIMIT 1
     """)
-    fun queryByTypeAndCodeAndDate(category: String, code: String, smsTimestamp: Long): Code?
+    fun queryByTypeAndCodeAndDate(category: String, code: String, dateString: String): Code?
 
 
     @Query("update  Code set pickup = '1' ,  pickuptime = CURRENT_TIMESTAMP  where id=:id")
diff --git a/app/src/main/java/com/example/firstapp/database/entity/Code.kt b/app/src/main/java/com/example/firstapp/database/entity/Code.kt
index 3dbfea4..93d0e8a 100644
--- a/app/src/main/java/com/example/firstapp/database/entity/Code.kt
+++ b/app/src/main/java/com/example/firstapp/database/entity/Code.kt
@@ -21,6 +21,5 @@
     var overTime: String,     //快递超期时间、还款日期
     var address: String,      //地址信息
     var remarks: String,      //备注信息保存
-    var smsTimestamp: Long = 0,  // 新增短信时间戳字段
     var time: Date = Date(),
 )
diff --git a/app/src/main/java/com/example/firstapp/database/entity/Msg.kt b/app/src/main/java/com/example/firstapp/database/entity/Msg.kt
index ac5caf9..5adf8a9 100644
--- a/app/src/main/java/com/example/firstapp/database/entity/Msg.kt
+++ b/app/src/main/java/com/example/firstapp/database/entity/Msg.kt
@@ -28,6 +28,7 @@
     //通话类型:1.来电挂机 2.去电挂机 3.未接来电 4.来电提醒 5.来电接通 6.去电拨出
     @ColumnInfo(name = "call_type", defaultValue = "0") var callType: Int = 0,
     @ColumnInfo(name = "time") var time: Date = Date(),
+    @ColumnInfo(name = "sms_timestamp", defaultValue = "0") var smsTimestamp: Long = 0,
 ) : Parcelable {
 
     val simImageId: Int
diff --git a/app/src/main/java/com/example/firstapp/database/repository/CodeRepository.kt b/app/src/main/java/com/example/firstapp/database/repository/CodeRepository.kt
index cafe7ea..19b6579 100644
--- a/app/src/main/java/com/example/firstapp/database/repository/CodeRepository.kt
+++ b/app/src/main/java/com/example/firstapp/database/repository/CodeRepository.kt
@@ -29,8 +29,8 @@
     }
 
     @WorkerThread
-    fun queryByTypeAndCodeAndDate(content: String, code: String, smsTimestamp: Long): Code? {
-        return codeDao.queryByTypeAndCodeAndDate(content, code, smsTimestamp)
+    fun queryByTypeAndCodeAndDate(content: String, code: String, dateString: String): Code? {
+        return codeDao.queryByTypeAndCodeAndDate(content, code, dateString)
     }
 
     @WorkerThread
diff --git a/app/src/main/java/com/example/firstapp/receiver/SmsReceiver.kt b/app/src/main/java/com/example/firstapp/receiver/SmsReceiver.kt
index fc12fec..dd3f62c 100644
--- a/app/src/main/java/com/example/firstapp/receiver/SmsReceiver.kt
+++ b/app/src/main/java/com/example/firstapp/receiver/SmsReceiver.kt
@@ -26,7 +26,10 @@
 
 
 class SmsReceiver : BroadcastReceiver() {
-
+    // 添加一个静态同步锁对象
+    companion object {
+        private val syncLock = Any()
+    }
     // 安全防护关键词数组
     private var securityKeywordsList = emptyList<String>()
 
@@ -39,15 +42,9 @@
                 val messages = arrayOfNulls<SmsMessage>(pdus.size)
                 val messageBody = StringBuilder()
 
-                // 获取短信时间戳(使用第一条短信的时间戳)
-                var timestamp: Long = 0
-
                 for (i in pdus.indices) {
                     messages[i] = SmsMessage.createFromPdu(pdus[i] as ByteArray)
                     messageBody.append(messages[i]?.messageBody)
-                    if (i == 0) {
-                        timestamp = messages[i]?.timestampMillis ?: System.currentTimeMillis()
-                    }
                 }
 
                 // 保存原始短信
@@ -76,82 +73,81 @@
                             val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
                             val createtime = sdf.format(date)
 
-                            // 根据不同类型处理数据
-                            when (response.data.category) {
-                                "快递" -> {
-                                    val code = CodeUtils.createExpressCode(
-                                        msgId = msgId,
-                                        createTime = createtime,
-                                        post = response.data.details.post,
-                                        company = response.data.details.company,
-                                        pickupCode = response.data.details.pickupCode,
-                                        address = response.data.details.address,
-                                        time = response.data.details.time,
-                                        smsTimestamp = timestamp  // 添加短信时间戳
-                                    )
-                                    CodeUtils.saveCode(code)
-                                }
+                            // 使用同步块处理保存操作
+                            synchronized(syncLock) {
+                                // 根据不同类型处理数据
+                                when (response.data.category) {
+                                    "快递" -> {
+                                        val code = CodeUtils.createExpressCode(
+                                            msgId = msgId,
+                                            createTime = createtime,
+                                            post = response.data.details.post,
+                                            company = response.data.details.company,
+                                            pickupCode = response.data.details.pickupCode,
+                                            address = response.data.details.address,
+                                            time = response.data.details.time
+                                        )
+                                        CodeUtils.saveCode(code)
+                                    }
 
-                                "还款" -> {
-                                    val code = CodeUtils.createRepaymentCode(
-                                        msgId = msgId,
-                                        createTime = createtime,
-                                        type = response.data.details.type,
-                                        bank = response.data.details.bank,
-                                        amount = response.data.details.amount,
-                                        date = response.data.details.date,
-                                        address = response.data.details.address,
-                                        minAmount = response.data.details.min_amount,
-                                        number = response.data.details.number,
-                                        smsTimestamp = timestamp  // 添加短信时间戳
-                                    )
-                                    CodeUtils.saveCode(code)
-                                }
+                                    "还款" -> {
+                                        val code = CodeUtils.createRepaymentCode(
+                                            msgId = msgId,
+                                            createTime = createtime,
+                                            type = response.data.details.type,
+                                            bank = response.data.details.bank,
+                                            amount = response.data.details.amount,
+                                            date = response.data.details.date,
+                                            address = response.data.details.address,
+                                            minAmount = response.data.details.min_amount,
+                                            number = response.data.details.number
+                                        )
+                                        CodeUtils.saveCode(code)
+                                    }
 
-                                "收入" -> {
-                                    val code = CodeUtils.createIncomeCode(
-                                        msgId = msgId,
-                                        createTime = createtime,
-                                        bank = response.data.details.bank,
-                                        amount = response.data.details.amount,
-                                        datetime = response.data.details.datetime,
-                                        address = response.data.details.address,
-                                        balance = response.data.details.balance,
-                                        smsTimestamp = timestamp  // 添加短信时间戳
-                                    )
-                                    CodeUtils.saveCode(code)
-                                }
+                                    "收入" -> {
+                                        val code = CodeUtils.createIncomeCode(
+                                            msgId = msgId,
+                                            createTime = createtime,
+                                            bank = response.data.details.bank,
+                                            amount = response.data.details.amount,
+                                            datetime = response.data.details.datetime,
+                                            address = response.data.details.address,
+                                            balance = response.data.details.balance
+                                        )
+                                        CodeUtils.saveCode(code)
+                                    }
 
-                                "航班" -> {
-                                    val code = CodeUtils.createFlightCode(
-                                        msgId = msgId,
-                                        createTime = createtime,
-                                        company = response.data.details.company,
-                                        start = response.data.details.start,
-                                        end = response.data.details.end,
-                                        seat = response.data.details.seat,
-                                        time = response.data.details.time,
-                                        address = response.data.details.address,
-                                        smsTimestamp = timestamp  // 添加短信时间戳
-                                    )
-                                    CodeUtils.saveCode(code)
-                                }
+                                    "航班" -> {
+                                        val code = CodeUtils.createFlightCode(
+                                            msgId = msgId,
+                                            createTime = createtime,
+                                            company = response.data.details.company,
+                                            start = response.data.details.start,
+                                            end = response.data.details.end,
+                                            seat = response.data.details.seat,
+                                            time = response.data.details.time,
+                                            address = response.data.details.address
+                                        )
+                                        CodeUtils.saveCode(code)
+                                    }
 
-                                "火车票" -> {
-                                    val code = CodeUtils.createTrainTicketCode(
-                                        msgId = msgId,
-                                        createTime = createtime,
-                                        company = response.data.details.company,
-                                        seat = response.data.details.seat,
-                                        time = response.data.details.time,
-                                        address = response.data.details.address,
-                                        trips = response.data.details.trips,
-                                        smsTimestamp = timestamp  // 添加短信时间戳
-                                    )
-                                    CodeUtils.saveCode(code)
+                                    "火车票" -> {
+                                        val code = CodeUtils.createTrainTicketCode(
+                                            msgId = msgId,
+                                            createTime = createtime,
+                                            company = response.data.details.company,
+                                            seat = response.data.details.seat,
+                                            time = response.data.details.time,
+                                            address = response.data.details.address,
+                                            trips = response.data.details.trips
+                                        )
+                                        CodeUtils.saveCode(code)
+                                    }
+
+                                    else -> {}
                                 }
                             }
-
                             // 发送广播通知数据已更新
                             val updateIntent = Intent("com.example.firstapp.DATA_UPDATED")
                             context.sendBroadcast(updateIntent)
diff --git a/app/src/main/java/com/example/firstapp/utils/CodeUtils.kt b/app/src/main/java/com/example/firstapp/utils/CodeUtils.kt
index bc7cbda..21e7762 100644
--- a/app/src/main/java/com/example/firstapp/utils/CodeUtils.kt
+++ b/app/src/main/java/com/example/firstapp/utils/CodeUtils.kt
@@ -7,37 +7,41 @@
 object CodeUtils {
     private const val TAG = "CodeUtils"
 
+    private val lock = Any()
+
     /**
      * 保存code到数据库,如果已存在则跳过
      * @param code 要保存的code对象
      * @return Boolean 是否成功保存
      */
     fun saveCode(code: Code): Boolean {
-        // 检查必要字段是否为空
-        if (code.oneLevel.isEmpty() || code.code.isEmpty()) {
-            Log.d(TAG, "保存失败:必要字段为空")
-            return false
-        }
+        synchronized(lock) {
+            // 检查必要字段是否为空
+            if (code.oneLevel.isEmpty() || code.code.isEmpty()) {
+                Log.d(TAG, "保存失败:必要字段为空")
+                return false
+            }
 
-        // 检查是否已存在相同记录
-        val existingCode = Core.code.queryByTypeAndCodeAndDate(
-            code.category,
-            code.code,
-            code.smsTimestamp
-        )
+            // 检查是否已存在相同记录
+            val existingCode = Core.code.queryByTypeAndCodeAndDate(
+                code.category,
+                code.code,
+                code.createTime
+            )
 
-        return if (existingCode == null) {
-            try {
-                Core.code.insert(code)
-                Log.d(TAG, "成功保存${code.category}记录: ${code.code}")
-                true
-            } catch (e: Exception) {
-                Log.e(TAG, "保存${code.category}记录失败: ${e.message}")
+            return if (existingCode == null) {
+                try {
+                    Core.code.insert(code)
+                    Log.d(TAG, "成功保存${code.category}记录: ${code.code}")
+                    true
+                } catch (e: Exception) {
+                    Log.e(TAG, "保存${code.category}记录失败: ${e.message}")
+                    false
+                }
+            } else {
+                Log.d(TAG, "发现重复${code.category}记录,跳过保存: ${code.code}")
                 false
             }
-        } else {
-            Log.d(TAG, "发现重复${code.category}记录,跳过保存: ${code.code}")
-            false
         }
     }
 
@@ -51,8 +55,7 @@
         company: String?,
         pickupCode: String?,
         address: String?,
-        time: String?,
-        smsTimestamp: Long = 0
+        time: String?
     ): Code {
 //        val secondLevel = if (company.isNullOrEmpty()) "未知" else company
         return Code(
@@ -70,8 +73,7 @@
             pickupTime = "",
             overTime = "",
             address = address ?: "",
-            remarks = time ?: "",
-            smsTimestamp = smsTimestamp
+            remarks = time ?: ""
         )
     }
 
@@ -87,8 +89,7 @@
         date: String?,
         address: String?,
         minAmount: String?,
-        number: String?,
-        smsTimestamp: Long = 0
+        number: String?
     ): Code {
         return Code(
             id = 0,
@@ -105,8 +106,7 @@
             pickupTime = "",
             overTime = date ?: "",
             address = address ?: "",
-            remarks = "最小还款金额${minAmount ?: ""}还款卡号${number ?: ""}",
-            smsTimestamp = smsTimestamp
+            remarks = "最小还款金额${minAmount ?: ""}还款卡号${number ?: ""}"
         )
     }
 
@@ -120,8 +120,7 @@
         amount: String?,
         datetime: String?,
         address: String?,
-        balance: String?,
-        smsTimestamp: Long = 0
+        balance: String?
     ): Code {
         return Code(
             id = 0,
@@ -138,8 +137,7 @@
             pickupTime = "",
             overTime = datetime ?: "",
             address = address ?: "",
-            remarks = "余额${balance ?: ""}",
-            smsTimestamp = smsTimestamp
+            remarks = "余额${balance ?: ""}"
         )
     }
 
@@ -154,8 +152,7 @@
         end: String?,
         seat: String?,
         time: String?,
-        address: String?,
-        smsTimestamp: Long = 0
+        address: String?
     ): Code {
         return Code(
             id = 0,
@@ -172,8 +169,7 @@
             pickupTime = "",
             overTime = time ?: "",
             address = address ?: "",
-            remarks = seat ?: "",
-            smsTimestamp = smsTimestamp
+            remarks = seat ?: ""
         )
     }
 
@@ -187,8 +183,7 @@
         seat: String?,
         time: String?,
         address: String?,
-        trips: String?,
-        smsTimestamp: Long = 0
+        trips: String?
     ): Code {
         return Code(
             id = 0,
@@ -205,8 +200,7 @@
             pickupTime = "",
             overTime = time ?: "",
             address = address ?: "",
-            remarks = trips ?: "",
-            smsTimestamp = smsTimestamp
+            remarks = trips ?: ""
         )
     }
-} 
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/invite.png b/app/src/main/res/drawable/invite.png
index 80eab74..d331024 100644
--- a/app/src/main/res/drawable/invite.png
+++ b/app/src/main/res/drawable/invite.png
Binary files differ

--
Gitblit v1.9.3