如何解决E/MediaRecorder:在无效状态下调用 setOutputFormat:Android 11 上的 32
从未见过此错误,当设备刚启动时(BOOT_COMPLTED
广播)从自动启动的前台服务启动视频录制时,它开始出现在 Android 11 上
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
成功录制了一个视频文件并且未能记录下一个。
他们在新的限制中没有提到它,谷歌......?
如果相机出现错误,它会显示如下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
等等......
现在如何实现仪表盘摄像头应用?
汽车司机只想启动他的设备,仅此而已,视频录制必须自动启动,没有用户交互!
行车记录仪应用程序的自动开始录制选项:
- 开机
- 充电连接/断开连接
- 连接/断开蓝牙设备(汽车的蓝牙) 等等
所有这些选项都不需要用户交互...
更新
另一个有趣的事实是,当使用我的方法启动前台服务时,可以很好地打开相机,但是如果我们将其停止一次并再次尝试打开,则会收到 Camera "0" disabled by policy
错误。
所以基本上 MediaRecorder
,Camera
,Microphone
在 Android 11 上只能工作一次,第一次在前台服务中使用,但如果其中任何一个被重新启动,那么你就不能使用直到用户进行交互(他必须至少启动您的应用一次,使活动可见)。
似乎谷歌犯了一个错误,它首先不应该工作......或者他们想要做什么......
解决方法
由于 Android 11 的后台限制,我决定在设备未锁定、没有黑客攻击的情况下启动正常启动活动而不在 BOOT_COMPLETED
广播中完成它,当此活动启动时,它还会启动视频录制所需的服务在后台。
这是在 Android 11+ 设备启动时正常工作的唯一方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。