cloudroam
昨天 9755d9eefb12f95fa45c785e526038e10c9c7115
短信fix
已修改8个文件
289 ■■■■ 文件已修改
app/src/main/java/com/example/firstapp/MainActivity.kt 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/database/entity/Code.kt 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/database/entity/Msg.kt 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/database/repository/CodeRepository.kt 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/receiver/SmsReceiver.kt 150 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/utils/CodeUtils.kt 78 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/invite.png 补丁 | 查看 | 原始文档 | blame | 历史
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)
                                        }
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")
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(),
)
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
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
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)
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 ?: ""
        )
    }
}
}
app/src/main/res/drawable/invite.png