Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to change device Volume on iOS - not music volume

I want to change the device volume on iOS (iphone).

I know that i can change the volume of music library with this lines below:

//implement at first MediaPlayer framework
MPMusicPlayerController *musicPlayer = [MPMusicPlayerController iPodMusicPlayer];
musicPlayer.volume = 1;

But thats not my aim.
I want to change the device volume or let me say the volume of ringer.

How can i do that? just change the DEVICE volume?

like image 385
brush51 Avatar asked Apr 23 '12 19:04

brush51


1 Answers

To answer brush51's question:

How can i do that? just change the DEVICE volume?

As 0x7fffffff suggested:

You cannot change device volume programatically, however MPVolumeView (volume slider) is there to change device volume but only through user interaction.

So, Apple recommends using MPVolumeView, so I came up with this:

Add volumeSlider property:

@property (nonatomic, strong) UISlider *volumeSlider;

Init MPVolumeView and add somewhere to your view (can be hidden, without frame, or empty because of showsRouteButton = NO and showsVolumeSlider = NO):

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

Find and save reference to 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 target action for UIControlEventValueChanged:

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

And then detect volume changing (i.e. by the hardware volume controls):

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

and also other way around, you can set volume by:

self.volumeSlider.value = < some value between 0.0f and 1.0f >;

Hope this helps (and that Apple doesn't remove MPVolumeSlider from MPVolumeView).

like image 70
msrdjan Avatar answered Sep 20 '22 17:09

msrdjan