bluefireteam / audioplayers

A Flutter package to play multiple audio files simultaneously (Android/iOS/web/Linux/Windows/macOS)
https://pub.dartlang.org/packages/audioplayers
MIT License
2k stars 844 forks source link

Audio focus request denied due to IllegalArgumentException: Invalid duration hint #1321

Open DamonChen117 opened 1 year ago

DamonChen117 commented 1 year ago

audioplayers: ^1.1.1 android:6.0.1

The code works fine in iOS. When running in Android, it reported:

E/ExtMediaPlayer-JNI(24812): env->IsInstanceOf fails
E/MediaPlayer-JNI(24812): JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0
E/ExtMediaPlayer-JNI(24812): env->IsInstanceOf fails
E/MediaPlayer-JNI(24812): JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0
V/MediaPlayer(24812): constructor
V/MediaPlayer(24812): setListener
V/MediaPlayer(24812): reset
V/MediaPlayer(24812): setDataSource(83, 0, 576460752303423487)
V/MediaPlayer(24812): setPlaybackSettings: 1.000000 1.000000 0 0
V/MediaPlayer(24812): getAudioStreamType
V/MediaPlayer(24812): MediaPlayer::setVolume(1.000000, 1.000000)
V/MediaPlayer(24812): MediaPlayer::setLooping
V/MediaPlayer(24812): setVideoSurfaceTexture
V/MediaPlayer(24812): prepare
V/MediaPlayer(24812): message received msg=1, ext1=0, ext2=0
V/MediaPlayer(24812): prepared
V/MediaPlayer(24812): signal application thread
V/MediaPlayer(24812): callback application
V/MediaPlayer(24812): prepare complete - status=0
V/MediaPlayer(24812): back from callback
V/MediaPlayer(24812): invoke 68
V/MediaPlayer(24812): invoke 68
V/MediaPlayer(24812): getDuration_l
E/AudioManager(13140): Audio focus request denied due to 
E/AudioManager(13140): java.lang.IllegalArgumentException: Invalid duration hint
E/AudioManager(13140):  at android.media.AudioManager.requestAudioFocus(AudioManager.java:2447)
E/AudioManager(13140):  at android.media.AudioManager.requestAudioFocus(AudioManager.java:2406)
E/AudioManager(13140):  at android.media.AudioManager.requestAudioFocus(AudioManager.java:2315)
E/AudioManager(13140):  at xyz.luan.audioplayers.player.FocusManager.oldRequestAudioFocus(FocusManager.kt:62)
E/AudioManager(13140):  at xyz.luan.audioplayers.player.FocusManager.maybeRequestAudioFocus(FocusManager.kt:28)
E/AudioManager(13140):  at xyz.luan.audioplayers.player.WrappedPlayer.play(WrappedPlayer.kt:158)
E/AudioManager(13140):  at xyz.luan.audioplayers.AudioplayersPlugin.handler(AudioplayersPlugin.kt:100)
E/AudioManager(13140):  at xyz.luan.audioplayers.AudioplayersPlugin.access$handler(AudioplayersPlugin.kt:25)
E/AudioManager(13140):  at xyz.luan.audioplayers.AudioplayersPlugin$onAttachedToEngine$1$1.invoke(AudioplayersPlugin.kt:41)
E/AudioManager(13140):  at xyz.luan.audioplayers.AudioplayersPlugin$onAttachedToEngine$1$1.invoke(AudioplayersPlugin.kt:41)
E/AudioManager(13140):  at xyz.luan.audioplayers.AudioplayersPlugin$safeCall$1.invokeSuspend(AudioplayersPlugin.kt:62)
E/AudioManager(13140):  at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
E/AudioManager(13140):  at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
E/AudioManager(13140):  at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42)
E/AudioManager(13140):  at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95)
E/AudioManager(13140):  at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
E/AudioManager(13140):  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
E/AudioManager(13140):  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
E/AudioManager(13140):  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)

In AudioManager.java

public int requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint) {
....
if ((durationHint < AUDIOFOCUS_GAIN) || (durationHint > AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)) { 
throw new IllegalArgumentException("Invalid duration hint"); 
}

The audioFocus is 0, which caused the issue.

@Deprecated("Use requestAudioFocus instead")
    private fun oldRequestAudioFocus(andThen: () -> Unit) {
        val audioFocus = context.audioFocus ?: return andThen()
        audioFocusChangeListener = AudioManager.OnAudioFocusChangeListener { handleFocusResult(it, andThen) }
        Logger.error("AudioManager.STREAM_MUSIC ${AudioManager.STREAM_MUSIC}, audioFocus:${audioFocus}")
        @Suppress("DEPRECATION")
        val result = audioManager.requestAudioFocus(
            audioFocusChangeListener,
            AudioManager.STREAM_MUSIC,
            audioFocus,
        )
        handleFocusResult(result, andThen)
    }

cause by audioFocus: AndroidAudioFocus.none Changed to AndroidAudioFocus.gain, everything is fine. The problem is that, if AndroidAudioFocus.none can cause the issue, why not just remove this option?

AudioContextAndroid(
        isSpeakerphoneOn: true,
        stayAwake: true,
        contentType: AndroidContentType.sonification,
        usageType: AndroidUsageType.assistanceSonification,
        audioFocus: AndroidAudioFocus.none,
      )
clockwork189 commented 1 year ago

I also experienced this issue with AndroidAudioFocus.none. Setting the value to anything else, even null, fixed the issue for me. I did get a different stack trace which I am adding below so that it may help with debugging this issue:

D/AudioPlayers( 6130): java.lang.IllegalArgumentException: Illegal audio focus gain type 0
D/AudioPlayers( 6130):  at android.media.AudioFocusRequest$Builder.setFocusGain(AudioFocusRequest.java:405)
D/AudioPlayers( 6130):  at android.media.AudioFocusRequest$Builder.<init>(AudioFocusRequest.java:373)
D/AudioPlayers( 6130):  at xyz.luan.audioplayers.player.FocusManager.newRequestAudioFocus(FocusManager.kt:47)
D/AudioPlayers( 6130):  at xyz.luan.audioplayers.player.FocusManager.maybeRequestAudioFocus(FocusManager.kt:25)
D/AudioPlayers( 6130):  at xyz.luan.audioplayers.player.WrappedPlayer.play(WrappedPlayer.kt:158)
D/AudioPlayers( 6130):  at xyz.luan.audioplayers.AudioplayersPlugin.handler(AudioplayersPlugin.kt:100)
D/AudioPlayers( 6130):  at xyz.luan.audioplayers.AudioplayersPlugin.access$handler(AudioplayersPlugin.kt:25)
D/AudioPlayers( 6130):  at xyz.luan.audioplayers.AudioplayersPlugin$onAttachedToEngine$1$1.invoke(AudioplayersPlugin.kt:41)
D/AudioPlayers( 6130):  at xyz.luan.audioplayers.AudioplayersPlugin$onAttachedToEngine$1$1.invoke(AudioplayersPlugin.kt:41)
D/AudioPlayers( 6130):  at xyz.luan.audioplayers.AudioplayersPlugin$safeCall$1.invokeSuspend(AudioplayersPlugin.kt:62)
D/AudioPlayers( 6130):  at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
D/AudioPlayers( 6130):  at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
D/AudioPlayers( 6130):  at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42)
D/AudioPlayers( 6130):  at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95)
D/AudioPlayers( 6130):  at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
D/AudioPlayers( 6130):  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
D/AudioPlayers( 6130):  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
D/AudioPlayers( 6130):  at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)
thelastknightahk commented 1 year ago

@clockwork189 I also had issues like that. Now, I fixed by deleting build folder

rsyd29 commented 1 year ago

Illegal audio focus gain type 0

any update for this. I got same error. If i put this code

android: AudioContextAndroid( isSpeakerphoneOn: true, stayAwake: true, contentType: AndroidContentType.sonification, usageType: AndroidUsageType.assistanceSonification, audioFocus: AndroidAudioFocus.none, ),

rsyd29 commented 1 year ago

Illegal audio focus gain type 0

any update for this. I got same error. If i put this code

android: AudioContextAndroid( isSpeakerphoneOn: true, stayAwake: true, contentType: AndroidContentType.sonification, usageType: AndroidUsageType.assistanceSonification, audioFocus: AndroidAudioFocus.none, ),

solved with this link