From 1097c45d8d6aa4b74a50e8d9a99dedab73f2bbad Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期五, 28 二月 2025 13:35:07 +0800
Subject: [PATCH] add: 优化首页自动同步历史短信,和实时刷新包裹列表

---
 app/src/main/java/com/example/firstapp/MainActivity.kt |   99 +++++++++++++++++++++++++++++++++++--------------
 1 files changed, 70 insertions(+), 29 deletions(-)

diff --git a/app/src/main/java/com/example/firstapp/MainActivity.kt b/app/src/main/java/com/example/firstapp/MainActivity.kt
index 6abffe0..bbb32a4 100644
--- a/app/src/main/java/com/example/firstapp/MainActivity.kt
+++ b/app/src/main/java/com/example/firstapp/MainActivity.kt
@@ -27,10 +27,19 @@
 import androidx.work.WorkManager
 import com.example.firstapp.activity.LoginActivity
 import com.example.firstapp.adapter.MyAdapter
+import com.example.firstapp.core.Core
+import com.example.firstapp.database.entity.Code
+import com.example.firstapp.database.entity.Msg
+import com.example.firstapp.entity.Rule
 import com.example.firstapp.ui.home.HomeViewModel
 import com.example.firstapp.utils.Log
 import com.example.firstapp.workers.KeywordUpdateWorker
+import java.text.SimpleDateFormat
+import java.time.LocalDateTime
+import java.time.format.DateTimeFormatter
 import java.util.Calendar
+import java.util.Date
+import java.util.Locale
 import java.util.concurrent.TimeUnit
 
 class MainActivity : AppCompatActivity() {
@@ -42,16 +51,18 @@
     private lateinit var adapter: MyAdapter
     private lateinit var homeViewModel: HomeViewModel
 
-
-    // 权限请求代码
-    private val permissionRequest = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
-        if (isGranted) {
-            // 权限授予后注册短信监听器
-            registerSmsReceiver()
-            syncRecentSms()
-        } else {
-            // 权限拒绝,提示用户
-            Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show()
+    private val multiplePermissionRequest = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
+        when {
+            permissions.getOrDefault(Manifest.permission.RECEIVE_SMS, false) &&
+                    permissions.getOrDefault(Manifest.permission.READ_SMS, false) -> {
+                // 两个权限都获得授权
+                registerSmsReceiver()
+                syncRecentSms()
+            }
+            else -> {
+                // 有权限被拒绝
+                Toast.makeText(this, "需要短信读取和接收权限才能正常使用功能", Toast.LENGTH_SHORT).show()
+            }
         }
     }
 
@@ -71,6 +82,7 @@
 //        val navView: BottomNavigationView = binding.navView
         val navView = binding.navView
         val navController = findNavController(R.id.nav_host_fragment_activity_main)
+
         // Passing each menu ID as a set of Ids because each
         // menu should be considered as top level destinations.
         val appBarConfiguration = AppBarConfiguration(
@@ -82,10 +94,13 @@
         navView.setupWithNavController(navController)
 
         // 检查权限
-        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != android.content.pm.PackageManager.PERMISSION_GRANTED) {
-            // 请求权限
-            permissionRequest.launch(Manifest.permission.READ_SMS)
-            syncRecentSms()
+        if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != android.content.pm.PackageManager.PERMISSION_GRANTED ||
+            ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != android.content.pm.PackageManager.PERMISSION_GRANTED) {
+            // 同时请求两个权限
+            multiplePermissionRequest.launch(arrayOf(
+                Manifest.permission.RECEIVE_SMS,
+                Manifest.permission.READ_SMS
+            ))
         } else {
             // 权限已经授予,继续执行相关操作
             registerSmsReceiver()
@@ -121,7 +136,10 @@
 //        }, filter)
 
     }
-
+    override fun onSupportNavigateUp(): Boolean {
+        val navController = findNavController(R.id.nav_host_fragment_activity_main)
+        return navController.navigateUp() || super.onSupportNavigateUp()
+    }
     private fun registerSmsReceiver() {
 //        应用启动时执行 registerSmsReceiver()
 //        创建 SmsReceiver 实例
@@ -179,7 +197,8 @@
             val threeDaysAgo = calendar.timeInMillis
 
             val cursor = contentResolver.query(
-                Uri.parse("content://sms/sent"),
+//                Uri.parse("content://sms/sent"), //发送短信
+                Uri.parse("content://sms/inbox"),
                 arrayOf("address", "body", "date"),
                 "date >= ?",
                 arrayOf(threeDaysAgo.toString()),
@@ -188,22 +207,44 @@
 
             cursor?.use {
                 while (cursor.moveToNext()) {
+                    //手机号
                     val address = cursor.getString(cursor.getColumnIndexOrThrow("address"))
-                    val body = cursor.getString(cursor.getColumnIndexOrThrow("body"))
-                    val date = cursor.getLong(cursor.getColumnIndexOrThrow("date"))
+                    //短信内容
+                    val messageBody = cursor.getString(cursor.getColumnIndexOrThrow("body"))
+                    //短信时间
+                    val datetime = cursor.getLong(cursor.getColumnIndexOrThrow("date"))
+                    // 这里我要写个数组,并创建个对象存放一些内容,如这个对象的属性有匹配内容,正则表达式,并循环遍历
+                    val ruleList = mutableListOf(
+                        Rule("快递","京东","\\d{6}"),
+                        Rule("快递","菜鸟","\\d{1,2}-\\d{1,2}-\\d{4}")
+                    )
+                    for (rule in ruleList) {
+                        val code = rule.extractCodeFromMessage(messageBody.toString())
+                        if (code!==null) {
 
-                    // 使用正则表达式提取验证码
-                    val regex = "\\d{4,6}".toRegex()
-                    val matchResult = regex.find(body)
-                    matchResult?.let { result ->
-                        val code = result.value
-                        // 使用 ViewModel 保存到数据库
-                        println("address")
-                        println(address)
-                        println(code)
-                        println(date)
-                       // homeViewModel.saveCode(address, code, date)
+                            // 转换为 Date 对象
+                            val date = Date(datetime)
+                            // 如果需要格式化显示
+                            val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
+                            val dateString = sdf.format(date)
+                            val existingCode = Core.code.queryByTypeAndCodeAndDate(rule.content, code, dateString)
+                            if (existingCode == null) {
+                                android.util.Log.d("SmsReceiver", "Received SMS code: ${code}")
+                                val msg = Msg(0, "1111", "111111", messageBody.toString(), 1, "111", 1, 1)
+                                val msgId = Core.msg.insert(msg)
+                                val code = Code(0, rule.type, 1, rule.content, 1, 1, msgId, code, dateString, "中通")
+                                Core.code.insert(code)
+                                android.util.Log.d("SMS_DEBUG", "历史短信已保存到数据库")
+                            }else{
+                                android.util.Log.d("SmsReceiver", "Received SMS code: 已存在相同记录,不保存")
+                            }
+                        }else{
+                            android.util.Log.d("SmsReceiver", "Received SMS code: 没有匹配到历史短信内容")
+                        }
                     }
+                    // 发送广播通知数据已更新
+                    val updateIntent = Intent("com.example.firstapp.DATA_UPDATED")
+                    sendBroadcast(updateIntent)
                 }
             }
         } catch (e: Exception) {

--
Gitblit v1.9.3