求助:play-services-code-scanner突然无法运行问题排查
对应错误日志
1512-5684 WindowManager system_server E win=Window{6dee8ad u0 com.xxxxx.yyyyy/com.google.mlkit.vision.codescanner.internal.GmsBarcodeScanningDelegateActivity} destroySurfaces: appStopped=true cleanupOnResume=false win.mWindowRemovalAllowed=false win.mRemoveOnExit=false win.mViewVisibility=4 caller=com.android.server.wm.ActivityRecord.destroySurfaces:6535 com.android.server.wm.ActivityRecord.destroySurfaces:6516 com.android.server.wm.ActivityRecord.notifyAppStopped:6580 com.android.server.wm.ActivityRecord.activityStopped:7168 com.android.server.wm.ActivityClientController.activityStopped:258 android.app.IActivityClientController$Stub.onTransact:613 com.android.server.wm.ActivityClientController.onTransact:136
解决方法
- 修正扫描启动时机:日志中
appStopped=true说明启动扫描时宿主Activity处于停止状态,必须在宿主Activity的onStart或onResume阶段调用startScan(),禁止在后台或onStop阶段触发扫描。 - 升级依赖版本:16.1.0版本存在窗口管理兼容性bug,升级到最新稳定版修复问题:
implementation 'com.google.android.gms:play-services-code-scanner:16.2.0' - 主动校验相机权限:即使之前权限正常,也可能被系统或用户撤销,启动扫描前先检查权限:
val cameraPermission = Manifest.permission.CAMERA if (ContextCompat.checkSelfPermission(this, cameraPermission) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(cameraPermission), 1001) return } barcodeScanner.startScan() - 避免重复触发扫描:添加状态标记,确保同一时间仅启动一个扫描Activity实例,防止窗口管理冲突。
- 适配定制ROM限制:部分国产ROM的后台窗口限制会阻止扫描Activity启动,需在应用设置中开启「后台弹出界面」权限,仅在前台状态下触发扫描。
内容的提问来源于stack exchange,提问作者cristiandb

