在iOS7上无法使用音量按钮静音

时间:2013-10-16 13:33:50

标签: ios ios7 mute

我最近将我的VoIP应用程序迁移到了iOS7,还有一个我仍然无法理解的漏洞。

在VoIP通话中,在iOS6中,您可以按物理音量按钮降低音量,降至零。

现在,在iOS7中,我可以将声音降低到零之前的最后一步,这意味着音量无法静音。

我怀疑这是iOS7方面的问题,因为我在iOS6设备上没有相同IPA的问题。

有人知道发生了什么事吗?

3 个答案:

答案 0 :(得分:3)

有点老问题,但我也需要Gui13的问题/评论的解决方案:

  

我们的应用程序中没有使用任何类型的控件,所有音量交互都基于音量按钮。所以我可以实现这个但是我需要一种方法将它与音量按钮联系起来。这可能吗?

Apple建议使用MPVolumeView,所以我想出了这个:

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

然后:

__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];

使用:

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

上面的[MPVolumeView new]代码在MPVolumeView没有框架,因此在我们self.view中不可见,它已被添加为子视图,但重要的是它必须是加入!

您还可以使用以下代码初始化MPVolumeView

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

也将初始化空MPVolumeView(即没有RouteButton和VolumeSlider)。

有趣的是,UISlider子视图(实际为MPVolumeSliderUISlider的子类)仍会在上面的enumerateObjectsUsingBlock中找到。

这种方法也很有趣,因为您可以将引用保存到volumeSlider并稍后使用它来设置代码或自定义控件的音量:

初始化并添加到您的视图中:

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

查找并保存对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;
    }
}];

UIControlEventValueChanged添加目标操作:

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

然后在更改卷时(即通过硬件音量控件)更新自定义控件:

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

还有:

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

希望这可以帮助某人(并且Apple不会从MPVolumeView中移除MPVolumeSlider)。

答案 1 :(得分:2)

您必须使用applicationMusicPlayer而不是iPodMusicPlayer来设置系统音量:

#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假设他们知道需要管理卷的每一种方式。

事实上,在我们想要改变音量控制方式而不强迫用户在屏幕上显示音量滑块的情况下(闹钟和媒体播放器会立即浮现在脑海中)。 你可以参考

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/

答案 2 :(得分:2)

与我的VoIP应用程序相同的问题...

我的解决方案: 设置完所有内容后,将类别设置为“播放”,

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

然后将其设置回PlayAndRecord,

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

这对我有用,希望这可以帮助遇到同样问题的人。