【发布时间】:2021-05-05 17:32:44
【问题描述】:
从未见过此错误,当设备刚启动时从自动启动的前台服务开始视频录制时,它开始出现在 Android 11 上(BOOT_COMPLTED 广播)
E/MediaRecorder: setOutputFormat called in an invalid state: 32
W/System.err: java.lang.IllegalStateException
W/System.err: at android.media.MediaRecorder.setOutputFormat(Native Method)
在
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
这里有一个有趣的事实,当服务启动时,它可以成功开始第一个视频录制,它完成并停止视频录制正常(视频文件很好并且可以播放),但是当它尝试录制下一个视频文件时,就会出现此错误。
所以我检查了一下,我只有一个视频文件(日志中的第一个视频文件是在设备启动时前台服务启动时重新排序的)
所以服务不能录制下一个视频文件,直到我点击前台服务通知(打开我的应用程序),然后它工作正常
它适用于所有以前的 Android 版本 (
对于 Android 11,只有一个视频文件(第一个)成功重新排序是荒谬的
是的,我知道它必须与 Android 11 https://developer.android.com/guide/components/foreground-services#bg-access-restrictions 上的这些限制有关
但我不为MediaRecorder 使用录音(没有微)
我绕过了Camera 从前台服务启动限制,方法是从BOOT_COMPETED 广播上的短直播活动启动此类服务,并授予SYSTEM_ALERT_WINDOW 权限(绘制所有应用程序),因为前台服务无法在没有用户的情况下启动活动未经此类许可在最新的 Android 上进行交互。
所以相机工作正常(因为有些黑客仍然可以在没有用户交互的情况下使用,是的......谷歌......),没有使用微但仍然MediaRecorder成功录制了一个视频文件并且无法录制下一个。
他们没有在他们的新限制中提到它,Google...?
如果相机出现错误,它会显示类似CAMERA_DISABLED (1): connectHelper:1578: Camera "0" disabled by policy
但是没有这个问题(已经绕过了这个限制),是E/MediaRecorder: setOutputFormat called in an invalid state: 32 - 你在网上都找不到这样的错误,哈哈:)
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
BOOT_COMPLETED 接收器
<receiver android:name=".service.BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
override fun onReceive(context: Context?, intent: Intent?) {
context ?: return
if (intent?.action == Intent.ACTION_BOOT_COMPLETED) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Settings.canDrawOverlays(context)) {
Intent(context, ServiceHackActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(this)
}
} else {
// show error to a user: Android 11 is bad, can't do anything automatically for you
// try to start app manually to start service to use camera for video recording
}
} else {
AppForegroundService.startService(context)
}
}
}
附言除了Settings.canDrawOverlays(context),我们还必须检查设备是否已解锁且屏幕是否开启
活动
class ServiceHackActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AppForegroundService.startService(this)
finish()
}
}
经过这些步骤,相机可以在 Android 11 上正常打开 :) 但是在第一次录制后MediaRecorder 出现错误,荒谬...
真烦人!他们添加了ACCESS_BACKGROUND_LOCATION,但没有添加ACCESS_BACKGROUND_CAMERA等等......
现在如何实现仪表盘摄像头应用?
汽车司机只想启动他的设备,仅此而已,视频录制必须自动启动,无需用户交互!
行车记录仪视频记录器应用的自动启动记录选项:
- 启动时
- 在充电连接/断开时
- 在蓝牙设备连接/断开(汽车的BT)上 等等
所有这些选项都不需要用户交互...
更新
另一个有趣的事实是,当使用我的方法启动前台服务时,相机可以正常打开,但如果我们将其停止一次并尝试再次打开,则会收到Camera "0" disabled by policy 错误。
所以基本上MediaRecorder,Camera,Microphone 在 Android 11 上只工作一次,首先在前台服务中使用,但如果其中任何一个被重新启动,那么你不能再使用它,直到有来自用户的交互(他必须至少启动一次您的应用,使活动可见)。
似乎谷歌出了一个错误,那么它首先不应该工作......或者他们想要做什么......
【问题讨论】:
-
“MediaRecorder: setOutputFormat 在无效状态下调用:32 - 你甚至在互联网上都找不到这样的错误” android.googlesource.com/platform/frameworks/av/+/refs/heads/… 和 android.googlesource.com/platform/frameworks/av/+/refs/heads/…
-
@Michael 还有什么?那里没有提到32代码。这是什么意思?当然我们可以尝试从Android源代码中找出ше。但是例如,您在 stackoverflow 网站和其他许多网站上找不到有关此错误的此类信息...
-
1 << 5等于32 -
@Michael 再次,我不需要看源代码,
Error state. MEDIA_RECORDER_ERROR = 1 << 5,- 很有帮助,哈哈,所以您可以将此错误翻译为“Android 11 启动时后台服务限制”?) -
@Michael 这不仅仅是关于
MediaRecorder,我在我的问题末尾添加了 Update,当您尝试打开相机 API 以获取相同的问题时第二次没有用户交互
标签: android mediarecorder android-mediarecorder foreground-service android-11