fix: 修复屏幕录制权限频繁掉落的根因问题
- MediaProjectionHolder添加全局创建锁safeGetOrCreateProjection() - 所有创建点统一通过安全入口,禁止直接调用getMediaProjection() - 重复创建新实例会导致系统stop旧实例触发onStop死循环 - Android15MediaProjectionManager/SmartMediaProjectionManager的onStop回调添加isCreating检查 - RemoteControlForegroundService备用方案改用安全创建入口 - AccessibilityRemoteService静默恢复改用安全创建入口 - 添加最小创建间隔5秒防止短时间内重复创建
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user