| | |
| | | import android.Manifest |
| | | import android.content.Context |
| | | import android.content.Intent |
| | | import android.content.pm.PackageManager |
| | | import android.net.Uri |
| | | import android.os.Build |
| | | import androidx.annotation.RequiresApi |
| | |
| | | import java.util.Calendar |
| | | import java.util.Date |
| | | import java.util.Locale |
| | | import android.app.AlertDialog |
| | | |
| | | class MainActivity : AppCompatActivity() { |
| | | // 安全防护关键词数组 |
| | |
| | | |
| | | private var smsReceiver: SmsReceiver? = null |
| | | |
| | | private val multiplePermissionRequest = |
| | | // 短信权限请求 |
| | | private val smsPermissionRequest = |
| | | registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions -> |
| | | when { |
| | | permissions.getOrDefault( |
| | | Manifest.permission.RECEIVE_SMS, false |
| | | ) && permissions.getOrDefault(Manifest.permission.READ_SMS, false) -> { |
| | | // 两个权限都获得授权 |
| | | Toast.makeText(this, "短信权限已授予", Toast.LENGTH_SHORT).show() |
| | | registerSmsReceiver() |
| | | // 在Android O及以上版本同步最近短信 |
| | | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { |
| | | syncRecentSms() |
| | | } |
| | | } |
| | | |
| | | else -> { |
| | | // 有权限被拒绝 |
| | | Toast.makeText( |
| | | this, "需要短信读取和接收权限才能正常使用功能", Toast.LENGTH_SHORT |
| | | ).show() |
| | | showSmsPermissionExplanationDialog() |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 通知权限请求 |
| | | private val notificationPermissionRequest = |
| | | registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> |
| | | if (isGranted) { |
| | | // 权限已授予 |
| | | Toast.makeText(this, "通知权限已授予,您将能收到重要提醒", Toast.LENGTH_SHORT).show() |
| | | } else { |
| | | // 权限被拒绝 |
| | | Toast.makeText(this, "通知权限被拒绝,应用将无法发送提醒通知", Toast.LENGTH_SHORT).show() |
| | | } |
| | | // 无论通知权限是否授予,都继续请求短信权限 |
| | | requestSmsPermissions() |
| | | } |
| | | |
| | | private val syncLock = Object() |
| | |
| | | // 重置提醒计划并检查是否有错过的提醒 |
| | | 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, Manifest.permission.RECEIVE_SMS |
| | | ) != android.content.pm.PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission( |
| | | this, Manifest.permission.READ_SMS |
| | | ) != android.content.pm.PackageManager.PERMISSION_GRANTED |
| | | this, |
| | | Manifest.permission.POST_NOTIFICATIONS |
| | | ) != PackageManager.PERMISSION_GRANTED |
| | | ) { |
| | | // 同时请求两个权限 |
| | | multiplePermissionRequest.launch( |
| | | notificationPermissionRequest.launch(Manifest.permission.POST_NOTIFICATIONS) |
| | | } else { |
| | | // 已有通知权限,直接请求短信权限 |
| | | requestSmsPermissions() |
| | | } |
| | | } else { |
| | | // 低版本Android无需请求通知权限,直接请求短信权限 |
| | | requestSmsPermissions() |
| | | } |
| | | } |
| | | |
| | | // 请求短信权限 |
| | | private fun requestSmsPermissions() { |
| | | if (!hasSmsPermissions()) { |
| | | // 没有短信权限,请求权限 |
| | | smsPermissionRequest.launch( |
| | | arrayOf( |
| | | Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_SMS |
| | | ) |
| | | ) |
| | | } else { |
| | | // 权限已经授予,继续执行相关操作 |
| | | // 已有短信权限,直接初始化短信处理 |
| | | registerSmsReceiver() |
| | | // 在Android O及以上版本同步最近短信 |
| | | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { |
| | | syncRecentSms() |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 检查并处理短信权限(可选是否显示对话框) |
| | | private fun checkAndHandleSmsPermissions(showDialog: Boolean = true) { |
| | | if (!hasSmsPermissions()) { |
| | | if (showDialog) { |
| | | showSmsPermissionExplanationDialog() |
| | | } |
| | | } else { |
| | | // 已有短信权限,确保接收器已注册 |
| | | if (smsReceiver == null) { |
| | | registerSmsReceiver() |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 检查是否有短信权限 |
| | | 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 |
| | | } |
| | | |
| | | // 显示短信权限解释对话框 |
| | | private fun showSmsPermissionExplanationDialog() { |
| | | AlertDialog.Builder(this) |
| | | .setTitle("需要短信权限") |
| | | .setMessage("应用需要短信权限来自动处理和分类您的短信信息,包括快递、付款等内容。没有此权限,应用核心功能将无法正常工作。") |
| | | .setPositiveButton("授予权限") { _, _ -> |
| | | requestSmsPermissions() |
| | | } |
| | | .setNegativeButton("暂时不要") { dialog, _ -> |
| | | dialog.dismiss() |
| | | Toast.makeText(this, "您可以稍后在设置中开启短信权限", Toast.LENGTH_LONG).show() |
| | | } |
| | | .setCancelable(false) |
| | | .show() |
| | | } |
| | | |
| | | // 提供给外部调用的请求通知权限方法 |
| | | fun requestNotificationPermission() { |
| | | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { |
| | | // 判断是否已经有通知权限 |
| | | if (ContextCompat.checkSelfPermission( |
| | | this, |
| | | Manifest.permission.POST_NOTIFICATIONS |
| | | ) != PackageManager.PERMISSION_GRANTED |
| | | ) { |
| | | notificationPermissionRequest.launch(Manifest.permission.POST_NOTIFICATIONS) |
| | | } else { |
| | | Toast.makeText(this, "已经拥有通知权限", Toast.LENGTH_SHORT).show() |
| | | } |
| | | } else { |
| | | // Android 13以下的版本不需要请求权限 |
| | | Toast.makeText(this, "当前系统版本无需单独请求通知权限", Toast.LENGTH_SHORT).show() |
| | | } |
| | | } |
| | | |
| | | private fun registerSmsReceiver() { |
| | | // 应用启动时执行 registerSmsReceiver() |
| | | // 创建 SmsReceiver 实例 |
| | | // 注册广播接收器,开始监听短信 |
| | | // 等待新短信到达 |
| | | // 新短信到达时,系统发送广播 |
| | | // SmsReceiver 的 onReceive 方法被调用 |
| | | // 处理短信内容 |
| | | // 发送数据更新广播 |
| | | // MainActivity 接收到更新广播 |
| | | // 更新 UI |
| | | Log.d("SMS_DEBUG", "MainActivity收到数据更新广播") |
| | | // 确保不重复注册 |
| | | if (smsReceiver != null) return |
| | | |
| | | Log.d("SMS_DEBUG", "MainActivity注册短信接收器") |
| | | smsReceiver = SmsReceiver() |
| | | val filter = IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION) |
| | | registerReceiver(smsReceiver, filter) |