2013-07-08 12 views
6

Kiedy applicationDidEnterBackground: wyzwalacze, wstrzymać dźwięk, który jest odtwarzany za pomocą AVAudioPlayer:Wstrzymano dźwięku rozpoczyna odtwarzanie automatycznie applicationWillEnterForeground:

[self.avPlayer pause]; 

teraz, kiedy applicationWillEnterForeground: wyzwalacze, dźwięk zaczyna automatycznie grać! Ponieważ nie uruchomiłem dźwięku, interfejs użytkownika nie jest aktualizowany i pokazuje, że dźwięk nadal znajduje się w stanie wstrzymania.

Co się dzieje? Dzieje się tak w iOS 6.x na iPadzie 2. Problem ten nie jest odtwarzany na starszym iPadzie z systemem iOS 5.x.

To jak ja skonfigurować AVAudioSession:

// Setup the audio session 
BOOL succeeded = NO; 
NSError *sessionError = nil; 
AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setDelegate:self]; 

if ([session respondsToSelector:@selector(setPreferredSampleRate:error:)]) { 
    succeeded = [session setPreferredSampleRate:128000.0f error:&sessionError]; 

} else { 
    succeeded = [session setPreferredHardwareSampleRate:128000.0f error:&sessionError]; 
} 

succeeded = [session setCategory:AVAudioSessionCategorySoloAmbient error:&sessionError]; 
succeeded = [session setActive:YES error:&sessionError]; 
+0

Dlaczego nie wykonasz [self.avPlayer pause]; ponownie w aplikacjiWillEnterForeground:? – soryngod

+0

gdzie dokładnie używasz tego kodu? –

+0

To jest złe rozwiązanie dla próby trafienia (w mojej opinii). Powiedziawszy to, :) faktycznie próbowałem tego i to nie działa! Nie wiem, jakie magia tu gra. – Mustafa

Odpowiedz

1

W jednym z moich ostatnich aplikacji, znalazłem podobny problem, gdzie odtwarzanie dźwięku wstrzymuje automatycznie i wznawia po przerywa rozmowy i GUI nie jest odświeżana w mojej aplikacji. Mam stały problem stosując następujące metody:

Rejestracja to w klasie, gdzie obsłużyć kod odtwarzacza

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

i wykorzystać metodę AVAudioSession „s audioPlayerEndInterruption delegata, aby uzyskać kontrolę po wniosek został wznowiony. W tej funkcji można wznowić odtwarzanie i zaktualizować interfejs użytkownika.

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags 

Mam nadzieję, że to pomoże.

0

Rozwiązanie HRM nie działa dla mnie. Jedynym sposobem, w jaki udało mi się uniknąć automatycznego wznowienia gry, jest użycie polecenia stop: [self.avPlayer stop]

1

Znalazłem dziwny UX i podczas przechodzenia z powrotem w tę iz powrotem w tle i na podstawie kilku postów, Zamierzam trochę poruszyć rączką. Zrobiłem coś dość prosty - sprawdzić, czy inna gra muzyka, gdy aplikacja wchodzi na pierwszy plan:

func applicationWillEnterForeground(application: UIApplication) { 
     if AVAudioSession.sharedInstance().otherAudioPlaying{     
NSNotificationCenter.defaultCenter().postNotificationName(Notifications.ForegroundEnteredWithOtherAudioPlaying, object: nil) 
     } 
    } 

Jeśli tak, można wstrzymać odtwarzacza po otrzymaniu tego powiadomienia. Wspomniałeś, że to nie działało, ale bez zobaczenia reszty kodu, trudno ci powiedzieć, dlaczego.

Jeszcze jedno miałem zrobić, to usunąć obserwatora do flagi status z pozycji gracza, bo słuchać, że dla wartości ReadyToPlay gdzie powiem AvPlayer faktycznie grać. Zostanie uruchomiony, gdy aplikacja wejdzie na pierwszy plan i będzie aktywna sesja audio. Więc usuwając tego obserwatora podczas pauzy i ustawiając go za każdym razem w grze, (co nie jest szalone, ponieważ twierdzę, że jest to ograniczenie w porządku, aby powiedzieć, że tylko obserwuję po tym, jak uderzę w grę), jestem w stanie kontrolować dużo dziwności.

Pisałem także się kilka przypadków testowych, które będę dzielić tutaj, aby upewnić się, że doświadczenie jest w dość dobrym stanie. Nie jest kompleksowy, ale jest również dość dokładny.

// 1. Play, leave app, don't open anything else, come back 
    // 2. Play, leave app, open an app that plays music, come back 
    // 3. Play, leave app, open an app that plays music, play music, come back 
    // 4. Play, let audio go for 5 seconds, pause, open an app that plays music, come back 
    // 5. Play, let audio go for 5 seconds, pause, open an app that plays music, play music, come back 
    // 6. Press play, leave app before playback starts, open an app that plays music, come back 
    // 7. Crazy s$*t like play, leave app, open an app that plays music, play music, come back, tap a different song 
0

Miałem też ten sam problem. Zarejestrowałem więc swoją klasę pod kątem UIApplicationWillResignActive i po otrzymaniu powiadomienia wstrzymałem dźwięk.