E/MediaRecorder: setOutputFormat вызывается в недопустимом состоянии: 32 на Android 11

Никогда не видел эту ошибку, она начала появляться на 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)

at

mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)

Интересен тот факт, что когда сервис запускается, он может успешно начать запись первого видео и заканчивает и останавливает запись видео нормально (видеофайл хороший и воспроизводимый), но когда он пытается записать следующий видеофайл, появляется эта ошибка.

Итак, я проверил, и у меня был только один видеофайл (который из журналов был первым, переупорядоченным, когда служба переднего плана запускалась при загрузке устройства)

Таким образом, служба не может записывать следующие видеофайлы, пока я не нажму на уведомление службы переднего плана (чтобы открыть мое приложение), тогда все работает нормально

Он отлично работает на всех предыдущих версиях Android (‹= 10)

Для Android 11 абсурдно, что только один видеофайл (первый) успешно переупорядочен.

Да, я знаю, что это должно быть связано с этими ограничениями на Android 11 https://developer.android.com/guide/components/foreground-services#bg-access-restrictions

Но я не пользуюсь аудиозаписью (без микро) для MediaRecorder

Я обошел ограничение запуска Camera из службы переднего плана, запустив такую ​​службу из короткой прямой трансляции в BOOT_COMPETED трансляции с предоставленным разрешением SYSTEM_ALERT_WINDOW (рисовать поверх всех приложений), потому что служба переднего плана не может запускать активность без взаимодействия с пользователем на новейшей версии Android без такого разрешения.

Таким образом, камера работает нормально (потому что некоторые хаки все еще можно использовать без взаимодействия с пользователем, да... Google...), микро не используется, но все же 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)
        }
    }
}

p.s. кроме 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 и так далее...

Как внедрить приложения камеры приборной панели сейчас?

Водитель автомобиля просто хочет загрузить свое устройство и все, видеозапись должна запускаться автоматически, никакого взаимодействия с пользователем!

Параметры автоматического запуска записи для приложения видеорегистратора:

  • при загрузке
  • на зарядке подключен/отключен
  • о подключенном/отключенном устройстве Bluetooth (BT автомобиля) и т. д.

Все эти параметры не требуют взаимодействия с пользователем...

Обновить

Еще один интересный факт, что камера может нормально открываться, когда служба переднего плана запускается с использованием моего метода, но если мы остановим ее один раз и попытаемся открыть снова, то получим ошибку Camera "0" disabled by policy.

Таким образом, в основном MediaRecorder, Camera, Microphone работает только один раз на Android 11, сначала используется в службе переднего плана, но если что-либо из этого было перезапущено, вы не можете больше использовать его, пока не произойдет взаимодействие с пользователем (он должен запустить ваш приложение хотя бы один раз, сделайте активность видимой).

Кажется, Google допустил ошибку, тогда она вообще не должна работать... Или что они хотели сделать...


person user924    schedule 04.05.2021    source источник
comment
MediaRecorder: setOutputFormat вызывается в недопустимом состоянии: 32 — такой ошибки не найти даже в Интернете android.googlesource.com/platform/frameworks/av/+/refs/heads/ и android. googlesource.com/platform/frameworks/av/+/refs/heads/   -  person Michael    schedule 04.05.2021
comment
@Майкл и что? 32 код там не упоминается. Что это значит? Конечно, мы можем попытаться выяснить это из исходного кода Android. Но, например, вы не можете найти такую ​​информацию об этой ошибке на сайте stackoverflow и многих других сайтах...   -  person user924    schedule 04.05.2021
comment
1 << 5 равно 32   -  person Michael    schedule 04.05.2021
comment
@Michael снова, мне не нужно смотреть исходный код, Error state. MEDIA_RECORDER_ERROR = 1 << 5, - очень полезно, ха-ха, так что вы можете перевести эту ошибку как ограничение фоновой службы Android 11 при загрузке?)   -  person user924    schedule 04.05.2021
comment
@Michael, и дело не только в MediaRecorder, я добавил Обновить в конце своего вопроса, та же проблема с Camera API, когда вы пытаетесь открыть его во второй раз без взаимодействия с пользователем.   -  person user924    schedule 04.05.2021
comment
Возможно ты можешь помочь мне? У меня есть та же ошибка   -  person MIoCJluTeJllo    schedule 07.07.2021
comment
Возможно ты можешь помочь мне? У меня есть та же ошибка   -  person MIoCJluTeJllo    schedule 07.07.2021


Ответы (1)


Из-за фоновых ограничений Android 11 я решил начать обычную активность запуска, не заканчивая ее в BOOT_COMPLETED трансляции, когда устройство не заблокировано, без взломов, когда эта активность начинается, она также запускает необходимые службы для записи видео в фоновом режиме.

Это единственный способ, который будет нормально работать при загрузке устройства для Android 11+.

person user924    schedule 05.05.2021