2010-11-28 4 views
54

私は非ネイティブサウンドフォーマットのオーディオプレーヤーを構築しています。アプリケーションの階層はiPod.appに基づいています。それはUITableViewの数と、ユーザが画面上の音量を変更できるようにMPVolumeViewを使用するUIViewTrackView)の番号を持っています。初めてTrackViewが表示されるまで、ハードウェアボタンを使用して音量を変更すると、システムボリュームのオーバーレイが期待どおり(必要に応じて)表示されます。 TrackViewが表示されている場合、これらのオーバーレイは、ハードウェアボタンを使用してボリュームを変更するとき(希望する場合)、MPVolumeViewの更新が表示されないため表示されません。MPVolumeViewを使用した後、システムボリュームオーバーレイを再びオンにするにはどうすればよいですか?

ここで問題があります:TrackViewから戻ってしまうと、ハードウェア音量ボタンを使用しているときにシステム音量オーバーレイが表示されません。私は、MPVolumeViewをプログラムで割り当て、作成して追加して、TrackViewController viewWillAppear:に入れてから、に同じMPVolumeViewを削除し、解放しないようにしました。

これは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に接続します。

+0

は、iOS 4.1を実行して触れます。 iOS 3.2のiPadで動作している同じアプリケーションでこの問題が発生することはありません。私は今iPod touchをiOS 4.2にアップデートして、問題が修正されたかどうかを確認しています。 (いずれにしても、4.1のiPod.appはこの動作を示さないので、まだ解決策を探しています。) –

+0

問題はiOS 4.2で修正されているようですが、誰かが以前のバージョンの解決策を持っていれば、まだ興味があります。 –

+0

4.2.1で同様の問題が発生していますが、MPVolumeViewが常に表示されているとは限りませんが、画面上のタップに応答して表示され、非表示になっています。トラックビューの最初の読み込み時にボリュームビューが表示されず、ボリュームボタンの変更に応じてシステムボリュームオーバーレイが表示されます。 MPVolumeViewが表示されると、ビューがビューから削除されて再度追加されるまで、ボリュームオーバーレイは表示されなくなります(MPVolumeViewがその後非表示になっているかどうかに関係なく)。 – prendio2

答えて

1

これは、悲しいことに、以前のバージョンのiOSのプライベートフレームワークの問題です。

これを解決することを希望しますが、コードがプライベートフレームワークを操作してアプリが承認を通過できなくなる可能性があります。

幸いにも、このエラーのあったバージョンスパンは短く、これらのバージョンで流通しているデバイスの数は分単位で増えています。あなたが好きな、プログラムによって、デバイスの音量を増減することができます

0

:これは、iPod上の問題のように見える

- (void)setVolume:(float)Level 
{ 

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

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

} 
関連する問題