敏捷冲刺日志 - Day 5

敏捷冲刺日志 - Day 5

站立会议

站立时会议改为线上进行。

  • 昨天已完成的工作:

    • saveVideoToGallery 功能已实现并测试通过。
    • 初步定位了“替换”闪退问题的原因是 SecurityException
  • 今天计划完成的工作:

    • 核心任务:尝试修复“替换”功能的闪退问题。
    • 方案:使用 MediaStore.createDeleteRequest API 来请求用户授权删除文件,这适用于 Android 11 及以上。对于 Android 10,尝试捕获 RecoverableSecurityException 并启动其附带的 Intent 来请求授权。
  • 工作中遇到的困难:

    • MediaStore.createDeleteRequest 接口虽然好用,但它只能在 Android 11+ 上使用,这意味着必须编写版本兼容性代码。
    • 在测试中发现,RecoverableSecurityException 这个异常在 Android 10 上的行为似乎不稳定,有时并不会如预期那样被抛出,导致无法进入用户授权流程,应用依然会闪退。这是今天遇到的最大障碍。

项目燃尽图

661c981e2a3499b65ccf5801838779ca

代码/文档签入记录

  • 代码签入: fix(replace): Attempt to fix crash with createDeleteRequest and RecoverableSecurityException
  • 签入记录对应的Issue内容与链接:
    • Issue: #BUG-001 - “替换”功能闪退
    • 链接: [链接到内部工单系统]
  • Code Review: 编码规范文档无变化。

最新模块的代码

这是本次为解决闪退问题而编写的核心逻辑。它区分了不同安卓版本,尝试使用不同的 API 来安全地删除文件。

    // 注册一个 ActivityResultLauncher 来处理删除请求的结果
    private val deleteRequestLauncher = registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            Toast.makeText(this, "原始视频已删除", Toast.LENGTH_SHORT).show()
        } else {
            Toast.makeText(this, "删除原始视频失败或被取消", Toast.LENGTH_SHORT).show()
        }
    }

    private fun deleteOriginalVideos(uris: List<Uri>) {
        if (uris.isEmpty()) return

        // Android 11 (R) 及以上版本
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            val pendingIntent = MediaStore.createDeleteRequest(contentResolver, uris)
            val request = IntentSenderRequest.Builder(pendingIntent.intentSender).build()
            deleteRequestLauncher.launch(request)
        } else { // Android 10 (Q) 及以下
            uris.forEach { uri ->
                try {
                    // 直接尝试删除
                    contentResolver.delete(uri, null, null)
                } catch (e: SecurityException) {
                    // 如果是可恢复的安全异常(仅限 Android 10)
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && e is RecoverableSecurityException) {
                        val intentSender = e.userAction.actionIntent.intentSender
                        val request = IntentSenderRequest.Builder(intentSender).build()
                        // 启动授权流程
                        deleteRequestLauncher.launch(request)
                    } else {
                        // 其他无法处理的异常
                        Toast.makeText(this, "删除原始视频失败,权限不足", Toast.LENGTH_SHORT).show()
                    }
                }
            }
        }
    }

运行结果的截图

ddcea1c54c5c60f94f64ce17882d748f

每日每人总结

  • 刘瑞康 (开发): 编写了一个独立测试项目专门验证文件删除逻辑,确认 RecoverableSecurityException 在 Android 10 上行为不稳定,该发现为团队决策提供了关键依据。
  • 刘泽昊 (开发): 根据兼容性策略,调整了批量完成后的操作界面,使“批量替换”按钮仅在 Android 11 及以上系统中显示,避免用户在低版本系统上触发崩溃。
  • 伊尔番 (PM): 针对“替换”功能的技术障碍,已启动风险预案。与用户初步沟通解释了系统限制,并探讨以强化“分享”或“另存为”作为替代方案。
posted @ 2025-12-03 22:19  二熊苏尔  阅读(3)  评论(0)    收藏  举报