6

Pandora などの一部の iPhone アプリケーションは、ハードウェアの音量を直接操作し、物理的な音量ボタンに反応するようです。これはどのように行われますか?

AudioSessionServices では、kAudioSessionProperty_CurrentHardwareOutputVolumeプロパティを使用して現在のハードウェア出力ボリュームを取得できますが、(伝えられるところでは) 読み取り専用です。

4

2 に答える 2

7

彼らはMPVolumeViewを使用し、それを追加するだけで、ユーザーが触れると残りが作成されます。注: iPhone シミュレーターでは機能しません。リリースノートにも記載されていると思いますが、Interface Builder で直接使用しないでください。

MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(25, 378, 270, 30)];
[self.view addSubview:volumeView];
[volumeView release];
于 2008-10-18T21:48:41.063 に答える
6

ハードウェア ボリュームを設定し、ハードウェア キーを押した後にボリュームを取得する別の (完全な) 例を次に示します。

// 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);
}
于 2012-02-29T21:39:15.943 に答える