Soru Bir çağrıdan sonra arka plan sesi devam etmiyor


Arka plan sesim neredeyse her zaman iyi çalışıyor. Ekran kilitlendi veya sesini açın. Ancak, kullanıcı arka planda bir uygulamaya sahip olduğunda ve bir çağrı aldığında, kullanıcı aramayı cevaplamıyor olsa bile, kesinti sona erdikten sonra arka plan sesi devam etmez.

Müzik uygulaması, kesintiye uğradığında arka plan sesini düzgün bir şekilde sürdürür.

Bir özelliği kaçırıyor muyum veya bir kesintiden sonra arkaplanda ses yürütmeye devam etmek için bir geri arama veya arka plan görevi ayarlamam gerekiyor mu? Yoksa bu yapamayacağımız bir şey mi?


21
2018-02-28 05:06


Menşei


Ben de aynı sorunla karşı karşıyayım, pls bana yardımcı olabilir misiniz!
ama bu uygulama iyi çalışıyor bağlantı Nasıl yaptın?
App sorunu var. - carlos
Hayır, bu uygulama sadece iyi çalışıyor. Ayrıca ben de çözümü aldım!
çözümü paylaşmayı önemser misin, Rajesh? - jd.


Cevaplar:


Uygulama arka planda iken giden bir arama ve gelen aramadan sonra sesimizi sürdürüyoruz.

Sesle oynuyoruz AVAudioPlayer ve dinle AVAudioSessionInterruptionNotification. Apple, AVAudioPlayer'ı sizin için bir kesinti halinde otomatik olarak duraklatır ve kesinti bittikten sonra devam edeceğini söylerseniz, Apple oturumunuzu tekrar aktif hale getirir. Tablo 3-2'ye bakınız. Ses kesintilerini işleme Diğer ses teknolojileri türlerini kullanıyorsanız, önerilerde.

Bildirime abone olun:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAudioSessionEvent:) name:AVAudioSessionInterruptionNotification object:nil];

Bildirimi işlemek:

- (void) onAudioSessionEvent: (NSNotification *) notification
{
    //Check the type of notification, especially if you are sending multiple AVAudioSession events here
    if ([notification.name isEqualToString:AVAudioSessionInterruptionNotification]) {
        NSLog(@"Interruption notification received!");

        //Check to see if it was a Begin interruption
        if ([[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeBegan]]) {
            NSLog(@"Interruption began!");

        } else {
            NSLog(@"Interruption ended!");
            //Resume your audio
        }
    }
}

22
2017-09-27 20:00



Uygulama ön planda ses çaldığında çalışır. Uygulama arka plan varsa, devam etmiyor. Ama ön plana gelir ve sonra çalışırım. @Michale Myers size öneri verebilir misiniz? - jailani
@jai Arka plan kurulumunda ses çalma yeteneğiniz var mı? - Michael M. Myers
Uygulamam arka alanda iyi çalışıyor. ancak ekranım kilitlendikten sonra uygulamamı nasıl kontrol edeceğimi hala çalışıyor mu? uygulamam arka planda çalışırken cihazım kilitlenmiyor ... - jailani
Karşılaştığım problem bu stackoverflow.com/questions/22400345/... lütfen öneri verin - jailani
SoloAmbient ile, doğru bir şekilde kaydettikten sonra bile bu bildirimi almam. PlayAndRecord ile sadece giriş bildirimini aldım, ancak çıkış olanı değil. Bu mekanizma benim için tamamen kırıldı. Bu arada, AVAudioSession kullanıyorum, ancak temel teknoloji AU. Ama sanırım yarım yıl önce bu işe yaradı. İOS 8.1.x'te bir yerlerde kırılmış olmalı. - kakyo


Deneyimlerime göre, ses cihazını yeniden açmaya çalışmadan önce "bir iki saniye beklemem" gerekti. OS, çağrıdan tekrar uygulamanıza geri döndükten sonra telefon uygulamasının kapatıldığını düşünüyorum.

Ses oturumunuzun durdurulduğunu bilerek ön plana geri döndüğünüzde böyle bir şey:

            dispatch_time_t restartTime = dispatch_time(DISPATCH_TIME_NOW, 
                                                      1.5LL * NSEC_PER_SEC);

            dispatch_after(restartTime, dispatch_get_global_queue(0, 0), ^{ 
                [audioSystem restart]; 
            });

5
2018-02-28 07:43



Bu yalnızca uygulama arka planda olduğunda ve arkaplan ses hizmetleri dolduğunda olur. Uygulama çalışırken ve ses çalarken çağrı alınırsa, aramadan sonra oynatmaya devam eder. - carlos
Ah, şimdi anlıyorum. Kötü haber, Uygulamalar arka planda iken ses cihazını yeniden açamaz, kullanıcı ses cihazını yeniden açmadan önce uygulamayı ön plana getirmelidir! - Tony Million
Bende böyle düşünmüştüm. Ben küçük topal, müzik uygulaması bir arama sonra oynatmayı başarıyla geri yükler. - carlos


Ben Xamarin kullanıyorum bu yüzden bu C # ama aşağıdaki kod benim için çalışıyor. İlk olarak, AppDelegate'imin IAVAudioSessionDelegate'i ekleyerek AVAudioSession temsilci yöntemlerini uyguladığını ayarladım

            public partial class AppDelegate: UIApplicationDelegate, IAVAudioSessionDelegate

Ses oturumu için AppDelegate sınıfına bir değişken ekledim

            public static AVAudioSession AudioSession;

FinishedLaunching yönteminin geçersiz kılınmasında:

            AudioSession = AVAudioSession.SharedInstance();
            AudioSession.Delegate = this;
            error = AudioSession.SetCategory( AVAudioSessionCategory.Playback, AVAudioSessionCategoryOptions.DuckOthers );
            AudioSession.SetMode( new NSString( "AVAudioSessionModeMoviePlayback" ), out error );

AppDelegate.cs'deki iki ilgili delege yöntemi şunlardır:

            [Export( "beginInterruption" )]
            public void BeginInterruption()
            {
                 PlayerViewController.BeginSessionInterruption();
            }

            [Export( "endInterruptionWithFlags:" )]
            public void EndInterruption( AVAudioSessionInterruptionFlags flags )
            {  // ignore the flags so we're not dependent on the interrupting event saying that we can resume
                 PlayerViewController.ResumeAfterSessionInterruption();
            }

Benim AppDelegate ayrıca bir video varlığı ve videonun medya parçalarını devre dışı bırakmak ama yine de ses çalmak için DidEnterBackground bir geçersiz kılmak için video izlerini etkinleştirmek için OnActivated bir geçersiz kılma vardır.

PlayerViewController.BeginSessionInterruption () yönteminde, oyuncunun o anda çalışıp çalışmadığını görmek için Player.Rate'e bakamıyorum çünkü kesinti alarmı veya telefon görüşmesi daha önce oynatıcıyı duraklattı. Apple'ın Ses Oturumu Programlama Kılavuzunun "Yanıt Vermeye Yanıt Verme" bölümünden vurgu ekledim:

  1. Uygulamanız etkin, ses oynatılıyor.
  2. Bir telefon geldi. Sistem, telefon uygulamasının ses oturumunu etkinleştirir.
  3. Sistem ses oturumunuzu devre dışı bırakır. Bu noktada, * uygulamanızda oynatma durduruldu *.
  4. Sistem, oturumunuzun devre dışı bırakıldığını belirten kesinti dinleyici geri çağırma işlevini çağırır. ...

PlayerViewController'in Yürüt düğmesinin, Oynat ve Duraklat arasında geçiş yapmak ve uygun düğme görüntüsünü çizmek için Duraklatılmış özelliği vardır. Yani Player.Rate'i kontrol etmek yerine, düğmenin Duraklatılmış özelliğinin yanlış olup olmadığını görmek istiyorum:

            public void BeginSessionInterruption()
            {
                 PlayerWasRunningOnInterruption = !btnPlay.Paused;
                 TogglePlayPause( true );  // put the Play button into the Paused state to agree with the player being stopped
            }

            public void ResumeAfterSessionInterruption()
            {
                NSError error;
                AppDelegate.AudioSession.SetActive( true, AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation, out error );  // always reactivate the audio session

                if ( PlayerWasRunningOnInterruption )
                {
// rewind a little bit
// call btnPlayClick to resume the playback as if the user pressed the Play button
                }
            }

2
2017-07-10 04:53





sadece arama durumunu algılarsanız kullanabilirsiniz CTCallCenterAncak, kesintiyi tespit etmek istiyorsanız (arama kesintisini de dahil edin) AVAudioSessionInterruptionNotificationve arka planı desteklemek istiyorsanız, aşağıdaki gibi kod eklemelisiniz:

  [[AVAudioSession sharedInstance] setActive:YES error:nil];
  [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

background.hope müzik çalmaya devam etmeden önce bu yardımcı olabilir.


0
2018-05-27 05:13





Sadece iki seçenek benim için çalışıyor:

  1. Tekrar yükle AVPlayer veya AVAudioPlayer kesintiden sonra

    func interruptionNotification(_ notification: Notification) {
    guard let type = notification.userInfo?[AVAudioSessionInterruptionTypeKey] as? UInt,
      let interruption = AVAudioSessionInterruptionType(rawValue: type) else {
        return
    }
    if interruption == .ended && playerWasPlayingBeforeInterruption {
      player.replaceCurrentItem(with: AVPlayerItem(url: radioStation.url))
      play()
    }
    

    }

  2. kullanım

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: .mixWithOthers)


0
2018-04-19 18:40



ve ne zaman interruptionNotification () çağırır? - Max
İçin dinleyici ekle AVAudioSessionInterruptionNotification için NotificationCenter ile interruptionNotification fonksiyon - Vitaliy Gozhenko


Bakmak:

https://developer.apple.com/documentation/avfoundation/avaudiosession#//apple_ref/doc/uid/TP40008240-CH1-DontLinkElementID_3

https://developer.apple.com/documentation/avfoundation/avaudiosession/responding_to_audio_session_interruptions

Kod:

private func setupAudioSession() {
    do {

        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: .mixWithOthers)
        try AVAudioSession.sharedInstance().setActive(true)

        setupAudioNotifications()

    } catch {
        print(error)
    }
}

private func setupAudioNotifications() {
    NotificationCenter.default.addObserver(self, selector: #selector(handleInterruption), name: .AVAudioSessionInterruption, object: nil)
}

@objc func handleInterruption(notification: Notification) {

    guard let userInfo = notification.userInfo,
        let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt,
        let type = AVAudioSessionInterruptionType(rawValue: typeValue) else {
            return
    }

    if type == .began {
        // Interruption began, take appropriate actions
        Player.shared.stop()

    } else if type == .ended {
        if let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt {
            let options = AVAudioSessionInterruptionOptions(rawValue: optionsValue)
            if options.contains(.shouldResume) {
                // Interruption Ended - playback should resume
                Player.shared.start()
            } else {
                // Interruption Ended - playback should NOT resume
            }
        }
    }
}

0
2018-06-14 15:18