fix: 修复屏幕录制权限频繁掉落的根因问题

- MediaProjectionHolder添加全局创建锁safeGetOrCreateProjection()
- 所有创建点统一通过安全入口,禁止直接调用getMediaProjection()
- 重复创建新实例会导致系统stop旧实例触发onStop死循环
- Android15MediaProjectionManager/SmartMediaProjectionManager的onStop回调添加isCreating检查
- RemoteControlForegroundService备用方案改用安全创建入口
- AccessibilityRemoteService静默恢复改用安全创建入口
- 添加最小创建间隔5秒防止短时间内重复创建
This commit is contained in:
wdvipa
2026-02-15 00:34:27 +08:00
parent 39bc5b47a0
commit d163c6fd50
6 changed files with 266 additions and 446 deletions

View File

@@ -2329,14 +2329,14 @@ class ScreenCaptureManager(private val service: AccessibilityRemoteService) {
/**
* Android 15重新生成MediaProjection以解决单次令牌限制
*
* 🚨 核心修复:优先从 Holder 获取已有对象,避免重复创建
* 🚨 核心修复:从 Holder 获取已有对象,禁止重复创建
*/
private fun regenerateMediaProjectionForAndroid15(): Boolean {
return try {
if (Build.VERSION.SDK_INT >= 35) {
Log.i(TAG, "🔄 Android 15尝试获取可用的MediaProjection")
// ✅ 优先从 Holder 获取已有对象
// 从 Holder 获取已有对象
val existingProjection = MediaProjectionHolder.getMediaProjection()
if (existingProjection != null) {
Log.i(TAG, "✅ Holder中已有有效MediaProjection直接复用")
@@ -2344,29 +2344,12 @@ class ScreenCaptureManager(private val service: AccessibilityRemoteService) {
return true
}
// Holder 中无有效对象,从权限数据创建(仅一次)
val permissionData = MediaProjectionHolder.getPermissionData()
if (permissionData != null) {
val (resultCode, resultData) = permissionData
if (resultData != null) {
val accessibilityService = com.hikoncont.service.AccessibilityRemoteService.getInstance()
val android15Manager = accessibilityService?.getAndroid15MediaProjectionManager()
val newProjection = android15Manager?.createMediaProjectionWithCallback(resultCode, resultData)
if (newProjection != null) {
mediaProjection = newProjection
MediaProjectionHolder.setMediaProjection(newProjection)
Log.i(TAG, "✅ Android 15 MediaProjection重新生成成功")
return true
}
Log.e(TAG, "❌ Android 15 MediaProjection重新生成失败")
}
}
Log.e(TAG, "❌ Android 15重新生成失败无有效权限数据")
// 🚨 不再重新创建!避免死循环
Log.w(TAG, "❌ Holder中无有效MediaProjection等待权限重新授予")
}
false
} catch (e: Exception) {
Log.e(TAG, "❌ Android 15重新生成MediaProjection异常", e)
Log.e(TAG, "❌ Android 15获取MediaProjection异常", e)
false
}
}