programing

MPVolumeView를 사용한 후 시스템 볼륨 오버레이를 다시 켜려면 어떻게합니까?

kingscode 2021. 1. 16. 10:01
반응형

MPVolumeView를 사용한 후 시스템 볼륨 오버레이를 다시 켜려면 어떻게합니까?


네이티브가 아닌 사운드 형식을위한 오디오 플레이어를 만들고 있습니다. 응용 프로그램의 계층 구조는 iPod.app을 기반으로합니다. 사용자가 화면에서 볼륨을 변경할 수 있도록를 사용하는 UITableView개수 와 하나 UIView( TrackView)가 MPVolumeView있습니다. TrackView하드웨어 버튼을 사용하여 볼륨을 변경하는 것이 처음으로 보일 때까지 시스템 볼륨 오버레이가 예상대로 (그리고 원하는대로) 표시됩니다. TrackView가 표시 되면 MPVolumeView하드웨어 버튼 (원하는 경우)으로 볼륨을 변경할 때 업데이트 되므로 이러한 오버레이가 표시되지 않습니다 .

문제는 다음과 같습니다 TrackView. 시스템에서 다시 나오면 하드웨어 볼륨 버튼을 사용할 때 볼륨 오버레이가 나타나지 않습니다. I 프로그래밍, allocing 만들고 추가 시도 MPVolumeView에서 TrackViewController viewWillAppear:다음 제거 해제와 같은 무 - 보내고 MPVolumeView하여 TrackViewController viewWillDisappear:.

이것은 iPod.app에서는 발생하지 않습니다. MPVolumeView하드웨어 볼륨 버튼을 사용할 때 시스템 볼륨 오버레이 가 포함 된보기에서 뒤로 물러 나면 표시됩니다.

내가 무엇을 놓치고 있습니까?


업데이트 2 : 이것은 iOS 3.2 이후에 도입되어 4.2에서 수정 된 MPVolumeView의 버그로 보입니다.


업데이트 : 동일한 동작을 나타내는 기본 창 기반 응용 프로그램 프로젝트에서 간단히 축소했습니다. 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 프레임 워크를 추가하고 인터페이스 빌더에서 MainWindow.xib를 열어 UIView 및 UIButton IBOutlets를 추가하고 IBAction을 UIButton에 연결해야합니다.


이것은 슬프게도 이전 버전의 iOS에있는 개인 프레임 워크의 문제입니다.

이에 대한 해결책을 만들고자하는 것은 이해하지만 코드가 비공개 프레임 워크를 조작하여 앱이 승인을 통과하지 못하도록 만들 수 있습니다.

Fortunately, the version span that had this error is short, and the number of devices in circulation with these version are growing thinner by the minute.


You can increase and decrease device volume by programmatically like:

- (void)setVolume:(float)Level
{

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

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

}

ReferenceURL : https://stackoverflow.com/questions/4297176/how-do-i-turn-the-system-volume-overlay-back-on-after-using-mpvolumeview

반응형