From 38b7687559b453654662d7bebbe838b02086fcf2 Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期五, 18 四月 2025 10:17:28 +0800 Subject: [PATCH] fix: 消息通知 --- app/src/main/java/com/example/firstapp/MainActivity.kt | 155 +++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 129 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/example/firstapp/MainActivity.kt b/app/src/main/java/com/example/firstapp/MainActivity.kt index 735c567..585212b 100644 --- a/app/src/main/java/com/example/firstapp/MainActivity.kt +++ b/app/src/main/java/com/example/firstapp/MainActivity.kt @@ -14,6 +14,7 @@ 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 @@ -31,6 +32,7 @@ import java.util.Calendar import java.util.Date import java.util.Locale +import android.app.AlertDialog class MainActivity : AppCompatActivity() { // 安全防护关键词数组 @@ -40,23 +42,41 @@ 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() @@ -76,39 +96,122 @@ // 重置提醒计划并检查是否有错过的提醒 resetReminders() + + // 开始权限请求流程 + startPermissionsFlow() + } - // 检查权限 - 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( + 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.POST_NOTIFICATIONS + ) != PackageManager.PERMISSION_GRANTED + ) { + 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() - syncRecentSms() + // 在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) -- Gitblit v1.9.3