Подтвердить что ты не робот

Как включить оверлей объема системы после использования MPVolumeView?

Я создаю аудиоплеер для неродного звукового формата. Иерархия приложений основана на iPod.app. Он имеет число UITableView и один UIView (TrackView), который использует MPVolumeView, чтобы позволить пользователю изменять громкость на экране. До появления первого раза TrackView изменение громкости с помощью аппаратных кнопок отображает оверлей громкости системы, как и ожидалось (и желательно). Когда видна TrackView, эти оверлеи не появляются, поскольку обновления MPVolumeView обновляются при изменении громкости с помощью аппаратных кнопок (также желательно).

Здесь проблема: после выхода из TrackView оверлей системных томов не появляется при использовании кнопок аппаратного уровня громкости. Я пробовал программно распределять, создавать и добавлять MPVolumeView в TrackViewController viewWillAppear:, а затем удалять, освобождать и ноль того же MPVolumeView в TrackViewController viewWillDisappear:.

Это не происходит в 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

Вам нужно добавить среду MediaPlayer в свой проект в Xcode и открыть MainWindow.xib в построителе интерфейса, чтобы добавить IBOutlets UIView и UIButton и подключить IBAction к UIButton.

4b9b3361

Ответ 1

Это, к сожалению, проблема с частной инфраструктурой в более ранних версиях iOS.

Я понимаю ваше желание сделать это для решения, но это заставит ваш код манипулировать частной картой, чтобы ваше приложение не могло пройти утверждение.

К счастью, диапазон версий, который имел эту ошибку, короток, и количество устройств, находящихся в обращении с этой версией, растет с каждым минусом.

Ответ 2

Вы можете увеличить и уменьшить объем устройства программно, например:

- (void)setVolume:(float)Level
{

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

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

}