2013-10-16 7 views
6

Ich habe meine VoIP-Anwendung vor kurzem auf iOS7 migriert, und es gibt noch einen offenen Bug, den ich nicht verstehen kann.Kann die Lautstärketaste nicht verwenden, um auf iOS7 zu stummschalten

Wenn Sie in VoIP anrufen, können Sie in iOS6 die Taste für die physische Lautstärke drücken, um die Lautstärke auf Null zu senken.

Jetzt, in iOS7, kann ich den Ton nur bis zum letzten Schritt vor Null absenken, was bedeutet, dass die Lautstärke nicht stummgeschaltet werden kann.

Ich vermute, das ist etwas, das auf iOS7 Seite ist, da ich nicht das Problem mit der gleichen IPA auf einem iOS6-Gerät habe.

Jeder weiß, was los ist?

+0

Funktioniert der Stummschalter? –

+1

Ich habe das gleiche Problem in meiner App. Der Mute-Schalter hat keine Wirkung. Wenn die App Multitasking ermöglicht, können Sie beim Multitasking auch nicht stummschalten. Ich wünschte, ich könnte das Problem beheben. – Doc

+0

was ist die Version von ios7 verwendet Sie .. – codercat

Antwort

2

gleiche Problem mit meinem VoIP-App ...

Meine Lösung: Nachdem alles eingerichtet ist, stellen Sie die Kategorie Wiedergabe,

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

es dann zu PlayAndRecord, zurück

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 

Dies funktioniert für mich, hoffe, dass dies jemand hilft, der das gleiche Problem auftritt.

+0

Das hat das Problem auch auf meiner Seite behoben. Vielen Dank. Für diejenigen, die interessiert sind, sollten Sie dies tun! – Gui13

+0

Zukünftige SO-Browser werden gewarnt: Dieser Ansatz deaktiviert alle VoiceProcessingIO (vpio) -Audiogerätekonfigurationen in iOS 9, indem Sie auf RemoteIO umschalten, wenn Sie die Nur-Wiedergabe-Kategorie festlegen: RemoteIO ermöglicht das Stummschalten über die Maustasten, aber vpio ist die Onboard-AEC . Bei VoIP-Apps kann diese Problemumgehung unerwünschte Folgen haben. – wobbals

2

Sie haben applicationMusicPlayer zu verwenden, anstatt iPodMusicPlayer wird die Lautstärke eingestellt:

#import <MediaPlayer/MediaPlayer.h> 
musicPlayer = [MPMusicPlayerController applicationMusicPlayer]; 
musicPlayer.volume = 1; // max volume 
musicPlayer.volume = 0; // min volume (mute) 
musicPlayer.volume = 0.0625; // 1 bar on the overlay volume display 

Apple davon aus, dass sie jede Art und Weise kennt, in dem ein Volumen verabreicht werden muß.

Es gibt tatsächlich Fälle, in denen wir die Steuerung der Lautstärke ändern möchten, ohne den Benutzer zu zwingen, einen Lautstärkeregler auf dem Bildschirm zu haben (Wecker und Mediaplayer fallen sofort ein). yuou kann

https://developer.apple.com/library/ios/documentation/mediaplayer/reference/MPVolumeView_Class/Reference/Reference.html

http://ios-blog.co.uk/tutorials/controlling-system-output-volume-with-the-mpvolumeview-class-part-one/

+0

Wir verwenden keine Art von Kontrolle in unserer App, alle Lautstärkeinteraktion basiert auf Lautstärketasten. Also könnte ich das vielleicht implementieren, aber ich würde einen Weg brauchen, um es an die Lautstärketasten zu binden. Ist das möglich? – Gui13

+0

Ich gebe Ihnen das Kopfgeld, da dies einer Lösung, die ich gesehen habe, am nächsten kommt. Aber das ist nicht die Lösung, nach der ich gesucht habe. – Gui13

3

Ein bisschen alte Frage nehmen verweisen, aber ich brauchte auch eine Lösung für Gui13 Frage/Kommentar:

Wir sind nicht irgendeine Art mit der Kontrolle in unserer App, alle Volume-Interaktion basiert auf Lautstärketasten .. Also könnte ich vielleicht dies implementieren, aber ich würde eine Möglichkeit, um es mit den Lautstärketasten zu binden. Ist das möglich?

Apple empfiehlt MPVolumeView verwenden, so kam ich mit auf den Punkt:

MPVolumeView *volumeView = [MPVolumeView new]; 
[self.view addSubview:volumeView]; 

und dann:

__block UISlider *volumeSlider = nil; 
[[volumeView subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if ([obj isKindOfClass:[UISlider class]]) { 
     volumeSlider = obj; 
     *stop = YES; 
    } 
}]; 
[volumeSlider addTarget:self action:@selector(handleVolumeChanged:) forControlEvents:UIControlEventValueChanged]; 

mit:

- (void)handleVolumeChanged:(id)sender 
{ 
    NSLog(@"%s - %f", __PRETTY_FUNCTION__, ((UISlider *)sender).value); 
} 

Der [MPVolumeView new] Code über inits MPVolumeView w Wenn es keinen Rahmen gibt, ist es in unserer self.view nicht sichtbar, wo es als Subview hinzugefügt wurde, aber es ist wichtig, dass es hinzugefügt werden muss!

Sie können auch die MPVolumeView mit dem Code init:

MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:self.view.frame]; 
volumeView.showsRouteButton = NO; 
volumeView.showsVolumeSlider = NO; 
[self.view addSubview:volumeView]; 

die auch die leere MPVolumeView (das heißt ohne RouteButton und volume) wird init.

Was interessant ist, dass UISlider subview (eigentlich MPVolumeSlider, die Unterklasse von UISlider) wird nach wie vor in den obigen enumerateObjectsUsingBlock finden.

Dieser Ansatz ist auch deshalb interessant, weil Sie es den Verweis auf volumeSlider und verwenden später Volumen von Code einzustellen speichern kann, oder das benutzerdefinierte Steuerelement:

Init und zu Ihrer Ansicht hinzuzufügen:

MPVolumeView *volumeView = [MPVolumeView new]; 
volumeView.showsRouteButton = NO; 
volumeView.showsVolumeSlider = NO; 
[self.view addSubview:volumeView]; 

Suchen und speichern Bezug auf UISlider:

__weak __typeof(self)weakSelf = self; 
[[volumeView subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if ([obj isKindOfClass:[UISlider class]]) { 
     __strong __typeof(weakSelf)strongSelf = weakSelf; 
     strongSelf.volumeSlider = obj; 
     *stop = YES; 
    } 
}]; 

Add Zielaktion für UIControlEventValueChanged:

[self.volumeSlider addTarget:self action:@selector(handleVolumeChanged:) forControlEvents:UIControlEventValueChanged]; 

Und dann aktualisieren Sie Ihr benutzerdefiniertes Steuerelement, wenn das Volumen geändert wurde (d. H. von dem Hardware-Lautstärkeregler):

- (void)handleVolumeChanged:(id)sender 
{ 
    NSLog(@"%s - %f", __PRETTY_FUNCTION__, self.volumeSlider.value); 
    self.myCustomVolumeSliderView.value = self.volumeSlider.value; 
} 

und auch:

- (IBAction)myCustomVolumeSliderViewValueChanged:(id)sender { 
    NSLog(@"set volume to: %f", self.myCustomVolumeSliderView.value); 
    self.volumeSlider.value = self.myCustomVolumeSliderView.value; 
} 

hoffte, das hilft jemand (und dass Apple nicht entfernt MPVolumeSlider von MPVolumeView).

+0

Das ist einfach genial, Mann. Danke für das Heads-up. – Gui13