如何在使用MPVolumeView后重新打开系统音量叠加?

54
我正在构建一个支持非本地音频格式的音频播放器。应用程序的层次结构是基于iPod.app的。它有许多UITableView和一个UIView(TrackView),该UIView使用MPVolumeView允许用户在屏幕上更改音量。在TrackView首次可见之前,使用硬件按钮更改音量会像预期(也希望如此)显示系统音量叠加图。当TrackView可见时,这些叠加图不会出现,因为使用硬件按钮更改音量时MPVolumeView会更新(也是所期望的)。
问题在于:一旦退出TrackView,在使用硬件音量按钮时系统音量叠加图不会显示。我尝试在TrackViewController的viewWillAppear:中编程分配、创建和添加MPVolumeView,然后在TrackViewController的viewWillDisappear中删除、释放和nil相同的MPVolumeView。
iPod.app中不会出现这种情况。一旦退出包含MPVolumeView的视图,使用硬件音量按钮时系统音量叠加图就会显示。
我错过了什么?
更新2:这似乎是一个MPVolumeView中的错误,在iOS 3.2之后引入,在4.2中修复。
更新:我从默认的基于窗口的应用程序项目制作了一个简单的减少,展示了相同的行为。一旦MPVolumeView变为可见状态,系统音量叠加图在应用程序中将永远不会出现。
VolumeAppDelegate.h:
#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>

@interface VolumeAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    IBOutlet UIView *volumeView;
    IBOutlet MPVolumeView *mpVolumeView;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;

-(IBAction)toggleVolumeView:(id)sender;

@end

VolumeAppDelegate.m:

#import "VolumeAppDelegate.h"

@implementation VolumeAppDelegate

@synthesize window;

-(IBAction)toggleVolumeView:(id)sender{

    if (mpVolumeView == nil){
        mpVolumeView = [[MPVolumeView alloc] initWithFrame:volumeView.bounds];
        [volumeView addSubview:mpVolumeView];
    }
    else{
        [mpVolumeView removeFromSuperview];
        [mpVolumeView release];
        mpVolumeView = nil;
    }
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    [self.window makeKeyAndVisible];
    mpVolumeView = nil;
    return YES;
}

- (void)dealloc {
    [window release];
    [super dealloc];
}

@end

你需要在Xcode中将MediaPlayer框架添加到项目中,并在Interface Builder中打开MainWindow.xib以添加UIView和UIButton IBOutlets,并将IBAction连接到UIButton上。


似乎这是在运行iOS 4.1的iPod touch上出现的问题。在我的iPad上运行的相同应用程序,使用的是iOS 3.2,不会出现此问题。我正在将我的一个iPod touch更新到iOS 4.2,以查看问题是否已得到解决。(无论如何,我仍在寻找解决方案,因为4.1上的iPod.app不会表现出这种行为。) - Shaun Inman
问题似乎在iOS 4.2中得到了解决,但如果有人有早期版本的解决方案,我仍然很感兴趣。 - Shaun Inman
我在4.2.1上遇到了类似的问题,我的MPVolumeView并不总是可见,但会在屏幕上轻触后显示和隐藏。当我的Track视图相当于你的视图首次加载时,音量视图不可见,并且系统音量叠加层会在响应音量按钮更改时显示。一旦MPVolumeView被显示,音量叠加层就不再出现(无论MPVolumeView是否随后被隐藏),直到该视图从视图中移除并再次添加。 - prendio2
2个回答

1

很遗憾,这是早期版本的iOS中私有框架存在的问题。

我理解您希望为此提供解决方案,但这将导致您的代码操作私有框架,使您的应用程序无法通过审核。

幸运的是,出现此错误的版本范围很短,而使用这些版本的设备数量正在逐渐减少。


0

您可以通过编程来增加和减少设备的音量,例如:

- (void)setVolume:(float)Level
{

   OSStatus errorMsg = AudioQueueSetParameter(audioQueue, kAudioQueueParam_Volume, Level);

   if (errorMsg) {
      NSLog(@"%d", errorMsg);
   }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接