MediaRecorder вылетает при попытке записать звук с гарнитуры Bluetooth - PullRequest
0 голосов
/ 14 мая 2019

я пытаюсь позвонить

mediaRecorder.start ()

. Это дает эту ошибку.

java.lang.IllegalStateException
    at android.media.MediaRecorder.native_start(Native Method)
    at android.media.MediaRecorder.start(MediaRecorder.java:1143)
    at com.yyy.mystory.xxx.ui.camera.CameraVideoFragment$startRecordingVideo$2$onConfigured$1.run(CameraVideoFragment.kt:691)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6863)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Когда я записываю с телефона, он работает отлично, но когда я пытаюсь записать через Bluetooth-гарнитуру, он дает сбой, как описано выше. Мой код выглядит примерно так:

 if (mediaRecorder != null) {
        mediaRecorder?.release()
        mediaRecorder = null
    }
    mediaRecorder = MediaRecorder()

    mediaRecorder?.apply {
        setAudioSource(MediaRecorder.AudioSource.MIC)
        setVideoSource(MediaRecorder.VideoSource.SURFACE)
        setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
        setOutputFile(nextVideoAbsolutePath)
        setVideoEncodingBitRate(compositionQuality.videoBitrate)
        setAudioEncodingBitRate(compositionQuality.audioBitrate)
        setAudioChannels(2)
        setAudioSamplingRate(44100)
        setVideoFrameRate(60)            

        setVideoEncoder(MediaRecorder.VideoEncoder.H264)
        setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
        prepare()
    }

1 Ответ

0 голосов
/ 15 мая 2019

Ребята, после поиска решения везде, я обнаружил, что MediaPlayer не для игры.Это произошло из-за того, что событие мультимедийной кнопки вызывалось дважды для кнопки Volume_up и volume_down с устройства Bluetooth.Просто запустите mediaRecorder только для определенного события либо для KeyEvent.ACTION_UP, либо для KeyEvent.ACTION_UP.Это решает мою проблему.

 mMediaSession = MediaSessionCompat(this, TAG)
    mMediaSession?.setCallback(object : MediaSessionCompat.Callback() {
        override fun onMediaButtonEvent(mediaButtonIntent: Intent): Boolean {
            // Consume the media button event here. Should not send it to other apps.
            val event = mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT) as KeyEvent
            var action = event.action

            if (event.action == KeyEvent.ACTION_DOWN) {
                //call mediaplayer.start() from here
            }
            return true
        }
    })
...