Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.
0 oy
1.8k kez görüntülendi
ios development kategorisinde tarafından
Şimdi tuhaf bir sorunla karşılaştım. Cihazın sessize alma tuşunu kullanarak cihazı sessize alıyorum. Sonra uygulamayı başlatıyorum. Uygulamada bir ses çalıyor ViewController içerisinde. Ama cihaz slient modda olmasına rağmen çalıyor. Bunun için nasıl bir kontrol sağlamalıyım?

İstiyorum ki, cihaz slient moddaysa uygulama içerisindeki sesler hiç çalmasın. Umarım anlatabilmişimdir.

1 cevap

+1 oy
tarafından

uygulama içerisinde çalan ses dosyalarının interruption'larda (arama gelmesi gibi mesela) veya cihazın sessize alınması veyahut arka planda çalışan ve ses dosyalarını oynatan başka uygulamalarla koordineli bir şekilde çalışabilmesini sağlamak için (müzik veya radyo uygulamaları gibi) uygulamanızın appdelegate dosyası içerisinde AVAudioSession handle etmeniz gerekiyor.

tarafından
Üstadım teşekkür ederim. Önceden sizin paylaştığınız AudioSessionHandle örneği vardı. Ben o örnekteki gibi,  müzik çaldığım VC içerisinde bu bahsettiğiniz interruption handle olayını yapmıştım.

Şimdi tam olarak anlayamadığım, ses oynattığımız View Controller içerisindeki bu audioSessionInterruption fonksiyonunu  AppDelegate'e mi taşıyacağım?
tarafından
hmm evet baktım o örneğe şimdi ama bahsettiğim şeyi orada yapmamışım. Kafanızı karıştırmasın o örnek. Zira o örnekte de dikkat ederseniz cihazı sessize alsanız dahi ses çıkmaya devam ediyor. O farklı bir şey.

benim bahsettiğim durumda uygulamanın appdelegate dosyası içerisinde uygulamanın ses çıkaran diğer uygulamalar ve cihaz intteruption'larıyla nasıl bir etkileşime gireceğini belirliyorsunuz. aşağıda bir appdelegate örneği veriyorum ama test etmedim bir deneyin.

https://drive.google.com/file/d/0B_33To7xgYO7a0RlLTVpcWdZRkE/view?usp=sharing
tarafından
Üstadım ilginiz için sonsuz teşekkür ederim. Google Drive Link sanırım paylaşım izni gerektiriyor. Tıklayınca şöyle diyor bana:

İzne ihtiyacınız var

Erişim mi istiyorsunuz? Sahibinden erişim isteyin veya izne sahip bir hesaba geçin.
tarafından
oww pardon. düzelttim şimdi bir deneyin.
tarafından
Üstadım sağolun. Şimdi indirdim. İnceliyorum.
tarafından
Üstadım, slient mode konusunda sağlıklı çalışıyor. Yalnız karşılaştığım bir sorun var:
Mesela benim uygulamamda çaldığım müzik background mode halinde de çalabiliyor ama şimdi bu AppDelegate ile uygulama arkaplana gidince ses kesiliyor. Müzik duruyor. Bu sorunu nasıl aşabilirim?
tarafından
projenizde capabilities/background modes alanında Audio and Airplay  kutucuğunu işaretleyin.
tarafından
ha birde,
appdelegate içerisinde
applicationWillResignActive, applicationDidEnterBackground ve applicationWillEnterForeground içerisinde yer alan
activateAudioSession() ve deactivateAudioSession() metodlarını kaldırın.
tarafından
Sağolun ilginiz için. O seçenek işaretli; ama sanırım ben başka bir yerde hata yapıyorum. Sizin gönderdiğiniz AppDelegate'i Swift 2 için güncelledim *. Sizinle paylaşıyorum. Acaba bir hata mı yapmışım?

Uygulama arkaplana düşünce şu hatayı vererek müzik kesiliyor:
ERROR:    [0x3b61c000] AVAudioSession.mm:697: -[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.
Error Domain=NSOSStatusErrorDomain Code=560030580 "(null)"

* Düzenlediğim Sizin AppDelegate Dosyası:
https://gist.github.com/burhanaksendir/6e391b4b4bfcb5f510dc
tarafından
şu en son dediğimi denedinizmi, gözden kaçırdınız herhalde en son yorumumu.
activateAudioSession() ve deactivateAudioSession()'ları kaldırın.
tarafından
Hım, şimdi gördüm evet. Hemen deniyorum.
tarafından
Denedim. Bu sefer hata mesajı kayboldu. Ama ilginç bir şekilde, bakcgrounda gidince ses kesiliyor. Acaba düzenlediğim şu fonksiyonlarda mı hata yaptım:

startAudio()
activateAudioSession()
deactivateAudioSession()
tarafından
application: didFinishLaunchingWithOptions içerisindeki  startAudio()'yu kaldırmayın.

sadece applicationWillResignActive, applicationDidEnterBackground ve applicationWillEnterForeground içerisinde yer alan
activateAudioSession() ve deactivateAudioSession() metodlarını kaldırın.
tarafından
Aynen söylediğiniz gibi yaptım. Ama backgrounda alınca ses gidiyor.
tarafından
Hmm. Şu an bilgisayar başında değilim. Yarın ilk fırsatta kendim bi proje oluşturup test edeyim.
tarafından
Çok teşekkür ederim üstadım. Hakkınız ödenmez.
tarafından
Üstadım bu arada,
 startAudio() içerisindeki
try audioSession.setCategory(AVAudioSessionCategoryAmbient)
kısmını
try audioSession.setCategory(AVAudioSessionCategoryPlayback)
olarak değiştirince çalıştı ama bu sefer yine slient mode olayı bozuldu.
tarafından
Xcode 7.2 ile, iPhone 4S, iOS 9.2 üzerinde test ediyorum. Platformdan kaynaklanan bir hata olabilir mi?
tarafından
ohoo. tamamen aklımdan çıkmış. bugün bakacaktım bun probleme değilmi?
şimdi hemen bir test projesi hazırlıyorum. :)
tarafından
:) Teşekkür ederim. Eksik olma üstadım.
tarafından
hmm problemi şimdi daha iyi anladım. evet yapmak istediğiniz şu sanırım yanlış anladıysam düzeltin;

uygulama içerisinde bazı seslerin, cihaz sessize alındığında oynatılmasını istemiyorsunuz fakat aynı zamanda yine uygulama içerisinde çalınan bir müzik dosyasının uygulama arka plana gittiğinde dahi çalınabilir olmasını istiyorsunuz.
evet, bu başlıbaşına bir sorun. :)

çünkü AVAudioSession için category set ederken sizinde fark ettiğiniz üzere müziğin arkaplanda çalınabilmesi için AVAudioSessionCategoryPlayback opsiyonunu seçmek zorundayız.

ama bu durumda diğer ses dosyaları cihaz sessize alınsa dahi hala çalınabilir olacaklar.

bu durumda category opsiyonunu AVAudioSessionCategoryAmbient yapmak lazım fakat bu defa da uygulama background'a gittiğinde arkaplanda çalınmasını istediğiniz dosya çalınmayacak.

iş bir kısır döngüye giriyor. :)
çünkü sizinde farketmiş olabileceğiniz gibi AVAudioSession category'si bir sharedInstance. yani tüm audio işlemleri için sadece bir seçim yapılabilir.

bu durumda category seçimini AVAudioSessionCategoryPlayback olarak bırakıp,
uygulama içerisindeki bazı seslerin çalınmaması opsiyonunu cihazın sessize alma switch'i yerine kullanıcıya uygulama arayüzünde özel bir sessize alma butonu seçeneğiyle sunmak tek akılcı çözüm.

kullanıcı bu butona tıkladığında çalınmasını istemediğiniz seslere ait aksiyonları pasifize etmek ve halihazırda çalınmakta olan sesleri de stop() ile durduracak bir çözüm tek akıl karı yol gibi duruyor.

tabi kullanıcı sessize alma opsiyonunu kapattığında, opsiyonu açarken çalınmakta olan sesler varsa bunların kendiliğinden yeniden başlatılması gibi bir nüansı da kuracağınız yapıda atlamamalısınız.

Aksi takdirde sessize alma butonu aslında bir tür tüm sesleri durdurma butonu gibi bir işlev kazanacaktır ki , bu da kullanıcı deneyimi açısından olumsuz bir durum oluşmasına neden olabilir.
tarafından
Teşekkür ederim üstadım.

Uygulama içerisinde bir müzik oynatıcı var.  Uygulama arkaplana düşüyor. Müzik çalıyor. Kullanıcı müziğini dinliyor. Sonra kullanıcı aniden cihazını sessize alıyor. İstiyor ve umuyor ki her ne varsa  çalan bu slient tuşuna teslim olup saygı göstersin :) Ama olmuyor. Uygulamaya dönüp müzik playeri pause etmesi lazım.

Sizin de söylediğiniz gibi biraz kısır döngü oldu benim için. Herhalde  henüz iOS ortamında bulunmayan bir Slient mode beklentisine girmişim ben :))
tarafından
ios'un default müzik oynatıcısına bakın.
müzik arka planda çalınırken cihaz sessize alınsa dahi, müzik çalmaya devam eder.
kullanıcının ya kilit ekranından yahut müzik oynatıcısı içerisinden pause butonuna basması gerekir.
:)
tarafından
:) Doğru. Ama keşke benim hayal ettiğim gibi özellik olsaymış ne güzel olurdu.
Ben nasıl bu noktaya gelmişim, nasıl böyle bir beklentim oluşmuş :)  herhalde uykusuzluktan oldu.

Ama üstadım  çok faydalı oldu bir yandan. AVAudioSession olayını AppDelegate içerisinde handle etmek. Ben müzik oynatacağım  her  bir VC içinde ayrı ayrı yapıyordum bunları. En azından bundan faydalanmak bile güzel :)
...