2008-10-18 10 views
6

Niektóre aplikacje iPhone, takie jak Pandora, wydają się bezpośrednio manipulować głośnością sprzętu i reagować na przycisk głośności fizycznej. Jak to się robi?Jak ustawić głośność sprzętu w aplikacji na iPhone'a?

Usługa AudioSessionServices pozwala uzyskać bieżący sprzętowy wolumin wyjściowy z właściwością kAudioSessionProperty_CurrentHardwareOutputVolume, ale jest (rzekomo) tylko do odczytu.

Odpowiedz

7

Używają one MPVolumeView, proste dodają go, a on robi resztę, gdy użytkownik go dotknie. Uwaga: nie działa w symulatorze iPhone'a. Wydaje mi się, że wspomniana uwaga do wydania nie używa jej bezpośrednio w programie Interface Builder.

MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(25, 378, 270, 30)]; 
[self.view addSubview:volumeView]; 
[volumeView release]; 
+0

[MPVolumeView Class Reference] (http://developer.apple.com /library/ios/#documentation/MediaPlayer/Reference/MPVolumeView_Class/Reference/Reference.html) – JohnK

6

Oto kolejny (kompletne) Przykład ustawienia głośności sprzętową i odzyskiwanie głośności po naciśnięciu klawiszy sprzętowych:

// AVAudiosession Delegate Method 
- (void)endInterruptionWithFlags:(NSUInteger)flags 
{ 
    // When interruption ends - set the apps audio session active again 
    [[AVAudioSession sharedInstance] setActive:YES error:nil]; 

    if(flags == AVAudioSessionInterruptionFlags_ShouldResume) { 
     // Resume playback of song here!!! 
    } 
} 

// Hardware Button Volume Callback 
void audioVolumeChangeListenerCallback (
             void      *inUserData, 
             AudioSessionPropertyID inID, 
             UInt32     inDataSize, 
             const void    *inData) 
{ 
    UISlider * volumeSlider = (__bridge UISlider *) inUserData; 
    Float32 newGain = *(Float32 *)inData; 
    [volumeSlider setValue:newGain animated:YES]; 
} 

// My UISlider Did Change Callback 
- (IBAction)volChanged:(id)sender 
{ 
    CGFloat oldVolume = [[MPMusicPlayerController applicationMusicPlayer] volume]; 
    CGFloat newVolume = ((UISlider*)sender).value; 

    // Don't change the volume EVERYTIME but in discrete steps. 
    // Performance will say "THANK YOU" 
    if(fabsf(newVolume - oldVolume) > 0.05 || newVolume == 0 || newVolume == 1 ) 
     [[MPMusicPlayerController applicationMusicPlayer] setVolume:newVolume]; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    // Set the volume slider to the correct value on appearance of the view 
    volSlider.value = [[MPMusicPlayerController applicationMusicPlayer] volume]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

    // Activate the session and set teh delegate 
    [[AVAudioSession sharedInstance] setActive:YES error:nil]; 
    [[AVAudioSession sharedInstance] setDelegate:self]; 

    // Create a customizable slider and add it to the view 
    volSlider = [[UISlider alloc] init]; 
    CGRect sliderRect = volSlider.frame; 
    sliderRect.origin.y = 50; 
    sliderRect.size.width = self.view.bounds.size.width; 
    volSlider.frame = sliderRect; 
    [volSlider addTarget:self action:@selector(volChanged:) forControlEvents:UIControlEventValueChanged]; 
    [self.view addSubview:volSlider]; 

    // Regoister the callback to receive notifications from the hardware buttons 
    AudioSessionAddPropertyListener (
                   kAudioSessionProperty_CurrentHardwareOutputVolume , 
                   audioVolumeChangeListenerCallback, 
                   (__bridge void*)volSlider 
                   ); 

    [...] 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 

    // Remove the Hardware-Button-Listener 
    AudioSessionRemovePropertyListenerWithUserData(
      kAudioSessionProperty_CurrentHardwareOutputVolume, 
      audioVolumeChangeListenerCallback, 
      (__bridge void*)volSlider); 
} 
+0

Wspaniała odpowiedź :-) – Flori