Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iPhone Detect Volume Keys press.

I need to detect when the user presses the hardware volume keys, (App Store safe approach) I have tried a number of things with no luck. Do you know how to implement such functionality? At present I am registering for notifications, however they don't seem to get called. Here's my code:

  AudioSessionInitialize(NULL, NULL, NULL, NULL);
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self
                       selector:@selector(volumeChanged:) 
                           name:@"AVSystemController_SystemVolumeDidChangeNotification" 
                         object:nil];

And the receiver method is:

-(void)volumeChanged:(NSNotification *)notification{
         NSLog(@"YAY, VOLUME WAS CHANGED");}

Any tips would be greatly appreciated.

like image 749
John S Avatar asked Sep 23 '11 11:09

John S


People also ask

What happens if you press both volume buttons and power button on an iPhone?

To restart your iPhone, press and hold down the Power and Volume buttons until a slider appears on-screen. If restarting doesn't work, you can trigger a "force restart" by pressing Volume Up, Volume Down, and then Power.

How do I fix the volume control on my iPhone?

If you recently updated your iPhone and the volume buttons stopped working, try restarting your device by turning it off and on again. If this doesn't work and you did recently update your phone, you might need to reset your device. This means backing up your iPhone and erasing all the content settings.

How do I find the volume button press in flutter?

But for a workaround, we do have volume_watcher: ^2.0. 1, which gives a callback when the volume is changed. Note: Volume carries from 0 to 1, where 0 means no volume and 1 means max volume. Show activity on this post.


1 Answers

You need to start an audio session before the notification will fire:

AudioSessionInitialize(NULL, NULL, NULL, NULL); 
AudioSessionSetActive(true); 

Now you can subscribe to the notification:

[[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(volumeChanged:) 
    name:@"AVSystemController_SystemVolumeDidChangeNotification" 
    object:nil];

To get the volume:

float volume = [[[notification userInfo] 
    objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"] 
    floatValue];

You will need to store the volume and compare it to the previous value you got from a notification to know which button was pressed.

This solution will still adjust the system volume when the user presses the volume key, and show the volume overlay. If you want to avoid changing the system volume and showing the overlay (in essence completely repurpose the volume keys), see this answer

like image 61
Crake Avatar answered Nov 12 '22 11:11

Crake