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