diff --git a/android/android/app/src/main/java/com/ariacockpit/AudioFocusModule.kt b/android/android/app/src/main/java/com/ariacockpit/AudioFocusModule.kt index 15f6298..3b4b7af 100644 --- a/android/android/app/src/main/java/com/ariacockpit/AudioFocusModule.kt +++ b/android/android/app/src/main/java/com/ariacockpit/AudioFocusModule.kt @@ -148,33 +148,39 @@ class AudioFocusModule(reactContext: ReactApplicationContext) : ReactContextBase promise.resolve(false) return } - try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val attrs = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build() - val kickListener = AudioManager.OnAudioFocusChangeListener { /* ignorieren */ } - val kickReq = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN) - .setAudioAttributes(attrs) - .setOnAudioFocusChangeListener(kickListener) - .build() - am.requestAudioFocus(kickReq) - am.abandonAudioFocusRequest(kickReq) - } else { - @Suppress("DEPRECATION") - val kickListener = AudioManager.OnAudioFocusChangeListener { /* ignorieren */ } - @Suppress("DEPRECATION") - am.requestAudioFocus(kickListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN) - @Suppress("DEPRECATION") - am.abandonAudioFocus(kickListener) + // Async laufen lassen — wir wollen einen request, Pause, dann abandon. + // Ohne Pause merkt das System (und damit Spotify) die kurze Owner- + // Wechsel oft gar nicht. 250ms reicht erfahrungsgemaess fuer den + // Focus-Stack-Refresh. + Thread { + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val attrs = AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_MEDIA) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .build() + val kickListener = AudioManager.OnAudioFocusChangeListener { /* ignorieren */ } + val kickReq = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN) + .setAudioAttributes(attrs) + .setOnAudioFocusChangeListener(kickListener) + .build() + am.requestAudioFocus(kickReq) + Thread.sleep(250) + am.abandonAudioFocusRequest(kickReq) + } else { + val kickListener = AudioManager.OnAudioFocusChangeListener { /* ignorieren */ } + @Suppress("DEPRECATION") + am.requestAudioFocus(kickListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN) + Thread.sleep(250) + @Suppress("DEPRECATION") + am.abandonAudioFocus(kickListener) + } + Log.i(TAG, "kickReleaseMedia: USAGE_MEDIA-Stack aufgemischt (250ms Pause)") + } catch (e: Exception) { + Log.w(TAG, "kickReleaseMedia failed: ${e.message}") } - Log.i(TAG, "kickReleaseMedia: USAGE_MEDIA-Stack aufgemischt") - promise.resolve(true) - } catch (e: Exception) { - Log.w(TAG, "kickReleaseMedia failed: ${e.message}") - promise.resolve(false) - } + }.start() + promise.resolve(true) } private fun release() {