| | |
| | | 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() { |
| | |
| | | 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() |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | // 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( |
| | |
| | | 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() |
| | |
| | | // }, 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 实例 |
| | |
| | | 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()), |
| | |
| | | |
| | | 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) { |