iPhone'umda, telefon görüşmesi sırasında kulağınıza bastığınız üst hoparlörde çalmak için uygulamamda ses almaya çalışıyorum. Mümkün olduğunu biliyorum, çünkü telefon görüşmelerini taklit eden ve tam olarak bunu yapan App Store'dan ("The Heist") "musluk musluğuna" basarak oynadım.Sesi üst (telefon görüşmesi) hoparlörden çalma
online çok araştırma yaptık ama ben olasılığını da gündeme bile olan herkes bulma şaşırtıcı derecede zor anlar yaşıyorum. mesajların büyük çoğunluğu oldukça handsfree hoparlör vs üst "telefon" hoparlör yerine, (this ve this ve this gibi), prize takılı olan kulaklık vs handsfree hoparlör hakkında görünmektedir. (Bu sorunun bir kısmı, bunun için iyi bir isim içermiyor olabilir: "telefon hoparlörü", genellikle cihazın alt kısmındaki ahizesiz hoparlörü ifade eder, bu yüzden gerçekten iyi hedeflenmiş bir arama yapmak zordur). Apple'ın Audio Session Category Route Overrides
'unu inceledim ama yine de (yanlışsam beni düzelt), sadece telefonun üst kısmındaki hoparlör değil, alt kısımdaki handsfree hoparlörle ilgileniyor.
Bu konuda gibi görünüyor BİR yazı bulduk: link. Hatta bir sürü kod sağlar, bu yüzden evde özgür olduğumu düşünmüştüm, ama şimdi kodun işe yaramayacağını düşünüyorum. Kolaylık olması açısından Sadece işe yarayıp yaramayacağını görmek benim viewDidLoad
içine (Anladığım eğer doğru üst hoparlöre ses yeniden yönlendirmek biri olmalıdır) DisableSpeakerPhone
yöntemi kopyalanamaz, ancak ilk "assert" satırı başarısız olur ve ses altını oynatmaya devam ediyor. (Ben de yorumlarda önerildiği gibi AudioToolbox Framework'ü de içe aktardım, bu yüzden sorun değil.)
Çalıştığım kodun ana bloğu burada (test etmek için viewDidLoad
benim kopyalandığım şey budur) makalesinde birkaç yöntem vardır rağmen), ben bağlantılı etmek: can kimse ya A) veya, bu kod çalışmıyor bana neden anlamaya yardımcı B:
void DisableSpeakerPhone() {
UInt32 dataSize = sizeof(CFStringRef);
CFStringRef currentRoute = NULL;
OSStatus result = noErr;
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &dataSize, ¤tRoute);
// Set the category to use the speakers and microphone.
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
result = AudioSessionSetProperty (
kAudioSessionProperty_AudioCategory,
sizeof (sessionCategory),
&sessionCategory
);
assert(result == kAudioSessionNoError);
Float64 sampleRate = 44100.0;
dataSize = sizeof(sampleRate);
result = AudioSessionSetProperty (
kAudioSessionProperty_PreferredHardwareSampleRate,
dataSize,
&sampleRate
);
assert(result == kAudioSessionNoError);
// Default to speakerphone if a headset isn't plugged in.
// Overriding the output audio route
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;
dataSize = sizeof(audioRouteOverride);
AudioSessionSetProperty(
kAudioSessionProperty_OverrideAudioRoute,
dataSize,
&audioRouteOverride);
assert(result == kAudioSessionNoError);
AudioSessionSetActive(YES);
}
benim soru şudur) bir düğmeye basmak ve sesi üst hoparlöre yönlendirmek için daha iyi bir öneri sunacak mı?
PS daha ve iOS programlama daha aşina alıyorum ama bu AudioSessions ve bu tür, ayrıntıları ve kod örnekleri çok takdir böylece dünyasına ilk baskını olduğunu! Yardımın için teşekkürler!
GÜNCELLEME: "O Was" önerisi itibaren
(aşağıda) yukarıda alıntılanan kodu çıkarılıp değiştirdik: viewDidLoad
başında
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error:nil];
[[AVAudioSession sharedInstance] setActive: YES error:nil];
. Yine de çalışmıyor, (ki bununla ilgili olarak, sesin hala üstte alıcı yerine telefonun alt kısmındaki hoparlörden çıktığı anlamına geliyor). Görünüşe göre varsayılan davranış, alıcının sesini kendi başına göndermesi için AVAudioSessionCategoryPlayAndRecord
olmalıdır, bu yüzden bir şeyler hala yanlıştır.
Daha spesifik ne iPod müzik çalar üzerinden ses oynuyor bu kodla yapıyorum (başlatıldı sağ Ne değer için yukarıdaki AVAudioSession hatları viewDidLoad
yılında, sonra):
_musicPlayer = [MPMusicPlayerController iPodMusicPlayer];
ve medya için iPod Müzik Çalar bir MPMediaPickerController
içinden seçilmesi:
- (void) mediaPicker: (MPMediaPickerController *) mediaPicker didPickMediaItems: (MPMediaItemCollection *) mediaItemCollection {
if (mediaItemCollection) {
[_musicPlayer setQueueWithItemCollection: mediaItemCollection];
[_musicPlayer play];
}
[self dismissViewControllerAnimated:YES completion:nil];
}
bunlar bana oldukça basittir görünüyor, ben hiçbir hata veya uyarılar var ve ben Medya Seçici ve Müzik Çalar doğru çalıştığını biliyoruz becaus Doğru şarkılar çalmaya başlar, sadece yanlış konuşmacıdan çıkar. "Bu AudioSession'ı kullanarak medya oynat" yöntemi veya başka bir şey olabilir mi? Ya da herhangi bir şeyin geri değiştirilip değiştirilemeyeceğini doğrulamak için hangi ses oturum kategorisinin aktif olduğunu kontrol etmenin bir yolu var mı? Bunu yapmak için varsayılan değere güvenmek yerine, kodu alıcıyı KULLANIMI için kesin olarak söylemenin bir yolu var mı? Bir yardında gibiyim ... Ben sadece bu son bit geçmeleri için gereken, hissetmek
DÜZENLEME: Ben sadece bir teori düşünce, bu kokan iPod müzik çalar hakkında bir şey burada Alıcıdan dışarı oynamak istiyorum. Benim mantığım: resmi iPod uygulaması ile oynamaya başlamak için bir şarkı ayarlamak ve sonra geliştirdiğim uygulama üzerinden sorunsuz bir şekilde ayarlamak (duraklatmak, atlamak, vb) mümkündür. Bir uygulamadan diğerine sürekli çalma, belki de iPod Müzik Çalar'ın kendi ses yolu ayarlarına sahip olduğunu düşündü, yoksa belki de yeni uygulamada ayarları kontrol etmek için durmuyor mu? Ne hakkında konuştuklarını bilen biri bunun böyle bir şey olabileceğini düşünüyor mu?
çalıştı sadece iddia nuking ve ne olur görme? – Undo
Onlara her şeyi açıklayın, ve orada hiç kod yok gibidir: ses, alt hoparlörden geçer. Sanırım, iddiaların başarısız olmasına neden olan aynı sorun yüzünden, bunun ne olabileceğini bilecek kadar tecrübeli değilim. – Nerrolken
Ben de değilim ... İyi şanslar! – Undo